写点什么

Ubuntu 20.04 启用休眠 (Hibernate) 配置过程

发布于: 2021 年 04 月 21 日
Ubuntu 20.04 启用休眠(Hibernate)配置过程

最近经常带笔记本回家工作,每次都需要先关闭打开的虚拟机、资料文档和开发环境,回家之后再打开,特别繁琐,所以研究了下 Ubuntu 20.04(20.10)如何配置休眠模式。

基础

广义来讲,在 Linux 中支持三种睡眠模式,分别是:


  • Suspend to RAM,即狭义的挂起(Suspend),本文后面提到挂起都是指这种模式。

  • Suspend to Disk,即我们常说的休眠(Hibernate)。

  • Suspend to Both,也被称作 Hybrid Suspend,是上面两种模式的混合,兼具两种模式的优点(和缺点)。


Ubuntu 桌面版默认只有挂起(Suspend)模式,没有启用休眠(Hibernate)模式。


挂起和休眠的目标都是保存冻结系统当前状态,后续需要时“快速”唤醒恢复,但是两者的实现方式是不同的。


挂起时系统的运行数据仍然保存在内存(RAM,通常也叫 MEM)中,所以系统还是会以较低的功耗消耗电池电量。这种状态下唤醒系统恢复非常快速,在普及 SSD 的现在是包括苹果在内很多操作系统的默认选项。


休眠时系统的运行数据被写入磁盘(DISK),系统也会完全切断电源(大部分情况下),唤醒时需要先从硬盘读取数据到内存,因为恢复速度比挂起慢,实测甚至要慢于开机(20s vs 10s)。


休眠的好处就是笔记本实际是关机状态,完全不耗电不发热,不用担心意外断电、进水和误触键盘唤醒系统,可以放心的携带和保存。


Linux 底层有两种实现来支持挂起和休眠,一种是内核(kernel)自带的 swsusp,另一种是 uswsusp('Userspace Software Suspend') ,后者封装了前者,并且提供了更多的功能,通常 swsusp 已经够用了。


swsusp 的原理是向/sys/power目录中的文件写入特定的状态字符串来操作系统的状态。


最重要的是/sys/power/state/sys/power/mem_sleep/sys/power/disk三个文件,分别保存了当前系统支持的睡眠模式、挂起方法、休眠方法,具体信息可以参考官方文档


Systemd 工具提供了睡眠管理的高级命令systemctl suspendsystemctl hibernatesystemctl hybrid-sleep

配置

  1. 配置/swapfile,启用休眠需要比内存稍大的 swap 空间,推荐使用 swapfile,从 2.4 内核开始,swapfile 的性能已经不弱于 swap 分区,并且更容易调整大小,如果使用 btrfs 文件系统,需要内核升级到 5.0 以上才支持 swapfile



# 先关闭已有的swap空间sudo swapoff -a# 分配连续的磁盘空间,fallocate比dd命令更安全快速,空间大小参考后面的表格sudo fallocate -l 20G /swapfile# 修改权限sudo chmod 600 /swapfile# 启用swapfilesudo mkswap /swapfilesudo swapon /swapfile# 确认结果sudo swapon --showfree
复制代码


swap 文件的大小可以参考下面的表格



  1. 文件系统启动时挂载/swapfile


echo '/swapfile swap swap defaults 0 0' | sudo tee -a /etc/fstab
复制代码


  1. 配置启动内核参数


# 查看swapfile的UUIDsudo findmnt -no UUID -T /swapfile# 查看swap_file_offset,忽略..符号sudo filefrag -v /swapfile | awk '{ if($1=="0:"){print substr($4, 1, length($4)-2)} }'# 编辑grub文件sudo nano /etc/default/grub# 将grub文件中GRUB_CMDLINE_LINUX_DEFAULT参数修改为如下形式# 其中UUID和resume_offset的值更换为上面两个命令的输出GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=UUID=51f8eab4-d775-4020-aace-0e411ef5b8ed resume_offset=34816"# 保存退出,然后更新grub配置sudo update-grub# 编辑initramfssudo nano /etc/initramfs-tools/conf.d/resume# 加入下面一行,UUID替换为实际值resume=UUID=51f8eab4-d775-4020-aace-0e411ef5b8ed# 保存退出,然后更新initramfs配置sudo update-initramfs -u# 重启reboot
复制代码


重启后执行sudo systemctl hibernate测试是否可以正常休眠。


  1. 配置 Gnome 界面

  2. 这时休眠功能已经生效,但是每次都需要输入命令太繁琐,我们需要配置Gnome界面按钮

  3. 首先安装Hibernate Status Button插件

  4. 然后增加如下配置文件


# 新建配置文件sudo nano /etc/polkit-1/localauthority/50-local.d/com.ubuntu.enable-hibernate.pkla# 添加以下内容并保存[Re-enable hibernate by default in upower]Identity=unix-user:*Action=org.freedesktop.upower.hibernateResultActive=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-inhibitResultActive=yes
复制代码


重启后可以在菜单中看到挂起和休眠按钮了。


访问作者技术博客浏览更多文章


发布于: 2021 年 04 月 21 日阅读数: 158
用户头像

吃货开发者的探索 2014.08.16 加入

金融科技架构师

评论

发布
暂无评论
Ubuntu 20.04 启用休眠(Hibernate)配置过程