Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bonelifer/6eb978c5f6837edbca0f9a3245429bdb to your computer and use it in GitHub Desktop.
Save bonelifer/6eb978c5f6837edbca0f9a3245429bdb to your computer and use it in GitHub Desktop.
A quick guide to manage laptop power usage with udev and systemd

Managing laptop power usage

Create systemd targets and services

Create AC target (/etc/systemd/system/ac.target):

[Unit]
Description=On AC power
DefaultDependencies=no
StopWhenUnneeded=yes

Create battery target (/etc/systemd/system/battery.target):

[Unit]
Description=On battery power
DefaultDependencies=no
StopWhenUnneeded=yes

Create services that depend on that targets. For battery (/etc/systemd/system/powersave.service):

[Unit]
Description=Laptop battery savings

[Service]
Type=oneshot
ExecStart=/usr/local/bin/powersave

[Install]
WantedBy=battery.target

For AC (/etc/systemd/system/powerfull.service):

[Unit]
Description=Laptop battery savings

[Service]
Type=oneshot
ExecStart=/usr/local/bin/powerfull

[Install]
WantedBy=ac.target

Enable services:

systemctl enable powerfull
systemctl enable powersave

Now it's time to create scripts run by services. For powersave service (/usr/local/bin/powersave):

#!/bin/bash
logger 'Running powersave script...'
echo 'auto' > '/sys/bus/pci/devices/0000:01:00.0/power/control'
echo 'min_power' > '/sys/class/scsi_host/host0/link_power_management_policy';
echo 'min_power' > '/sys/class/scsi_host/host1/link_power_management_policy';
echo 'min_power' > '/sys/class/scsi_host/host2/link_power_management_policy';
echo 'min_power' > '/sys/class/scsi_host/host3/link_power_management_policy';
echo 'min_power' > '/sys/class/scsi_host/host4/link_power_management_policy';
echo '1500' > '/proc/sys/vm/dirty_writeback_centisecs';
prime-select intel
echo 13080 > /sys/class/backlight/intel_backlight/brightness

You can tune these actions running powertop, it has a very interesting "Tunables" tab with plenty of optimization suggestions.

For powerfull (/usr/local/bin/powerfull):

#!/bin/bash
logger 'Running powerfull script...'
echo 84360 > /sys/class/backlight/intel_backlight/brightness

Give execution permissions to scripts (chmod +x ....)

Create udev rules

When AC cable status changes (plugged, unplugged) make udev run some commands. Create /etc/udev/rules.d/99-powertargets.rules with these contents:

SUBSYSTEM=="power_supply", KERNEL=="ADP1", ATTR{online}=="0", RUN+="/usr/bin/systemctl start battery.target"
SUBSYSTEM=="power_supply", KERNEL=="ADP1", ATTR{online}=="1", RUN+="/usr/bin/systemctl start ac.target"

ADP1 is the powersupply name. You can find this name doing:

udevadm monitor --environment

Now you can reload udev rules:

udevadm control --reload-rules

You can test with this:

sudo udevadm test /devices/LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:20/PNP0C09:00/ACPI0003:00/power_supply/ADP1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment