27

Hibernate worked correctly when I had been using Ubuntu 17.04. After upgrade to 17.10 I couldn't resume because of black screen after resume (this bug).

After upgrade to 18.04 if I try to start my computer after hibernation it boots as if there was no hibernation done.

2
  • I have the same problem with 18.04, I thik the solution must be in specifying right partition for resume but still couldn't find the way to do this. All I found I Google didn't work for me. May 12, 2018 at 7:00
  • The partition is set correctly in /etc/initramfs-tools/conf.d/resume to my swap. I suspect that either hibernation isn't done correctly or resume during boot doesn't work. But I don't know how to debug it further. Syslog and dmesg don't give any clues what is the problem.
    – Kamil
    May 13, 2018 at 17:28

5 Answers 5

42

UPDATED for Ubuntu LTS 22.04, tested Nov 17th '22.

There are changes done to default settings when compared to previous LTS (16.04). In my case hibernation didn't work until I've done several steps, among them increased the size of swap file, turned it on, made sure policies allowed it, etc.

This may easily be my lengthiest answer on entire StackExchange so I tried to make headers descriptive.

Boots as there was no hibernation

Would be prudent to take a look at your logs (dmesg might help) and see if anything's there. There are reasons when despite you telling the system to hibernate, it actually won't, or it will suspend-to-RAM instead (sleep).

Taking a look at kern.log and syslog looking for any hibernate-related messages wouldn't hurt as well. Sections starting with "problem" may help you with specific issues.

Swap file or swap partition

One of crucial changes is that now you DO NOT HAVE a swap partition, but you have a swap FILE.

Swap file may not work for your blend of hardware/drivers/OS and hibernation.

Hibernation turned off

Policies may also turn off or disallow hibernation.

Jargon

Suspend to RAM - RAM keeps the data, computer goes to sleep faster, uses more energy when suspended, wakes up faster. Some call this sleep.

Suspend to disk - aka hibernation. RAM is saved to swap (partition or file), computer goes to sleep slower, uses less energy while hibernating, wakes up slower.

Suspend-to-RAM in Linux by Rafael J. Wysocki and A. Leonard Brown

Prerequisites - do you have enough space?

To hibernate, you need to (simplification here) save your entire RAM to your hard drive. So, you need to set aside enough space to do so. If you don't, this will fail and you won't hibernate.

  1. free -m will tell you how much memory you have, use and how much is in your swap.
  2. df -h will tell you how much disk space you have on each mount point and how much is used, free, etc. This is important since you may want to later specify where your swap file will be located, or which partition to "trim" to have enough space for your swap.
  3. cat /etc/fstab should give you information if you have a swap partition or file. According to Ubuntu Hibernation FAQ swapfile may not always work with some combinations of hardware/drivers.

If you don't have enough space, follow Ubuntu swap FAQ. It tells you how to increase swap file, add another, check if it's used etc. With commands and explanations. Really nice resource.

I don't have enough space to fit my RAM!

Kernel docs say:

/sys/power/image_size controls the size of the image created by the suspend-to-disk mechanism. It can be written a string representing a non-negative integer that will be used as an upper limit of the image size, in bytes. The suspend-to-disk mechanism will do its best to ensure the image size will not exceed that number. However, if this turns out to be impossible, it will try to suspend anyway using the smallest image possible. In particular, if "0" is written to this file, the suspend image will be as small as possible. Reading from this file will display the current image size limit, which is set to 2/5 of available RAM by default.

So, try tweaking your image size. How - ask another question please.

Prerequisites - does your kernel support suspend-to-disk?

Kernel supports whatever is listed in /sys/power/state, so:

cat /sys/power/state

Allowed (to my knowledge) entries there include: mem, standby, freeze, disk. Explanation:

  • mem - has several meanings, which one exactly on your system you'll find out via cat /sys/power/mem_sleep. I have: s2idle [deep]
  • standby - Power-On Suspend (if supported)
  • freeze - Suspend To Idle (STI)
  • disk - Suspend To Disk (STD), hibernation. This - you want.

Then we need to check cat /sys/power/disk. If you have there disabled then dive in your BIOS looking for Secure Boot - that's the only idea I can offer and only thing I know may interfere and turn off hibernation. While I know only of SecureBoot, there may be other interferences, so taking a look at your BIOS is a good idea even if you don't have there any "secure boot".

Reading here:

  1. Kernel docs
  2. Debian Wiki on hibernation

TBH, even if your kernel does NOT support hibernation, you can try it in another way, scroll down to section Interfaces.

Read this - warnings and problems - no BTRFS

In no particular order:

  1. Not all chipsets will work (don't have sources that I can cite here so let's say this is hearsay)
  2. VAIO has problems, supposedly there's a flag to counter them
  3. SecureBoot is often cited as interfering or turning off hibernation
  4. Wake-on-LAN consumes power even with hibernation
  5. Number of modules (graphics especially) may be initialized BEFORE your system properly resumes from hibernation - this is usually the cause for black screen when resuming. Look at ArchLinux Wiki for tips on how to debug issues. I'd also suggest Ubuntu FAQ on hibernate issues. Browsing through Launchpad bugs may also yield results. IIRC, there's a kernel parameter specifying in seconds a delay before resume.
  6. Allowing hibernation procedure differs for different Polkit versions

Don't use BTRFS and hibernate: corrupted data will be the result.

I want to hibernate - swap partition

There are cases, when people forego swap file and go back to swap partition. After all, it worked on previous LTS. I did not try, so won't offer pointers.

I want to hibernate - with swap file

  1. Make sure you have enough space there. Ubuntu swap FAQ tells you how much you need, commands from above do so as well. If you need more info here, ask another question please, as this is a lengthy topic.
  2. Increase the swap file or create a new one with good enough size (preferred, I agree with @muru) and change in the /etc/fstab to new one. Reboot to see change is taken well (store backup of the fstab so you can easily revert just in case.
  3. Point your kernel at this with appropriate params, so it know where to resume from.
  4. Update/reconfigure your boot loader and reboot.

New swap file needed

sudo will be needed. It was in my case. For Ubuntu 22 I used 29GB, since this laptop I did it on had 24 RAM (per Ubuntu swap FAQ). Commands sourced from https://ploi.io/documentation/server/change-swap-size-in-ubuntu

  1. Turn off all running swap processes: swapoff -a
  2. Resize swap fallocate -l 1G /swapfile (change 1G to the gigabyte size you want it to be)
  3. CHMOD swap: chmod 600 /swapfile
  4. Make file usable as swap mkswap /swapfile
  5. Active the swap file swapon /swapfile

Kernel parameters? Scary!

Carefully read and decide if you wish to do that, but it's just a way to configure your kernel. It may be easier to hibernate via systemd and uswsusp (see Interfaces, below). It may be, that you - like me - will ultimately decide suspend-to-RAM is enough and you don't want to have 32GB on a swap file (not so great for folks with one SSD in their laptops, for instance). But!

  1. hibernate to swap file requires resume= to know which partition your swap file is on and resume_offset= to know where in swap file to start resuming from.
  2. hibernate to partition requires resume= to point to swap partition.
  3. resolving black screen issues may well require resumedelay=.

Kernel docs on delaying resuming from Hibernation:

resumedelay= [HIBERNATION] Delay (in seconds) to pause before attempting to read the resume files

Required parameters for swap-file and hibernation:

resume= [SWSUSP]

      Specify the partition device for software suspend
      Format:
      {/dev/<dev> | PARTUUID=<uuid> | <int>:<int> | <hex>}

resume_offset= [SWSUSP]

      Specify the offset from the beginning of the partition
      given by "resume=" at which the swap header is located,
      in <PAGE_SIZE> units (needed only for swap files).
      See Documentation/power/swsusp-and-swap-files.txt

For the resume= choose the same style as root element has in fstab. So, either /dev/sdaX or UUID or LVM. For hibernating to file - provide partition where your file can be found.

Example, with /swapfile on / partition:

  1. df -h to list partitions and find one where mount point is /. Filesystem column had /dev/nvme0n1p2
  2. blkid gave me UUID for it (EFI and one partition so I could run like so). For those with multiple partitions: blkid /dev/nvme0n1p2. Let's call this string: X.
  3. sudo filefrag -v /swapfile to find first number under physical offset, let's call this number: Y.
  4. sudo vim /etc/default/grub - find line with GRUB_CMDLINE_LINUX_DEFAULT, navigate to it's end and add parameters. If they're there, your problem may be their correctness or something else.

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=UUID=X resume_offset=Y"

After edit was done: sudo update-grub && reboot now

Reading:

  1. https://www.kernel.org/doc/Documentation/admin-guide/kernel-parameters.txt
  2. https://wiki.archlinux.org/index.php/Kernel_parameters
  3. https://ubuntuhandbook.org/index.php/2021/08/enable-hibernate-ubuntu-21-10/

Problem - swap header not found

Swap file needs to be formatted properly. If your logs tell you this, you either are trying to hibernate to a file, or your resume parameter is not right.

Switch to partition or fix the file or change interface used for hibernation.

See: https://unix.stackexchange.com/questions/43508/debian-hibernate-problem-pm-swap-header-not-found

mkswap is used to format file, read more on it here

Problem! Hibernation not allowed!

Test: pm-hibernate (if pm-utils package is installed) or systemctl hibernate tell you you are not allowed. Default setting in Ubuntu since IIRC 12.04.

Solution(s): depends on your Polkit version, your Ubuntu version and flavour... See this question. Also, ArchWiki on Polkit may help.

For Mint, see: https://forums.linuxmint.com/viewtopic.php?t=259912

Problem! Hibernation disabled by something in BIOS!

Test: cat /sys/power/disk has disabled. Logs show "Failed to hibernate system via logind: Sleep verb not supported".

Solution: search your BIOS and find the problematic thing. Turn it off.

Solution 2: try another hibernate interface.

See: How to activate hibernation in 16.04.1 ? (systemd).

Interfaces

  1. swsusp - low level kernel interface. See Prerequisites - kernel for which files. Writing to files directly may cause suspend (to RAM, to disk and hybrid). According to SwapFAQ problematic with hibernating to file.
  2. uswsusp - ArchWiki and Debian Wiki and nice AskUbuntu question with a write-up how to use it.
  3. systemd - ArchWiki on it
  4. pm-utils - AFAIK that's a collection of scripts originally from Debian - I'll gladly welcome more info myself.

Closing remarks

For me it was a matter of almost two days of work to compile that. Hopefully this will help you (and others) solve your issue faster. There are still points I missed but it's 2 AM and I don't feel like writing more now. I'm of course open to anybody's pointers to make this better, so comment away. I'll reply once I sleep, work etc. :-)

I'm not certain hibernating to disk is that great. I went with sleeping in the end. But for me issue was with having a 32GB file just to be able to do hibernation, since I'm usually avoiding swapping at all. My initial swap-file was at 2GB and it was mostly empty. YMMV. Nevertheless, good luck! And start with the logs!

6
  • Great answer! But what eventually solved my case was the linked Swap FAQ and it telling me to add "resume=UUID" to a variable in my grub config file and/or sth similar with initramfs-tools. For some reason I had a wrong UUID there which probably was the issue. So I suggest for someone with a similar issue to first check out what's written in the Swap FAQ under "How do I add or modify a swap partition?", and the third point about hibernation there.
    – RimaNari
    Aug 23, 2018 at 10:40
  • 1
    "disk - Suspend To Disk (STD), hibernation. This - you want." Am I the only one who got a kick out of this? Thanks much.
    – spakmad
    Jan 12, 2019 at 10:19
  • great answer! one small remark: on one of my machines resume after hibernate worked after a second boot attempt only (nothing was displayed on the monitor on the first attempt). i could fix that installing a HWE-stack: $ sudo apt install linux-generic-hwe-18.04 (for some hardware even linux-generic-hwe-18.04-edge might be worth a shot). Jan 22, 2019 at 6:16
  • 1
    Ah. I'm not going to hibernate! I have 512Gb of RAM. Oh well... (I have enough space on my 10Tb HDD, but it would take hours to reboot!) Oct 24, 2019 at 1:25
  • worked for me on ubuntu 19.10, using swapfile and setting resume and resume_offset parameters. Thanks to this answer: askubuntu.com/a/1197965/1008966 Feb 29, 2020 at 13:20
15

Use the swap partition's UUID instead of it's mounting point in the RESUME parameter resume=UUID=<#> in both /etc/default/grub and /etc/initramfs-tools/conf.d/resume

Create an entry for the swap partition in /etc/fstab without a mounting point something like this

# Entry for Swap : 
UUID=# none  swap    sw              0       0

In /etc/default/grub I've used a separate entry for resuming hibernation

# FOR HIBERNATION 
GRUB_CMDLINE_LINUX="resume=UUID=..."

Create a policykit in local authority (pkla)

sudo gedit /etc/polkit-1/localauthority/50-local.d/com.ubuntu.enable-hibernate.pkla

And insert there

[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

[Enable hibernate to be run via cron]
Identity=unix-user:*
Action=org.freedesktop.login1.hibernate;org.freedesktop.login1.hibernate-multiple-sessions
ResultAny=yes

After that update initramfs and GRUB

sudo update-initramfs -u -k all
sudo update-grub

Reboot , open some apps and use systemctl hibernate (without sudo) to see if it works

2
  • 1
    I did a release upgrade from Ubuntu 16.04 to 18.04 and resuming did not work anymore, it did a fresh boot. Setting GRUB_CMDLINE_LINUX to "resume=UUID=..." helped me, even setting resume to the device file (/dev/sda6 in my case) did not help.
    – Tibor Nagy
    Jan 8, 2021 at 10:04
  • The policykit was not taken in account since Ubuntu 23.10, hibernate only worked with sudo. The solution in this reddit thread solved it. Just install: sudo apt install polkitd-pkla while still having the policykit from the answer.
    – Eric M.
    Dec 1 at 8:12
1

For me it has always worked until 18.04 and after 18.04 I enabled it as is in many articles, but it suddenly stopped working just yesterday (working fine for 4-5 months),

and here is the ... ONE THING that got it working again ...

Tell grub2 where the swap partition is:

First find out which partition it is on using the below command:

cat /etc/fstab

Mine is on sda7 as is the following output:

swap was on /dev/sda7 during installation

Then, add in Grub2 the following addition to the following line, using the following command:

sudo gedit /etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT="intel_pstate=disable resume=/dev/sda7"

The important part is resume=/dev/sda7

/dev/sda7 in my case

Then Update Grub with the following command, and after this it started working perfectly again:

sudo update-grub

After many attempts this was the one thing worked, perhaps it was just because of an update to the kernel that screwed it up, never the less this worked.

1

hope this will help someone,but I'm running popos / ubuntu 19.04. In my setup I was able to hibernate using s2disk or pm-hibernate, but resume was failing. To fix this, as my system is booted up using UEFI instead of grub. I just had to reinstall the boot loader. To check if you are running UEFI use the following:

[ -d /sys/firmware/efi ] && echo "Installed in UEFI mode" || echo "Installed in Legacy mode"

if in UEFI mode, then I followed this guide to reinstall the bootloader, it varies if you are using an nvme disk or sata disk: https://support.system76.com/articles/bootloader/

make sure that in your kernalboot options you specify the partition or UUID of where to resume from, eg something like this:

resume=UUID=ed8347ed-2eb4-40bc-bc77-cc53b987ed88

You can add this by either:

  1. sudo kernel-stub -a "resume=UUID=..."
  2. edit the /etc/initramfs-tools/conf.d/resume file and add:

    resume=UUID=ed8347ed-2eb4-40bc-bc77-cc53b987ed88

check you /var/log/syslog file for something like this:

Aug  4 22:26:42 pop-os /usr/bin/kernelstub[19639]: kernelstub           : DEBUG    kopts: root=UUID=b37019a8-91f5-445f-94c1-7359a49ed5df ro quiet loglevel=0 systemd    .show_status=false resume=UUID=ed8347ed-2eb4-40bc-bc77-cc53b987ed88

If the resume is missing or wrong then you'll need to update your boot kernel again.

1
  • In my setup /etc/initramfs-tools/conf.d/resume doesn't work: it doesn't change kernel boot parameter. What works is setting it from kernel command line (in /etc/default/grub). How /etc/initramfs-tools/conf.d/resume is meant to work?
    – midenok
    Jun 9, 2022 at 7:41
0

Apart from setting up swap resume point in grub mentioned in Sam73's answer, I found that my Ubuntu 18.04 also needs to install laptop-mode-tools:

$sudo apt install laptop-mode-tools

then change ENABLE_LAPTOP_MODE_ON_AC=1 in the config file:

$sudo vim /etc/laptop-mode/laptop-mode.conf

start laptop-mode with:

$sudo laptop_mode start

P.S. You could check if laptop starts or not with

$cat /proc/sys/vm/laptop_mode

If it prints 0, the laptop_mode is not working, otherwise, it indicates it works fine.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .