Hibernate and resume from a swap file
Solution 1:
Here is what I did to make it work with Ubuntu 18.04.
- Make your
/swapfile
have at least the size of your RAM
sudo swapoff /swapfile
sudo dd if=/dev/zero of=/swapfile bs=$(cat /proc/meminfo | awk '/MemTotal/ {print $2}') count=1024 conv=notrunc
sudo mkswap /swapfile
sudo swapon /swapfile
- Note the UUID of the partition containing your
/swapfile
:
$ sudo findmnt -no UUID -T /swapfile
20562a02-cfa6-42e0-bb9f-5e936ea763d0
- Reconfigure the package
uswsusp
in order to correctly use the swapfile:
sudo dpkg-reconfigure -pmedium uswsusp
# Answer "Yes" to continue without swap space
# Select "/dev/disk/by-uuid/20562a02-cfa6-42e0-bb9f-5e936ea763d0" replace the UUID with the result from the previous findmnt command
# Encrypt: "No"
- Edit the SystemD hibernate service using
sudo systemctl edit systemd-hibernate.service
and fill it with the following content:
[Service]
ExecStart=
ExecStartPre=-/bin/run-parts -v -a pre /lib/systemd/system-sleep
ExecStart=/usr/sbin/s2disk
ExecStartPost=-/bin/run-parts -v --reverse -a post /lib/systemd/system-sleep
- Note the resume offset of your
/swapfile
:
$ sudo swap-offset /swapfile
resume offset = 34818
- Configure Grub to resume from the swapfile by editing
/etc/default/grub
and modify the following line:
GRUB_CMDLINE_LINUX_DEFAULT="resume=UUID=20562a02-cfa6-42e0-bb9f-5e936ea763d0 resume_offset=34818 quiet splash"
- Update Grub:
sudo update-grub
- Create the following
/etc/initramfs-tools/conf.d/resume
:
RESUME=UUID=20562a02-cfa6-42e0-bb9e-5e936ea763d0 resume_offset=34816
# Resume from /swapfile
- Update initramfs:
sudo update-initramfs -u -k all
Now you can hibernate with sudo systemctl hibernate
.
One can also create those scripts:
sudo tee /usr/local/bin/gotosleep <<EOF
dbus-send --type=method_call --dest=org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.Lock
sleep 2
sudo /usr/sbin/s2both
EOF
sudo chmod +x /usr/local/bin/gotosleep
sudo tee /usr/local/bin/gotohibernation <<EOF
dbus-send --type=method_call --dest=org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.Lock
sleep 2
sudo systemctl hibernate
EOF
sudo chmod +x /usr/local/bin/gotohibernation
So you can sleep with gotosleep
or hibernate with gotohibernation
.
You must be able to execute sudo s2both
, sudo s2ram
and sudo systemctl hibernate
without having to enter your password for the previous scripts to work.
You could do that for example by creating a powerdev
group, add your current user to it, and configure the following sudoers config (edit it with sudo visudo -f /etc/sudoers.d/powerdev
):
%powerdev ALL=NOPASSWD: /usr/sbin/s2both, /usr/sbin/s2ram, /bin/systemctl hibernate
Documentation used:
- Cas' answer
- Debian "Hibernate without swap partition"
- Configuring Lubuntu 18.04 to enable hibernation using a swap file
- So question "s2disk works, but hibernation from menu gets stuck afer login"
Solution 2:
Hibernate with Swap file using uswusp
Although it is possible to hibernate to swap file and it supposedly works with systemd hibernate by setting kernel parameters. However, I couldn't get it to resume so instead switched to using uswsusp (userspace software suspend). Here are the steps I used on Ubuntu 17.04/17.10.
Create the Swap File
The commands to create a formatted 4GiB swap file, mounted and added to /etc/fstab
:
sudo fallocate -l 4g /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile swap swap defaults 0 0' | sudo tee -a /etc/fstab
Verify Swap File Partition
sudo findmnt -no SOURCE,UUID -T /swapfile
> /dev/sda1 11cc33ee-1234-abcd-1234-ddeeff112233
Install Userspace Software Suspend (uswsusp)
sudo apt install uswsusp
Configure uswsusp
To create /etc/uswsusp.conf
and recreate initramfs
:
sudo dpkg-reconfigure -pmedium uswsusp
-
Yes
to 'Continue without a valid swap space?' (Wizard not set swap file yet.) - Select the partition that the swap-file resides on, cross-reference with details from
findmnt
above. (Note:not the swap-file itself)
Note: Any changes manually made to /etc/uswsusp.conf
will require recreating initramfs
afterwards with this command:
sudo update-initramfs -u
Test uswusp hibernate
sudo s2disk
There should be snapshot
messages on the screen on hibernate and resume.
Use s2disk with systemd hibernate
By default systemd will use it's own hibernate commands so replace them with the uswusp commands by overriding the systemd-hibernate.service
:
sudo systemctl edit systemd-hibernate.service
In the text editor that opens put the following text (the blank ExecStart is required). Then save and exit:
[Service]
ExecStart=
ExecStart=/usr/sbin/s2disk
ExecStartPost=/bin/run-parts -a post /lib/systemd/system-sleep
This will create /etc/systemd/system/systemd-hibernate.service.d/override.conf
file with override details.
Test systemd hibernate :
systemctl hibernate
Note: To check that the systemd override.conf
has been created, loaded and no errors, run:
systemctl status systemd-hibernate.service
References:
- Debian Wiki - Hibernate_Without_Swap_Partition
- Arch Wiki - Uswsusp
Solution 3:
I've given a quick read to the tutorial and, if I have understood correctly, you just need to specify the resume
options to the Linux command line. With Grub2 is really simple, and your changes will be always preserved. You need to edit the /etc/default/grub
file, specifically this line:
GRUB_CMDLINE_LINUX="resume=... resume_offset=..."
After that, run sudo update-grub
for the changes to take effect.
Changing GRUB_CMDLINE_LINUX
won't affect other Linux installations you have (because /etc/grub.d/30_os-prober
does not use this variable).
About the problem you're having: is the partition of the swapfile encrypted? If so, hibernation won't work. If not, then the output of filefrag -v /swapfile
may be helpful.