分享

[ARTS

 牛厨馆 2021-12-23

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
# 启用swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# 确认结果
sudo swapon --show
free

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

内存 关闭休眠时swap空间大小 启用休眠时swap空间大小 最大swap空间大小
4GB 2GB 6GB 8GB
8GB 3GB 11GB 16GB
12GB 3GB 15GB 24GB
16GB 4GB 20GB 32GB
24GB 5GB 29GB 48GB
32GB 6GB 38GB 64GB
64GB 8GB 72GB 128GB
  1. 文件系统启动时挂载/swapfile
echo '/swapfile swap swap defaults 0 0' | sudo tee -a /etc/fstab
  1. 配置启动内核参数
# 查看swapfile的UUID
sudo 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
# 编辑initramfs
sudo 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界面

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

    首先安装Hibernate Status Button插件

    然后增加如下配置文件

# 新建配置文件
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.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

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

来源:oschina

链接:https://my.oschina.net/wang7x/blog/4934585

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多