Creating a hibernate shortcut in Ubuntu 20.04

7 February 2021
Ben Talbot

Hibernating in Ubuntu has been a nuisance for as long as I can remember. And sadly 20.04 is no different. Each new Ubuntu release slightly improves the process, but we're still nowhere near the "working out of the box" experience enjoyed in other operating systems. A previous post covered getting hibernate working with s2disk, and this post will cover integrating hibernate with GNOME.

The good news is GNOME settings in Ubuntu 20.04 now explicitly has an entry for deciding what the power button can do:

GNOME Settings without the hibernate option

That's as far as the good news goes though, with hibernate missing from the list. I went digging into the corresponding gsettings key to see what options were available for the power-button-action:

ben@pc:~$ gsettings range org.gnome.settings-daemon.plugins.power \ power-button-action enum 'nothing' 'suspend' 'hibernate' 'interactive'

So 'hibernate' is a valid option, but not presented by GNOME settings' UI. Why? I tried setting it manually using gsettings (which confusingly then shows up as "2 seconds" in the GNOME's UI):

ben@pc:~$ gsettings set org.gnome.settings-daemon.plugins.power \ power-button-action hibernate

Still no joy—the setting seemingly had no effect on the power button's behaviour. I opened an issue with the GNOME team to see if they had any hints. A maintainer got back to me with a response explaining what was going on:

GNOME Settings hibernate button response

It seems systemd-logind needs to be explicitly told you can hibernate before the display manager (i.e. GNOME) will have permissions to execute the hibernation. Which makes sense.

Even if systemctl hibernate works, you still need to tell your login daemon about it.

Confirming your system can hibernate

Before telling the login daemon about hibernation, ensure your system actually can hibernate. To test this, run the hibernation service:

ben@pc:~$ systemctl hibernate

Your computer should go through the hibernate process, then turn off. Importantly, when turned back on all of your state should return (i.e. open windows, terminals, etc.).

If this doesn't happen, then your hibernate isn't working properly. My previous post picked apart getting hibernate working in Ubuntu 18.04. So if you're having troubles, I'd recommend heading there before continuing.

Telling the login daemon that you can hibernate

Ubuntu uses an implementation of PolicyKit called "Local Authority" for managing communications between privileged and unprivileged processes. PolicyKit is well documented if you want to dig further:

ben@pc:~$ man polkit

For allowing GNOME to request hibernation, we have to tell "Local Authority" our login daemon is allowed to hibernate. There is good documentation for "Local Authority" as well:

ben@pc:~$ man pklocalauthority

The key section is the description of where configuration changes should be made: we should use /etc/polkit-1/localauthority for local configuration, and 50-local-d for our usage. Combined with appropriate file naming, the following file needs to be created:

[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

Note: the permissions in these folders are pretty strict, so you'll probably have to use sudo -i when creating this file

Now you should be able to select hibernate in the GNOME settings interface without any issues (a reboot or logout may be required):

Hibernate option enabled in the GNOME settings menu

Done! You should now be able to hibernate using your power button.

I've used a hotkey in the past when I haven't been able to get the power button to work. If you're having troubles, or simply would prefer to use a hotkey, I've include the instructions below.

 Alternative: hibernating via a hotkey instead

This involves two parts: allowing hibernation without opening a password prompt, and configuring the hotkey. Thankfully, they're both relatively easy:

  1. Add an entry to /etc/sudoers which permits password-less execution of the hibernate command under root permissions. These days this should be done by creating a file in the /etc/sudoers.d/ directory to avoid directly editing /etc/sudoers. Remember to use visudo when editing the file:

    ben ALL=NOPASSWD: /usr/bin/systemctl hibernate

    Test this works by running sudo systemctl hibernate in a new terminal. The system should hibernate without prompting for a password.

  2. Then configure the hotkey in GNOME Settings as below:

Hibernate hotkey in GNOME, Ubuntu 20.04

The steps are getting fewer and fewer as the Ubuntu versions progress, but it is still more steps than it should be! Windows and Mac users have a kinder experience, maybe Ubuntu 22.04 will bring us up to scratch?

Let me know below if you liked this content, or found it valuable, using the buttons below.

Like this?

Loading ...

© Ben Talbot. All rights reserved.