Suspend and hibernate

From Gentoo Wiki
Jump to:navigation Jump to:search
This page contains changes which are not marked for translation.


This article describes how to suspend or hibernate a Gentoo system.

Installation

Kernel

Make sure support for suspend and hibernation has been activated (CONFIG_SUSPEND) and (CONFIG_HIBERNATION):

KERNEL
Power management and ACPI options --->
    [*] Suspend to RAM and standby
    [*] Hibernation (aka 'suspend to disk')

Software

One of the following packages can be used to control the in-kernel default suspend/hibernate implementation, namely, swsusp.

Available suspend modes

To see available suspend modes use

root #cat /sys/power/state

for swsusp, default implementation.

Those two file will list at least ACPI S2/4 power down methods on modern hardware. New hardware would also support S5 method which is a rough S4 method. ACPI S2 correspond to suspend to ram (ram method in swsusp terms and 3 in ToI terms); S4 hibernation to disk (disk in swsusp terms and 4 in ToI terms; S5 hibernation to disk (5 in ToI terms).

Swsusp users can choose between platfom, meaning ACPI, or shutdown methods which can be echo-ed to /sys/power/disk sysfs file.

Suspend to RAM

Preferred commands to suspend are:

root #s2ram

or, if using sys-auth/elogind:

root #loginctl suspend

For suspend (to RAM) for sys-power/hibernate-script users:

root #hibernate-ram

or

root #hibernate

to hibernate (to disk).

A more "raw" method is:

root #echo mem > /sys/power/state

Suspend to disk

Warning

If you are using genkernel initramfs, you may experience bug #156445 which makes it impossible to resume after suspend-to-disk. There is a number of ways to avoid it, from editing initramfs (e.g. as described here) to dropping genkernel completely.

Important
Remember, swap file must contain all memory used by running processes and memory-based filesystems, like tmpfs or zram, prior to hibernating. However, unless specifically set, the hibernation image is compressed. Setting hibernation image size to half of the amount of installed RAM is a safe value in most cases. One of the cases where this does not fully apply is when the system has a high usage of zswap which means that memory may already be compressed.

For suspend to disk to operate a swap partition or swap file must exist.

The swap file should be active beforehand and should be echoed on the appropriate file before any attempt to suspend/hibernate.

root #echo /dev/sda1 > /sys/power/resume

A more "raw" method is to:

root #echo disk > /sys/power/state

Do not forget to probe:

root #cat /sys/power/tuxonice/swap/headerlocations

before issuing an actual command and append the result to kernel command line argument prepended with resume=. This will suffice to resume from a block device or swap file for ToI. However, it's more complicated for a swap file with swsusp.

Suspend to disk with sys-auth/elogind

First, make sure a swap partition has been set, grub.cfg rebuilt and the initramfs (if any) updated as shown above.

Reboot the system:

root #loginctl reboot

Next, try running:

root #loginctl hibernate

Suspend to disk with swap file

You can use suspend to disk with a swap file. When you have a functional swap file you need to configure kernel parameters (via GRUB, etc.).

First find UUID of device where your swap file resides. For example /dev/sda1.

Warning
When swap file resides in a LVM volume, GRUB must be compiled with LVM support - device-mapper USE flag. Otherwise, the system will not wake up and will be cold started.
root #blkid /dev/sda1

Find offset of swap file on given partition using the swap-offset utility from sys-power/suspend:

Important
Btrfs filesystem requires to compute the offset of the swap file a different way, see Arch Linux wiki, Hibernation into a swap file on Btrfs.
root #swap-offset /path/to/swapfile

After that edit GRUB config and add required parameters to the boot string:

FILE /etc/default/grubGRUB defaults
GRUB_CMDLINE_LINUX_DEFAULT="resume=UUID=<UUID_of_partition> resume_offset=<offset_of_swapfile>"

Rebuild GRUB config:

root #grub-mkconfig -o /boot/grub/grub.cfg

Reboot the system and check used kernel parameters:

user $cat /proc/cmdline

It should now be possible to hibernate the system.

Troubleshooting

Classic kernel buffer comes handy:

user $dmesg

Can not resume after suspend

In case resuming from suspend does not work, disable the security chip setting in BIOS/UEFI and try again. Outdated microcode can result in dysfunction of resumption from suspension, thus make sure it is updated (eg. Intel microcode with i915 drivers).

For i915 drivers if the microcode update is ineffective, try disabling CONFIG_RETPOLINE at the cost of Spectre v2 vulnerability.

WiFi stays hard blocked

Although possibly unsafe, tricking the BIOS into believing it being "Microsoft Windows" might solve it.

This can be done by adding acpi_osi=! acpi_osi=Windows or acpi_osi=! acpi_osi='Windows 2009'(kernel source) to the boot command line options.

For sys-boot/grub, the options can be appended to GRUB_CMDLINE_LINUX in /etc/default/grub.

Migration from pm-utils to elogind

Copy any suspend/resume and hibernate/thaw hook scripts from the directory /etc/pm/sleep.d/ to /lib64/elogind/system-sleep/, and modify them to cater for the new $1 ('pre' or 'post') and $2 ('suspend', 'hibernate', or 'hybrid-sleep'). See also: elogind#Hook_scripts_to_be_run_when_suspending.2Fhibernating_and.2For_when_resuming.2Fthawing

See also

External resources

References