很长一段时间以来,我
echo disk > /sys/power/state
为了休眠/dev/sda10
,我使用我的 Debian 发行版的 initrd 来恢复。
但最近,我换了一个 raid 阵列需要我使用完全自定义的 initramfs (我必须从头开始构建它,因为修改现有的 initrd 的尝试没有成功)为了在挂载根分区之前设置 raid 阵列。
有两种方法可以恢复:内核可以使用resume=
内核参数直接读取交换文件系统(并且它将在启动 init 之前恢复) ;或者需要一些用户空间(例如加载模块)以便能够访问交换分区。
那么,从 /dev/mapper/isw_qfyzrvbsusf_Volume0p9
?
答案1
简短的回答是 /sys/power/resume
答案要长得多,因为这本身不会有什么用处。大多数发行版都建议从 init / PID 1 进程(早期用户空间)启动恢复。但是,说明几乎总是会通知您在引导加载程序中添加带有恢复目标的内核命令行参数。这样做的原因是,在几乎所有情况下,initramfs 构建工具(dracut / mkinitcpio / initramfs-tools)本身都是由配置中的该参数触发的。
根据您的示例和发行版,我假设您正在使用低级内核挂起接口 (swsusp)。还有许多其他实用程序可用于启动挂起过程;它们基本上都是第一项 swusp 的包装器。
- 蘇格蘭- 低级内核接口;用户空间接口是通过 sysfs
- 韋斯威普- 低级用户空间软件暂停包装器 - 提供 s2disk、s2ram 实用程序(未主动维护)
- pm-实用程序- 用于配置流程的高级脚本
- systemd-暂停- 在 systemd 系统上有一个可用的挂起目标,它将通过内核接口启动挂起操作。
恢复配置
使用 initramfs 映像的 Linux 启动顺序的简单概述如下:
[BIOS] ==> [引导加载程序] ==>[临时 rootfs 上的内核 - initramfs] ==> [rootfs 上的内核 - 驱动器]
在 initramfs 阶段结束时有一个小窗口,恢复可以在此发生;在内核启动 PID 1(systemd 或 init)之后,加载 raid 的驱动程序,但在安装实际驱动器之前。
我提供了一个典型恢复配置的示例。这假设您提供的恢复路径是交换分区;而不是包含交换文件的“正常”分区。交换文件需要额外的配置。systemd 方法不同 - 它使用基于 resume.target 的 udev 规则来触发恢复过程。如果更传统的引导加载程序/initramfs 映像方法不起作用,则值得研究。这与基于 init 的系统执行的方式直接相关;但手动插入您自己的脚本并正确获取相互依赖关系/相对时间有点棘手。
最重要的是,触发恢复的时间点是在内核挂载“真实”硬盘之前。因此,如果内核可以挂载整个文件系统,那么它也具备挂载交换分区所需的所有能力和信息。
确保您的交换分区通过 fstab 安装;dracut initramfs 工具会专门查找它,如果交换分区不存在,则不会包含恢复模块。
配置引导加载程序
假设你正在使用 grub2,你需要在 更新你的 grub 镜像中附加resume=/dev/mapper/isw_qfyzrvbsusf_Volume0p9
到字段,通常使用命令:GRUB_CMDLINE_LINUX_DEFAULT
/etc/default/grub
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
重建 initramfs
您需要重建具有恢复功能的 initramfs 映像(以及您已经进行的 raid 修改)。Debian 提供 dracut 和 initramfs-tools 来生成 initramfs。必须使用 resume 模块重新生成它。使用 dracut,添加命令行参数--add resume
。使用update-initramfs
,将条目添加resume=/dev/mapper/isw_qfyzrvbsusf_Volume0p9
到配置文件/etc/initramfs-tools/conf.d/resume
应该就是这样;假设我对您的配置做出了一些正确的假设。
编辑;假设您可以正确计时,您可以从 init 脚本将交换分区的主/次设备号回显到 /sys/power/resume 以触发恢复。您的 initramfs(或 initd)映像需要具有恢复支持,否则该 sysfs 项及其代表的功能将不存在。请参阅https://bugs.launchpad.net/ubuntu/+source/initramfs-tools/+bug/983805
答案2
该文件是/sys/power/resume
。
为了触发恢复,必须将设备的主版本号和次版本号写入该文件。因此,以下命令可以实现这一点:
echo `stat -c %t /dev/mapper/isw_*_Volume0p9`\:`stat -c %T /dev/mapper/isw_*_Volume0p9` > /sys/power/resume