How To Enable Hibernation On Ubuntu (When Using A Swap File)

Hibernate Linux

This article explains how to enable hibernation using systemd on recent Ubuntu releases when using a swap file (which is default for Ubuntu at least since version 18.04).

My laptop's battery drains quite fast while it's sleeping. I've tried some solutions / workarounds, like this one (except for me the problem wasn't that the laptop was losing half its energy overnight, but all of it in only a few hours), but to no avail. So I decided to enable the hibernate option (suspend to disk) and use that instead of the default sleep option (suspend to RAM), because it uses less power, so the laptop battery is not drained while not in use, albeit taking a bit longer to wake up from hibernation than from sleep. So here's how to do that.

The instructions below may work on other Linux distributions, but I only tested this on Ubuntu (it should work in the exact same way on any Debian-based and Ubuntu-based Linux distributions, including Pop!_OS, etc.). On non Debian-based Linux distributions you may need to use different commands for updating GRUB 2 (step 4) and regenerating initramfs (step 6) as these are Debian-specific commands.

It's also important to note that hibernation in Ubuntu is disabled because there are issues with it on some computers, so it might not work for everyone. There was a bit of a chatter about re-visiting hibernate on Ubuntu with the 20.10 release, but it remained disabled by default.


It's worth noting that you'll want to have a swap file at least as large as the computer's RAM (hibernation may or may not succeed if your computer has a swap file smaller than the system RAM). This article explains how to transition from a swap partition to a swap file - you can also use those instructions to create a bigger swap file. 

Also, these instructions won't work if you've specifically encrypted your swap. Since my laptop's swap is not encrypted, I'm not able to try this with an encrypted swap, so the instructions below are for unencrypted swap files only. But you should know that if you already have an encrypted root filesystem, all the files on it - including the swap file - will also be encrypted, and the instructions below work in that case.

To find out the size of your computer's swap, and if it uses a swap file or partition (you'll need to know this later on), you can use this command:

cat /proc/swaps

Here's an example with output from my laptop:

$ cat /proc/swaps
Filename	Type	Size		Used		Priority
/swapfile	file	8388604		3213700		-2

As you can see, under Type it says file, so my computer is using a swap file (and its path is /swapfile), and its size is 8388604 kilobytes (8,3 GB).

By default, Ubuntu uses a swap file for some time (at least starting with Ubuntu 18.04), so the instructions below will assume that's what you're using. In case you use a swap partition, use the UUID of the swap partition instead of the UUID of the partition on which the swap file is located in the instructions below, and don't add a swap file offset (resume_offset parameter) anywhere. Those are the differences between hibernating with a swap partition and a swap file.

You might also be interested in: 3 Tools To Display Linux Laptop Battery Information From the Command Line

How to enable hibernation on Ubuntu (when using a swap file)

1. Find out the UUID of the partition on which the swap file resides.

We'll need to add this to the GRUB file and initramfs resume file.

To find out the UUID of the partition on which your swap file is located, you can use the following command:

findmnt -no UUID -T /swapfile

(/swapfile is the path to the swap file, and may be different on your computer; use the exact path as returned by the cat /proc/swaps command). 

Example from my computer (with output):

$ findmnt -no UUID -T /swapfile


2. Find out and the swap file offset.

Next, we'll need to find out the swap file offset. Like the UUID, we'll need to add this to the GRUB file and initramfs resume file.

This can be done by running the following command:

sudo filefrag -v /swapfile

From this command's output, the first block of numbers from the "physical_offset" column is the swap file offset which you'll need later on. Only copy the numbers, and not the dots that follow the number block.

E.g. in my case, this is the output of the sudo filefrag -v /swapfile command:

$ sudo filefrag -v /swapfile
Filesystem type is: ef53
File size of /swapfile is 8589934592 (2097152 blocks of 4096 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..    6143:    4974592..   4980735:   6144:            
   1:     6144..    8191:    4982784..   4984831:   2048:    4980736:
   2:     8192..   10239:    4988928..   4990975:   2048:    4984832:
   3:    10240..   12287:    4997120..   4999167:   2048:    4990976:

In this example, the swap file offset is 4974592 (this is the first block of numbers from the psysical_offset column).

3. Edit the /etc/default/grub file in order to boot with the resume and resume offset kernel parameters.

It's very important to make sure your edits of this file are correct, or else your computer may fail to boot!

Open the /etc/default/grub file with a text editor as root, e.g. using the command below we'll open it using Nano command line text editor:

sudo nano /etc/default/grub

In this file, at the end of the GRUB_CMDLINE_LINUX_DEFAULT line, before the ending ", add the following: resume=UUID=UUID_FROM_STEP_1 resume_offset=SWAP_OFFSET_FROM_STEP_2. Replace the values with the UUID you've got under step 1 and the swap resume offset you've got under step 2.

To save the file and exit Nano, press Ctrl + o, then Enter, and then Ctrl + x.

Example. This is how the GRUB_CMDLINE_LINUX_DEFAULT line looks on my computer after I've added the swap UUID and swap offset:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=UUID=4a59c6a7-ca54-4e24-a362-3eac83bfe226 resume_offset=4974592"

4. Update the GRUB configuration.

To update GRUB 2 on Debian-based Linux distributions, all you have to do is run the following command:

sudo update-grub

5. Create (or edit if already exists) /etc/initramfs-tools/conf.d/resume with the swap UUID and resume offset.

Next, we need to edit (or create if it doesn't exist) the /etc/initramfs-tools/conf.d/resume file with a text editor as root. Use the command below to open this file with Nano command line editor:

sudo nano /etc/initramfs-tools/conf.d/resume

In this file, if you have a line beginning with "RESUME", edit that line, or if there's no such line (or the file is completely empty), add the line so that it looks like this:


To save the file and exit Nano, press Ctrl +o, then Enter, and then Ctrl + x.

Example with the contents of the /etc/initramfs-tools/conf.d/resume file from my laptop:

RESUME=UUID=4a59c6a7-ca54-4e24-a362-3eac83bfe226 resume_offset=4974592

6. Regenerate initramfs.

Now you need to regenerate initramfs using this command:

sudo update-initramfs -c -k all

7. Reboot your computer.

After rebooting, hibernate your computer using the following command:

sudo systemctl hibernate

For now, you need to provide your password to be able to hibernate, and there's no menu option to hibernate your computer, so you must do all that from the command line. To be able to hibernate your system without entering a password (and to have an option to hibernate the computer in your desktop's power option (e.g. in an applet on the panel)), see the next 2 steps.

To resume from hibernation, press the power button on your computer.

If you get an error when running this command, saying "Failed to hibernate system via logind: Not enough swap space for hibernation", then you may have missed the notice near the top of the article in which I mention that it's best to have a swap file at least as large as your computer's RAM. This article explains how to transition from a swap partition to a swap file - you can also use those instructions to create a bigger swap file. 

You can check for errors related to the systemd Hibernate service using:

systemctl status systemd-hibernate.service

8. Optional. Allow hibernation without entering a password (required for the next step). On some desktop environments, this re-enables the Hibernate and Hybrid Sleep power menu options.

By default, to hibernate your computer, you'll need to enter your password. To allow hibernation without a password, create / open /etc/polkit-1/localauthority/10-vendor.d/com.ubuntu.desktop.pkla with a text editor as root.

Using the command below will open /etc/polkit-1/localauthority/50-local.d/com.ubuntu.desktop.pkla as root using Nano command line editor:

sudo nano /etc/polkit-1/localauthority/50-local.d/com.ubuntu.desktop.pkla

In this file, paste the following:

[Enable hibernate in upower]

[Enable hibernate in logind]

Now save the file and exit Nano (press Ctrl + o, then Enter, and then Ctrl + x).

On some desktop environments, after doing this (and after a logout / re-login) you'll get the Hibernate and Hybrid Sleep power options. Here's an example with the Xfce power options after following this step:

This doesn't work on some desktop environments using Ubuntu though, like with GNOME Shell. In that case, we'll need an extra step (see below).

this is via AskUbuntu

9. Optional. Add a Hibernate applications menu entry or use a hibernate status button for GNOME Shell.

If you use GNOME Shell, you can use an extension which adds an option to hibernate your computer in the system power menu from the top bar, called Hibernate Status Button.

Here's the Power Off / Logout GNOME Shell menu with this extension enabled:

Hibernate menu GNOME Shell

If you don't use GNOME Shell, but your desktop environment doesn't show a Hibernate power option, or you don't want to use the above-mentioned GNOME Shell extension, you can create an entry in your applications menu by creating a file called hibernate.desktop in ~/.local/share/applications/, e.g. open Nano command line text editor with this file:

nano ~/.local/share/applications/hibernate.desktop

And in this file add the following:

[Desktop Entry]
Name=Hibernate desktop
GenericName=Hibernate desktop
Comment=Enter hibernation
Exec=systemctl hibernate

You will now be able to go into your desktop's applications menu and click on the Hibernate icon to hibernate your system. For this to work, you need to follow the optional step 9 from above in order to be able to hibernate without entering the password.

I should also clarify what's with the Hybrid Sleep option. Besides sleep / suspend (suspend to RAM) and hibernate (suspend to disk), there's also the option of Hybrid Sleep (also called Hybrid Suspend) which starts by putting your computer to sleep, then transitioning to hibernation after a given amount of time. You can set the hybrid sleep time between suspend and hibernation (along with other options) by editing the /etc/systemd/sleep.conf file, then rebooting your system. For more on this, see the Arch Wiki.

You might like: How To Enable Hardware Accelerated Video Decode In Google Chrome, Brave, Vivaldi And Opera Browsers On Debian, Ubuntu Or Linux Mint