Linux hibernate to swap

Hibernate and resume from a swap file

I have configured a new Ubuntu installation in a Notebook to use a swap file, instead of using a swap partition. By default is not possible to get Ubuntu to hibernate using a swap file, so I tried this tutorial, but it is specific to grub1, and Ubuntu now uses grub2. Does anybody know how to do this?

IDK what’s up with systemd, looking at the code it should support swapfile natively. Then I’ve been using it for years with one swap partition much smaller that RAM, and one swapfile to compensate. In more recent versions I had to play with the priorities to make it work (make swap part lower prio, though from what I recall I I needed to use the swap part — I was probably mistaken). But at the same time I helped someone else with the same issue, and removing the swap partition (which alone is too small) broke it. One small swap part pri=0 , one large swap file pri=1 , worked for both of us.

NB: The swap priority change fixed the resume, suspend always worked but resume would fail in initrd to pick up the image on the swapfile. I assumed the working boots used the partition for the resume image. IMHO, either the swapfile allows the kernel to further reduce the image size (ex swap out application memory) or systemd supported swapfiles all along and a recent bug broke it partially. Also before I fixed systemd, swsusp s2disk (and iirc pm-hibernate too) worked fine without any change.

6 Answers 6

Here is what I did to make it work with Ubuntu 18.04.

sudo swapoff /swapfile sudo dd if=/dev/zero of=/swapfile bs=$(cat /proc/meminfo | awk '/MemTotal/ ') count=1024 conv=notrunc sudo mkswap /swapfile sudo swapon /swapfile 
$ sudo findmnt -no UUID -T /swapfile 20562a02-cfa6-42e0-bb9f-5e936ea763d0 
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 
$ 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" 
RESUME=UUID=20562a02-cfa6-42e0-bb9e-5e936ea763d0 resume_offset=34816 # Resume from /swapfile 
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  

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 

This almost makes me feel like trying hibernation again - I had a problem with occasional corruption on my disks, which was apparently related to the hibernation process. Have you encountered anything like that?

Thanks for this guide. After following the steps then trying to hibernate using $ sudo systemctl hibernate, my laptop wakes up a couple seconds after trying to hibernate. /var/log/syslog shows many errors, but these seem the most relevant: - Failed to set power save mode for output eDP-1: Permission denied . - Object .Gjs_AppIndicatorIconActor__1 (0x561c60a4d150), has been already finalized. Impossible to set any property to it. . - s2disk: Could not use the resume device (try swapon -a). Reason: No such device - systemd-hibernate.service: Main process exited, code=exited, .

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)

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:

Test uswusp hibernate

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 :

Note: To check that the systemd override.conf has been created, loaded and no errors, run:

systemctl status systemd-hibernate.service 

This instructions seems to work but the systemd hibernation is not working for me. Have you tested this your own? Should this ExceStart=run-parts -a post /lib/systemd/system-sleep be ExceStartPost=run-parts -a post /lib/systemd/system-sleep

This doesn't look quite right. The enable option of systemctl symlinks from /etc/systemd/system/ to /lib/systemd/system/ . You should never be copying directly into /etc/systemd/system/

I didn't manage to make this work 😞. I set up swapfile, installed and configured uswsusp, but sudo s2disk only logs Saving snapshot , than turns off the display, hangs for ~5 min and then it shuts down the computer. However after I turn it on, it boots normally like there's been no hibernation.

I think this line sudo findmnt -no SOURCE,UUID -T /mnt/4GiB.swap should be changed to sudo findmnt -no SOURCE,UUID -T /swapfile

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.

@didi_X8 that comment was written 8 years ago. It's possible that things have changed since then. Thanks for sharing.

Ubuntu 22.04

uswusp is deprecated. You can still use it for Ubuntu . To find swap offset on Ubuntu 22.04:

  • Run sudo filefrag -v /swapfile
  • In the "physical_offset" column, copy the first row number (without dots!). Value example: 1234567 .

All other steps remain the same for Ubuntu 22.04, so you can follow other answers except installing and using uswusp.

I'd spent hours to get my KDE (neon) with hibernation option on shutdown menu, and since I'd solved, I've decided to share it here. If you're using KDE, you should create a file "/etc/polkit-1/localauthority/10-vendor.d/hibernate.pkla" with the content:

[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 

Since no from the previous answers seems to me to cover all aspects fully, here all the steps which worked for me to get everything running smoothly on Debian Bullseye, so should be applicable for Ubuntu 22 and hopefully higher too with grub2 used without the usage of the no longer existing package uswsusp and the whole s2* facility. I expect this should be also applicable to lower versions:

  1. Lets suppose, we have prepared the swap file named /tmpdisk/system/swap.file . How to prepare it, consult for example this answer.
  2. Get the information about the swap offset by the determination of the first fragment of the swap file on the partition, where it is placed, for example:

# filefrag -v /tmpdisk/system/swap.file

obtaining the result where the offset is the first physical offset fragment number

Filesystem type is: ef53 File size of /tmpdisk/system/swap.file is 68719476736 (16777216 blocks of 4096 bytes) ext: logical_offset: physical_offset: length: expected: flags: 0: 0.. 63487: 34816.. 98303: 63488: 1: 63488.. 126975: 100352.. 163839: 63488: 98304: 2: 126976.. 190463: 165888.. 229375: 63488: 163840: … 

Same information can be retrieved by the simple issuing of
# filefrag -v /tmpdisk/system/swap.file | awk '$1=="0:" '
obtaining the offset value directly:
34816

  1. Find the UUID of the partition with the swap file (in my case of file /tmpdisk/system/swap.file placed on partition, mounted on mount point /tmpdisk , so):

# findmnt -no UUID,SOURCE -T /tmpdisk
resulting in something like this
6b127402-e917-4ab0-9490-00faa74e88e5 /dev/sdb1

  1. Use the obtained UUID of the partition with the swap file and of the offset in /etc/default/grub :
  1. Use the obtained UUID of the partition with the swap file and of the offset in /etc/initramfs-tools/conf.d/resume :
resume=UUID=6b127402-e917-4ab0-9490-00faa74e88e5 resume_offset=34816 

Remark: The values UUID=6b127402-e917-4ab0-9490-00faa74e88e5 and resume_offset=34816 will be individual on every system

Источник

Enable Hibernate With Encrypted Swap

Skip to the next blank line (should be 291, before FSTYPE=''), and insert the following line. Replace /dev/sdXN with the device from Preparation point 4.

/sbin/cryptsetup luksOpen /dev/sdXN cryptswap1
DEVICE='/dev/mapper/cryptswap1'
RESUME=/dev/mapper/cryptswap1

If the file does not exist, create it with only that line. IMPORTANT: Whenever new kernels are installed, this step must be repeated
Register these changes.

sudo update-initramfs -u -k all

IMPORTANT: Whenever new kernels are installed, this step must be repeated and then the machine MUST be rebooted

New Swap First Time Use

  1. Reboot your machine.
  2. You will receive a prompt for swap's encryption passphrase. Remember that your mouse does not work at this point. Type your passphrase and press Enter.
    Correct cryptswap1 passphrase.png
  3. If you mistype a passphrase three times, the system will boot anyway but without your swap enabled. Repeat the How-To if you have forgotten your passphrase.
    Incorrect cryptswap1 passphrase.png
  4. After correctly typing your passphrase:
    Correct cryptswap1 passphrase.png

How to Enable Hibernate

See the official documentation on how to test if hibernate works for your computer, and how to enable the hibernate option in the Unity power menu.

EnableHibernateWithEncryptedSwap (последним исправлял пользователь hamishmb 2020-12-09 14:00:44)

The material on this wiki is available under a free license, see Copyright / License for details
You can contribute to this wiki, see Wiki Guide for details

Источник

Оцените статью
Adblock
detector