背景
我2013年买的笔记本太老了,机械硬盘,win10体验很不好,于是切换成ubuntu 20.04。
切换后文档、图片的打开速度显著提升,看视频、玩dota2的流畅度也没有丝毫下降,唯一不爽的就是每次关盖都不休眠,而是睡眠,需要解决。
申明,我是根据文章1以及文章2加上自己的实践得出操作步骤,前者适用于装Ubuntu时手动创建了swap分区
的情况,后者适用于默认安装(只有swapfile
没创建swap分区)的情况。
首先实现敲命令休眠
Linux实现休眠的总体思路是将内存数据以镜像的形式dump到swap分区或swapfile,然后关闭电源,再次开机时,从swap分区加载数据到内存,再恢复执行。
其中有一些细节需要注意,就是让GRUB和ramdisk知道唤醒时从哪里加载之前保存的内存镜像。
创建swap分区并初始化
文章1建议用swap分区而不是swapfile,原因是备份主分区时不用操心排除swapfile,当然最终选择在你。
貌似Ubuntu默认的swapfile只有2GB,大概率不够,需要重建一个大尺寸的,具体操作方法请点开文章2贴的参考链接。
如果你默认安装且不想冒险(我还没试过!)
如果你的swapfile不够大,则按下面方法重建个大的,够大直接下一步:
sudo fallocate -l 16G /swapfile # 16G不够可以再扩
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
sudo vim /etc/fstab # 如果fstab没有下面这行,就将下面这行添加
/swapfile none swap default 0 0
获取swapfile在分区的起始block number
sudo filefrag -v /swapfile | sed -n '4p' | awk '{print $4+0}'
548832 <-- 上面命令行输出的数字就是swapfile的起始block number
如果你默认安装但想改用swap分区
- 备份资料
- 插上安装盘重启,因为resize2fs不能操作已挂载的文件系统!
- 用
resize2fs /dev/sda2 N
将主分区的ext4文件系统从M缩小成N, - 用
fdisk
删除主分区,再重建大小为N的新的主分区 - 将腾出来的N-M空间创建成swap分区,写入分区表,退出fdisk
- 拔掉安装盘,重启
- 执行
sudo mkswap /dev/sda3
初始化交换分区 - 执行
sudo blkid | grep swap
获得swap分区的UUID
,注意不是PARTUUID
- 将分区添加到
/etc/fstab
,确保下次开机自动挂载swap分区,省得每次敲sudo swapon -a
- 获取swap分区的UUID:
wanghaipeng@ubuntu:~/F266/7569_64$ blkid|grep swap
/dev/sda5: UUID="22b7d10b-4e46-46e1-a040-e7d405d752b8" TYPE="swap" PARTUUID="34c6698d-05"
- 添加swap分区到
/etc/fstab
(我选择注释掉默认配置的swapfile):
#/swapfile none swap sw 0 0
UUID=22b7d10b-4e46-46e1-a040-e7d405d752b8 none swap sw 0 0
如果你很明智在安装时就创建了swap分区
恭喜,省了上面的危险操作,直接执行sudo blkid | grep swap
获得swap分区的UUID
,进入下一步
给GRUB指定resume参数并更新grub.cfg
给GRUB添加resume参数,以告知唤醒时从哪个分区加载内核
sudo vi /etc/default/grub # 仅修改下面这行
GRUB_CMDLINE_LINUX_DEFAULT="resume=UUID=22b7d10b-4e46-46e1-a040-e7d405d752b8"
如果是swapfile,还要额外指定resume_offset参数
GRUB_CMDLINE_LINUX_DEFAULT="resume=/dev/sda2 resume_offset=548832"
这2个参数都要替换成你自己的值!
更新grub.cfg
sudo update-grub
上面命令执行后会生成新的grub.cfg
给update-initramfs指定resume参数并更新initrd.img
给update-initramfs指定resume参数
sudo vi /etc/initramfs-tools/conf.d/resume # 仅写入下面这一行
RESUME=UUID=22b7d10b-4e46-46e1-a040-e7d405d752b8
如果是swapfile,请自己检查update-initramfs是否需要额外配置!
重新生成支持唤醒的initrd.img
sudo update-initramfs -c -k all
安装pm-utils和hibernate软件包
sudo apt install pm-utils hibernate
安装软件包后执行下面命令测试休眠效果
sudo systemctl hibernate
执行该命令后笔记本应该会休眠并关闭电源,如果没有,且提示以下错误:
Failed to hibernate system via logind: Not enough swap space for hibernation
说明你的swapfile或swap分区太小,需要扩容,swapfile扩容相对简单,删了重建个更大的即可,swap分区就要参考我前面的方法了。
然后实现关盖休眠
修改/etc/systemd/logind.conf
文件,在[Login]
部分添加如下行:
HandleLidSwitch=hibernate
HandleLidSwitchExternalPower=hibernate
HandleLidSwitchDocked=hibernate
参数的含义如下:
HandleLidSwitch - 盖子关闭时触发,下面的两种情况除外。
HandleLidSwitchExternalPower - 如果系统连接到外部电源,则在盖子关闭时触发。
HandleLidSwitchDocked - 如果系统插入扩展坞,或者连接了多个显示器,则在盖子关闭时触发。
保存退出后还不能关盖休眠,需要重启后才可以。
总结
发行版制造商从个人用户群体获益甚少,所以用户体验不佳是可以理解的,钱和时间,总得消耗其中一个。
休眠后的唤醒效果:
安装ubuntu20.04的笔记本电脑休眠后唤醒画面