So, we’ve got a battery-powered laptop running Linux. We’re using it in the most straightforward way: listening to music, watching movies, occasionally writing blog posts, and browsing the web. We’re leaving out video editing and high-performance gaming—those typically require a wall outlet. Our goal is to maximize battery life.
Screen brightness
Let’s start with the backlight. On most laptops, the brightness hotkeys talk directly to the ACPI controller, so they work the same across operating systems and even in the BIOS setup. You can also control the display brightness with xbacklight. After installing it, just run the command
$ xbacklight -set 50
and the brightness level will be 50%.
To avoid fiddling with manual adjustments, you can set up automatic brightness control for when the laptop charger is plugged in and when it’s unplugged. For this, we’ll need a simple script:
#!/bin/sh
echo $1 > /sys/class/backlight/intel_backlight/brightness
Save it to the file / and make it executable:
$ chmod +x /etc/backlight.sh
We also need to write a udev rule that will trigger our script. Create the file /:
SUBSYSTEM=="power_supply", ENV{POWER_SUPPLY_ONLINE}=="1", RUN+="/etc/backlight.sh 3253"
SUBSYSTEM=="power_supply", ENV{POWER_SUPPLY_ONLINE}=="0", RUN+="/etc/backlight.sh 2324"
Next, reload the udev rules:
$ sudo udevadm control -R
Now, when you plug in the charger, the brightness will be set to 3253 (which is 70% of the maximum 4648), and when you unplug it, it will drop to 50% (2324). Note that the script only works with the Intel driver; for other adapters, the path under / and the values will be different.
Another nice touch is that it fixes a common issue for Linux users where the screen brightness gets reset to maximum whenever you plug in or unplug the power adapter.
Graphics Card
It’s estimated that we take in at least 80% of information through vision. No surprise, then, that a significant share of a laptop’s battery is spent rendering the image on the screen.
Using lightweight desktop environments that consume minimal laptop resources helps extend battery life. Sure, you can work from the command line, but in the 21st century there aren’t many fans of that.
Sometimes simply turning off desktop visual effects is enough; use the freed-up resources in applications that support hardware-accelerated video decoding to take load off the CPU. It also helps to disable unnecessary background services, such as file indexing.
Hardware acceleration lets you offload video decoding from the CPU to the GPU. VLC, MPV, MPlayer and players built on them, as well as Chromium, Firefox, and Opera, support this, reducing power consumption.

To check whether hardware acceleration is enabled in Chrome, enter chrome://gpu in the address bar. In my case, the result looked like this:

As you can see, not all hardware acceleration components are active. Further down on the same page there’s a list of detected issues. To resolve them, go to chrome://flags and change the following settings:
- Enable the software-rendering list override.
- Enable hardware rasterization.
- Set the number of raster threads to 4.
These settings are experimental and disabled by default, since the developers can’t reliably assess the quality of GPU drivers across the wide range of Linux distributions.
Then launch Chrome with the –enable-native-gpu-memory-buffers flag. KDE users can add this flag to Chrome’s launch command by editing the application shortcut with kmenuedit.

Hybrid Graphics
Owners of laptops with hybrid graphics run into another power-saving issue. Hybrid graphics means the machine has two GPUs: an integrated one and a discrete one. The discrete GPU is a full-fledged graphics adapter and therefore quite power-hungry. The obvious fix: when running on battery, disable the discrete GPU and rely entirely on the integrated solution.
Before disabling the discrete GPU, you need to install the acpi_call package and load the corresponding kernel module:
# modprobe acpi_call
After loading the module, run the following script with administrator privileges (in Arch Linux it’s already available at /):
#!/bin/bash
if lsmod | grep -q acpi_call; then
methods="
_SB.PCI0.P0P1.VGA._OFF
_SB.PCI0.P0P2.VGA._OFF
_SB_.PCI0.OVGA.ATPX
_SB_.PCI0.OVGA.XTPX
_SB.PCI0.P0P3.PEGP._OFF
_SB.PCI0.P0P2.PEGP._OFF
_SB.PCI0.P0P1.PEGP._OFF
_SB.PCI0.MXR0.MXM0._OFF
_SB.PCI0.PEG1.GFX0._OFF
_SB.PCI0.PEG0.GFX0.DOFF
_SB.PCI0.PEG1.GFX0.DOFF
_SB.PCI0.PEG0.PEGP._OFF
_SB.PCI0.XVR0.Z01I.DGOF
_SB.PCI0.PEGR.GFX0._OFF
_SB.PCI0.PEG.VID._OFF
_SB.PCI0.PEG0.VID._OFF
_SB.PCI0.P0P2.DGPU._OFF
_SB.PCI0.P0P4.DGPU.DOFF
_SB.PCI0.IXVE.IGPU.DGOF
_SB.PCI0.RP00.VGA._PS3
_SB.PCI0.RP00.VGA.P3MO
_SB.PCI0.GFX0.DSM._T_0
_SB.PCI0.LPC.EC.PUBS._OFF
_SB.PCI0.P0P2.NVID._OFF
_SB.PCI0.P0P2.VGA.PX02
_SB_.PCI0.PEGP.DGFX._OFF
_SB_.PCI0.VGA.PX02
_SB.PCI0.PEG0.PEGP.SGOF
_SB.PCI0.AGP.VGA.PX02
"
for m in $methods; do
echo -n "Trying $m: "
echo $m > /proc/acpi/call
result=$(cat /proc/acpi/call)
case "$result" in
Error*)
echo "failed"
;;
*)
echo "works!"
# break # try out outher methods too
;;
esac
done
else
echo "The acpi_call module is not loaded, try running 'modprobe acpi_call' or 'insmod acpi_call.ko' as root"
exit 1
fi
The result should look something like this:
...
Trying _SB.PCI0.PEG1.GFX0._OFF: failed
Trying _SB.PCI0.PEG0.GFX0.DOFF: failed
Trying _SB.PCI0.PEG1.GFX0.DOFF: failed
Trying _SB.PCI0.PEG0.PEGP._OFF: works!
...
The line labeled “works!” indicates that the discrete graphics card was successfully detected and disabled until the next reboot.
CPU
Offloading the CPU using some of the steps from the previous section opens the door to lowering CPU power consumption. This is where the cpupower command-line utility comes in—or, more precisely, a collection of CLI tools under a single name.
The tool lets you adjust the CPU frequency, configure its operating modes as needed, and diagnose its current state.
When it comes to power saving, a standout feature is cpupower’s ability to change the CPU clock frequency on the fly using the frequency-set command.
# Sets the maximum CPU frequency limit$ sudo cpupower -c all frequency-set -u ТЧ
# Sets the minimum CPU frequency limit$ sudo cpupower -c all frequency-set -d ТЧ
# Sets an exact CPU frequency value$ sudo cpupower -c all frequency-set -f ТЧ
Clock frequency (clock speed), expressed in gigahertz (GHz) or megahertz (MHz).
cpupower also lets you choose a CPU frequency scaling policy — a governor:
- performance — sets the CPU to its maximum frequency
- userspace — sets the CPU frequency to a value provided by user space
- ondemand — scales the CPU frequency based on current load; can boost to the maximum under load and drop to the minimum when idle
- powersave — forces the minimum frequency (but on Intel CPUs starting with Sandy Bridge it behaves like a more efficient form of ondemand)
- conservative — scales the CPU frequency based on workload more gradually than ondemand
- schedutil — scales the CPU frequency using data from the kernel’s task scheduler
By combining cpupower, udev, and systemd, you can adjust the CPU clock frequency in response to specific events—for example, when a laptop is unplugged from AC power. We’ll delegate event handling to udev by creating the rule /:
SUBSYSTEM=="power_supply", ENV{POWER_SUPPLY_ONLINE}=="1", RUN+="ondemand.service"
SUBSYSTEM=="power_supply", ENV{POWER_SUPPLY_ONLINE}=="0", RUN+="powersave.service"
We’ll also create two systemd services that will be started when the rule runs. Create the file / and put the following into it:
[Unit]
Description=CPU ondemand
[Service]
Type=oneshot
ExecStart=/usr/bin/cpupower -c all frequency-set -g ondemand
[Install]
WantedBy=multi-user.target
We’ll name the second file /:
[Unit]
Description=CPU powersave
[Service]
Type=oneshot
ExecStart=/usr/bin/cpupower -c all frequency-set -g powersave
[Install]
WantedBy=multi-user.target
Force udev to reload its rules:
$ sudo udevadm control -R
Here we’re just switching the governor, but on Intel, for better power savings it’s preferable to lock the CPU to the lowest possible frequency by replacing the command / with /.
You can determine the CPU’s minimum frequency by running the following command while the system is idle:
$ cat /proc/cpuinfo
Hard Drive
The most common—and also the most controversial—answer to the question of hard drive power saving is to use one of the hdparm command-line options. With it, you can adjust the APM (Advanced Power Management) value that controls how long the system can sit idle before the hard drive spins down.
While this setting can save some battery power, extremely low APM values can dramatically shorten a hard drive’s lifespan due to frequent spin-downs and the subsequent forced spin-ups.
To check the current APM setting for the sda drive, use:
$ sudo hdparm -B /dev/sda
When the laptop is running on AC power, the APM value is 254. On battery, you can set it to 128, and if you’re only running one or two applications, drop it to 96. In that case, you should avoid launching a web browser.
$ sudo hdparm -B 96 -S 0 /dev/sda
If you often run your laptop on battery power, the best option is to use a solid-state drive (SSD), which consumes less power than an HDD. You can also combine both: install the operating system on the SSD and use an HDD for data storage.
If you have enough RAM (by today’s standards, 8 GB or more), you can disable the swap partition to avoid waking the hard drive unnecessarily and save power:
$ sudo swapoff -a
$ sudo systemctl disable swap.target
Audio
Listening to music at max volume through the built‑in speakers consumes more power than using headphones. If you don’t plan to listen to anything, you can switch the sound card to standby. For a one‑time toggle on the widely used Intel HDA, run a command as administrator.
$ sudo -s
# echo 1 > /sys/module/snd_hda_intel/parameters/power_save
To set the power-saving mode permanently, set the following value in the /etc/modprobe.d/audio_powersave.conf configuration file:
options snd_hda_intel power_save=1
In this case, the card will switch to standby one second after going idle.
USB
My laptop’s built-in sound card is dead, so I use an external USB one. To save power on audio, I take the simple route—I just unplug the card.
This trick works for other USB gear too: external drives, 3G modems, Bluetooth and Wi‑Fi adapters, and wireless mice. Anything you don’t need right now—unplug it and put it in your pocket.
You can use the Linux kernel’s built-in ability to autosuspend idle USB devices via a udev rule. Some devices don’t play well with this feature; you can exclude them in the rule by matching their idVendor and idProduct.
ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="05c6", ATTR{idProduct}=="9205", GOTO="power_usb_rules_end"
ACTION=="add", SUBSYSTEM=="usb", TEST=="power/control", ATTR{power/control}="auto"
LABEL="power_usb_rules_end"
Save the rule to /.
You can find the idVendor and idProduct values with the lsusb command (look for lines like ID 09da:054f).
Onboard networking hardware
I can’t even remember the last time I used Bluetooth, so it’s permanently disabled on my machine. If your laptop has built-in Bluetooth, there’s probably a hotkey to toggle it on. If there isn’t, use the rfkill command:
# sudo rfkill block bluetooth
You can disable Bluetooth using the kernel module blacklist. Just create a text file at / and add two lines to it:
blacklist btusb
blacklist bluetooth
You can set up a similar blacklist for the Wi‑Fi and 3G modules, and even for the built‑in webcam (uvcvideo), if you don’t use them.
Kernel parameters
The Linux kernel is highly tunable—and it’d be a shame not to use that to reduce power consumption. Make the following adjustments in /; you’ll need administrator (root) privileges.
First, disable the Non-Maskable Interrupt (NMI) watchdog. It’s designed to help the kernel identify which hardware faults are triggering kernel panics. Sometimes it leads to unnecessarily high power usage, and regular users generally don’t need it.
To disable the NMI watchdog, add the following line to the configuration file.
kernel.nmi_watchdog = 0
The next step is to increase the delayed write interval for virtual memory. This helps coalesce multiple I/O operations into one, reducing the number of disk writes and improving power efficiency. To set it to 60 seconds, add the following line
vm.dirty_writeback_centisecs = 6000
You can also increase the interval between file writes to disk by enabling laptop mode:
vm.laptop_mode = 5
As a result, disk writes will be deferred for as long as possible. This setting mainly applies to traditional spinning hard drives.
Don’t Forget the Vacuum Cleaner
Even without any special know-how, you can noticeably extend your laptop’s battery life by keeping its cooling heatsinks in good condition. Regularly clearing them of dust can save a lot of power. When dust and grime build up on the heatsink, they impede heat dissipation, forcing the system to keep the cooling fan running longer and draining the battery.
You can use a vacuum cleaner for cleaning—just don’t overdo it. There have been cases where excessive suction pulled the fan impeller off the motor shaft.
TLP
The computer industry has one very welcome trait: as soon as a particular workflow becomes routine, a tool shows up that lets you achieve the same results more easily and much faster.
The TLP command-line utility is one such tool. It won’t help you clean the heatsink, of course, but it can apply the CPU, disk, audio, network adapter, and kernel settings described above with no hassle. Installation packages are available for Arch, Debian, Fedora, Gentoo, and Ubuntu.
In essence, TLP is an umbrella tool that unifies disparate utilities to reduce your computer’s power consumption. You don’t need to wade into the intricacies of power management—just install TLP, and it will automatically apply power‑saving settings when you unplug from AC power.
That said, you can adjust these settings to your preference and current needs by editing the configuration file at /.
Here’s an example of disabling the NMI watchdog:
NMI_WATCHDOG=0
And here’s the APM setting for hdparm:
DISK_APM_LEVEL_ON_BAT="128 128"
Enabling the sound card’s power-saving mode:
SOUND_POWER_SAVE_ON_BAT=1
This way, Bluetooth will remain disabled after the system boots:
DEVICES_TO_DISABLE_ON_STARTUP="bluetooth"
It’s straightforward and clear.
Control of screen backlight brightness has been intentionally left out of TLP to avoid conflicts with other brightness management tools (such as GNOME Power Manager).
In addition to managing a laptop’s power consumption, TLP also includes a powerful diagnostic tool, tlp-stat. By running the tlp-stat command with the appropriate options, you can get information about the battery, disk health, CPU, GPU, USB ports, PCI devices, and network hardware, as well as general system and configuration details in both verbose and summary form, plus reports on detected issues.

Some features aren’t available on all laptops. One example is configuring the charging trigger for ThinkPad batteries. By default, charging starts when the level drops to 96% and stops at 100%. These settings are meant to provide the longest possible runtime per charge. However, this charging pattern causes the battery to wear out much faster.
To reduce premature battery wear, you can enable a battery preservation mode. For example, configure it so charging only starts when the level drops to 60%, and cap the maximum charge at 80%.
START_CHARGE_THRESH_BAT0=60
STOP_CHARGE_THRESH_BAT0=80
If you need to fully charge the battery, you can do it once without changing the overall settings:
$ sudo tlp fullcharge
PowerTop
PowerTop — another tool aimed at reducing your laptop’s power consumption. It’s developed by Intel, which says something.
First and foremost, it’s a powerful utility for diagnosing system power behavior. PowerTop can run in several modes; the primary one is a pseudo-graphical, curses-style interface with multiple tabs. The tab for those who want immediate results is called Tunables. It lists system components with an indicator of how optimal their settings are. There are two states: GOOD and BAD. You can switch BAD to GOOD by pressing Enter.

Note that all changes will be reset after a reboot. You can make them persistent by creating a systemd service at /:
[Unit]
Description=Powertop
[Service]
ExecStart=/usr/bin/powertop --auto-tune
RemainAfterExit=true
[Install]
WantedBy=multi-user.target
Next, enable the service:
$ sudo systemctl enable powertop
The HTML and CSV modes let you save system analysis data. They make it easy to review the results yourself and share diagnostic results with others to get advice on your settings.

In calibration mode, the tool measures power consumption across different combinations of USB and wireless device activity, display backlight levels, hard drive operation, and CPU load. The idea is to help you choose a screen brightness level that’s gentlest on the battery given your current hardware settings. After it profiles the system’s actual capabilities, the utility can also provide more accurate measurements.
Power readings are taken every time the program starts, but the analysis results only become available after you’ve collected the minimum required number—261 samples. Make sure to take them while the laptop is running on battery power.
Conclusions
This article doesn’t claim to be the ultimate truth. There are many ways to configure power-saving settings. It all depends on the tasks you plan to perform, the condition of your hardware, and personal preferences.
The final choice is always up to the user. That said, by following these recommendations, you can significantly extend your Linux laptop’s battery life.