Ubuntu – Hibernate and resume from a swap file

hibernateswap

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?

Best Answer

  • 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 | grep MemTotal | grep -oh '[0-9]*') count=1024 conv=notrun
      sudo mkswap /swapfile
      sudo swapon /swapfile
      
    • Note the UUID of the partition containing your /swapfile:

      $ sudo findmnt -no SOURCE,UUID -T /swapfile
      /dev/nvme0n1p5 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 hibernatewithout 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: