Enable hibernation on Pop!_OS 20.10
I bought an old mSATA SSD off eBay and put it into the WWAN slot of my ThinkPad. Apparently it's slower than the other SSD, but maybe good enough to use as a scratch disk and for hibernation.
I created a swap partition of about 18 GB on the new SSD at /dev/sdb1
and added it and a new /scratch
partition at /dev/sdb2
. Get their UUIDs using blkid
:
❯ sudo blkid /dev/sdb1 /dev/sdb1: UUID="059137db-89c2-408c-b6bb-4a8b3fe87fe2" TYPE="swap" PARTUUID="2728293e-caf2-4a32-ba96-5fdfaef3be65" ❯ sudo blkid /dev/sdb2 /dev/sdb2: UUID="b11918a3-0f6e-4105-a59c-e95364504817" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="30276e12-d20a-4b5d-8b7f-2fdf86e9d655"
Add these partitions to fstab using the UUIDs:
UUID=059137db-89c2-408c-b6bb-4a8b3fe87fe2 none swap sw 0 0 UUID=b11918a3-0f6e-4105-a59c-e95364504817 /scratch ext4 noatime,errors=remount-ro 0 0
Starting with instructions here and more instructions at Pop Planet Info:
Check that the kernel supports hibernation:
❯ cat /sys/power/state freeze mem disk
disk
means hibernation is supported.
Add a boot option with kernelstub:
sudo kernelstub -a “resume=UUID=059137db-89c2-408c-b6bb-4a8b3fe87fe2"
Create a /etc/initramfs-tools/conf.d/resume
file pointing to the swap partition:
resume=UUID=059137db-89c2-408c-b6bb-4a8b3fe87fe2
Update the configuration:
sudo update-initramfs -u
Install pm-utils
:
sudo apt install pm-utils
Create a file override.conf
in /etc/systemd/system/systemd-hibernate.service.d
(using pm-hibernate
instead of s2disk
like in the instructions, because uswsusp
doesn`t seem to exist anymore):
[Service] ExecStart= ExecStartPre=-/usr/bin/run-parts -v -a pre /usr/lib/systemd/system-sleep ExecStart=/usr/sbin/pm-hibernate ExecStartPost=-/usr/bin/run-parts -v --reverse -a post /usr/lib/systemd/system-sleep
Now we can hibernate with:
systemctl hibernate
Suspend, then hibernate
To get suspend, then hibernate after a delay, follow these instructions, again modified because uswsusp
no longer seems to exist.
Create this script as /usr/local/bin/s2smart
, replacing s2disk
with pm-hibernate
:
#/bin/bash echo2 () { printf "$1\n" echo "$1" > /dev/kmsg } if [[ $EUID -ne 0 ]]; then echo "This script must be run as root" exit 1 fi hibernate_delay=`cat /etc/systemd/sleep.conf | grep -oP "HibernateDelaySec=\K(\d+)" 2> /dev/null || echo 3600` battery_capacity=`cat /sys/class/power_supply/BAT0/capacity 2> /dev/null || echo 0` if [ $battery_capacity -le 20 ]; then hibernate_delay=$(($hibernate_delay/2)) elif [ $battery_capacity -le 50 ]; then hibernate_delay=$(($hibernate_delay/4)) fi echo2 "Battery capacity at $battery_capacity%%. Will hibernate after $hibernate_delay seconds." # Record current time. curtime=$(date +%s) lock=/tmp/rtchibernate.lock echo "$curtime" > $lock # Entering sleep. echo2 "Entering suspend at $curtime. Will resume in $hibernate_delay seconds." rtcwake -m no -s $hibernate_delay s2ram # Exited the sleep. curtime=$(date +%s) sustime=`cat $lock` rm $lock echo2 "Exited suspend mode at $curtime." # Did we wake up due to the rtc timer above? if [ $(($curtime - $sustime)) -ge $hibernate_delay ]; then # Sometimes when you have too many cores that are too fast run-parts do mess things up. # lets get some sleep ;) sleep 2 # Hibernate (suspend to disk)... echo2 "Entering hibernation mode at $curtime..." pm-hibernate echo2 "Exited hibernation." else # Cancel the rtc timer and wake up normally. rtcwake -m disable echo2 "Cancelled RTC resume prematurely." fi echo2 "Suspend or hibernate finished. Welcome back."
Add HibernateDelaySec=3600"
to /etc/systemd/sleep.conf
Create a file override.conf
in /etc/systemd/system/systemd-suspend-then-hibernate.service.d
:
[Service] ExecStart= ExecStartPre=-/usr/bin/run-parts -v -a pre /usr/lib/systemd/system-sleep ExecStart=/usr/local/bin/s2smart ExecStartPost=-/usr/bin/run-parts -v --reverse -a post /usr/lib/systemd/system-sleep
Edit /etc/systemd/logind.conf
to check that these lines are present and not commented:
HandleLidSwitch=suspend-then-hibernate HandleLidSwitchExternalPower=suspend-then-hibernate
Hibernating without a password
Use visudo
to add these lines to /etc/sudoers
:
# Allow members of group sudo to hibernate without a password %sudo ALL=NOPASSWD: /usr/bin/systemctl hibernate,/usr/bin/systemctl hybrid-sleep
Adding hibernate options to the power menu
Following these instructions:
Add these lines to /etc/polkit-1/localauthority/50-local.d/com.ubuntu.enable-hibernate.pkla
:
[Re-enable hibernate by default in upower] Identity=unix-user:* Action=org.freedesktop.upower.hibernate ResultActive=yes [Re-enable hibernate by default in logind] Identity=unix-user:* Action=org.freedesktop.login1.hibernate;org.freedesktop.login1.handle-hibernate-key;org.freedesktop.login1;org.freedesktop.login1.hibernate-multiple-sessions;org.freedesktop.login1.hibernate-ignore-inhibit ResultActive=yes
Then add this Gnome extension Hibernate Status Button.