Power Management: Difference between revisions

imported>Skylark
Drop a redlink, add See also: Laptop which overlaps with this article
m remove some whitespace and fix typo
 
(6 intermediate revisions by 4 users not shown)
Line 1: Line 1:
{{expansion}}
This article covers configurations related to power management in terms of energy saving modes of various devices and components.


== Suspend ==
== Configuration ==
 
=== Hard drives ===
Following snippet configures [[Udev]] rules which automatically run the program <code>hdparm</code> to enable power saving modes for hard disks, especially rotational drives mapped to <code>/dev/sd*</code>.<syntaxhighlight lang="nix">
services.udev.extraRules =
  let
    mkRule = as: lib.concatStringsSep ", " as;
    mkRules = rs: lib.concatStringsSep "\n" rs;
  in mkRules ([( mkRule [
    ''ACTION=="add|change"''
    ''SUBSYSTEM=="block"''
    ''KERNEL=="sd[a-z]"''
    ''ATTR{queue/rotational}=="1"''
    ''RUN+="${pkgs.hdparm}/bin/hdparm -B 90 -S 41 /dev/%k"''
  ])]);
</syntaxhighlight>The <code>hdparm</code> parameters <code>-B</code> and <code>-S</code> define power saving modes and in case of <code>-S</code> the standby (spindown) timeout. The number 41 means therefore: Turn off the motor after 205 = 41*5 seconds.


=== Suspend hooks ===
=== Suspend hooks ===
NixOS provides the {{nixos:option|powerManagement.resumeCommands}} option which defines commands that are added to a global script that will be executed after resuming.
NixOS provides the {{nixos:option|powerManagement.resumeCommands}} option which defines commands that are added to a global script that will be executed after resuming.


Line 27: Line 41:
</syntaxhighlight>
</syntaxhighlight>


=== Troubleshooting ===
=== Hibernation ===
 
Hibernation requires a configured swap device. See [https://nixos.org/manual/nixos/stable/#ch-installation installation instructions] on how to create a swap partition.
 
Please note that <code>resumeDevice</code> must match the output of  <code>swapon -s</code> especially if you're dealing with mapped volumes (LUKS, logical volumes, logical volumes under LUKS, etc.). If you're using a swapfile, you must also [https://search.nixos.org/options?channel=unstable&show=boot.resumeDevice&from=0&size=50&sort=relevance&type=packages&query=resume+offset specify the offset to it.]
 
Therefore, an example configuration could look like this:<syntaxhighlight lang="nix">
/*
  I'm hibernating into a logical volume that's also under LUKS. Pretty cool, right?
*/
 
swapDevices = [
  {
    device = "/dev/VG/SWAP";
  }
];
 
boot.resumeDevice = "/dev/dm-7";
</syntaxhighlight>Derived from a system with the following output from <code>swapon -s</code> :<syntaxhighlight>
Filename                                Type            Size          Used            Priority
/dev/dm-7                              partition      67108860      00
/dev/zram0                              partition      32881148      032767
 
</syntaxhighlight>
 
Test and use hibernation with the following command:<syntaxhighlight lang="nix">
systemctl hibernate
</syntaxhighlight>
 
== Tips and tricks ==
 
=== Go into hibernate after specific suspend time ===
Using following configuration, your system will go from suspend into hibernate after 1 hour:<syntaxhighlight lang="nix">
systemd.sleep.extraConfig = ''
  HibernateDelaySec=1h
'';
</syntaxhighlight>
 
Or, to disable suspend entirely, consider a configuration like this:
<syntaxhighlight lang="nix">
systemd.sleep.extraConfig = ''
  AllowSuspend=no
  AllowHibernation=no
  AllowHybridSleep=no
  AllowSuspendThenHibernate=no
'';
</syntaxhighlight>
 
== Troubleshooting ==


==== System immediately wakes up from suspend ====
==== System immediately wakes up from suspend ====
Line 100: Line 162:


* {{manual:nixos|sec=#sec-rebooting|chapter=Chapter 23. Rebooting and Shutting Down}}
* {{manual:nixos|sec=#sec-rebooting|chapter=Chapter 23. Rebooting and Shutting Down}}
[[Category:Configuration]]