linux 定时休眠的实现思路

2019-01-16 21:37:13于海丽

除此创建交换分区之外,我们还需要修改kernel的启动参数,让系统在启动时先尝试从交换空间中恢复状态。 具体操作如下:

1. 如果使用交换分区来保存,则只需要为添加kernel的启动参数 resume=交换分区 即可

(1) 查看那块分区是交换分区

swapon

NAME TYPE SIZE USED PRIO /dev/sda2 partition 8G 280K -2 /swapfile file 5G 0B -3

可以看出交换分区为 /dev/sda2

(2) 修改 /etc/default/grub, 为 GRUB_CMDLINE_LINUX_DEFAULT 行添加参数 resume=/dev/sda2

sudo sed -i '/GRUB_CMDLINE_LINUX_DEFAULT/ s!"$! resume=/dev/sda2"!' /etc/default/grub

2. 如果是使用交换文件,则需要添加两个参数 resume=交换文件所在磁盘 以及 resume_offset=交换文件在磁盘中的偏移位置:

(1) 查看交换文件所在磁盘

df /swapfile

文件系统          1K-块     已用     可用 已用% 挂载点
/dev/sda3      55253696 27582224 24834972   53% /

说明磁盘为 /dev/sda3

(2) 查看交换文件的偏移位置

sudo filefrag -v /swapfile|head -5 Filesystem type is: ef53 File size of /swapfile is 5368709120 (1310720 blocks of 4096 bytes) ext: logical_offset: physical_offset: length: expected: flags: 0: 0.. 32767: 4653056.. 4685823: 32768: 1: 32768.. 65535: 4685824.. 4718591: 32768:

这里可以看出物理偏移位置时4653056

(3) 修改 /etc/default/grub, 为 GRUB_CMDLINE_LINUX_DEFAULT 行添加参数 resume=/dev/sda3 resume_offset=4653056

sudo sed -i '/GRUB_CMDLINE_LINUX_DEFAULT/ s!"$! resume=/dev/sda3 resume_offset=4653056"!' /etc/default/grub

3. 重新生成 grub.cfg 文件

sudo grub-mkconfig -o /boot/grub/grub.cfg

(1) 配置initramfs添加 resume hook 修改 /etc/mkinitcpio.conf 文件,在 HOOKS 中添加 resume

sudo sed -i '/^HOOKS=/ s/)/ resume)/' /etc/mkinitcpio.conf

其中由两点需要注意:

由于分区的label和UUID都是 udev 分配的,因此 resume 必须放在 udev 之后 由于 systemd hook 已经有了 resume 的功能,因此若已经有了 systemd hook,则无需再添加 udev hook

(2) 重新生成initramfs

sudo mkinitcpio -g /boot/initramfs-linux-lily.img ==> Starting build: 4.16.12-2-lily -> Running build hook: [base] -> Running build hook: [udev] -> Running build hook: [autodetect] -> Running build hook: [modconf] -> Running build hook: [block] -> Running build hook: [filesystems] -> Running build hook: [keyboard] -> Running build hook: [fsck] -> Running build hook: [resume] ==> Generating module dependencies ==> Creating gzip-compressed initcpio image: /boot/initramfs-linux-lily.img ==> Image generation successful