让运行ubuntu20.04的笔记本电脑实现关闭盖子自动休眠

背景

我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分区
  1. 备份资料
  2. 插上安装盘重启,因为resize2fs不能操作已挂载的文件系统!
  3. resize2fs /dev/sda2 N将主分区的ext4文件系统从M缩小成N,
  4. fdisk删除主分区,再重建大小为N的新的主分区
  5. 将腾出来的N-M空间创建成swap分区,写入分区表,退出fdisk
  6. 拔掉安装盘,重启
  7. 执行sudo mkswap /dev/sda3初始化交换分区
  8. 执行sudo blkid | grep swap获得swap分区的UUID,注意不是PARTUUID
  9. 将分区添加到/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的笔记本电脑休眠后唤醒画面

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值