我有自己的 initramfs 运行自己的 init 脚本。做了一些事情后,最后调用switch_root并执行系统的init脚本,该脚本挂载在/mnt中。
现在我想要回到 initramfs 的初始化脚本当 Linux 关闭时(因此 Linux 中的 init 脚本退出)
但因为我正在调用exec switch_root /mnt /blah/init
,所以脚本会在 Linux 关闭时终止。但我想在那之后在我的 initramfs 中做一些事情,这是不可能的。
我能做的是chroot /mnt
代替switch_root ...
,所以当 Linux 关闭时,我会回到 init 脚本中。但这有一个令人讨厌的副作用,即某些应用程序(例如 netctl)将拒绝工作,因为它们是从 chroot 系统内部调用的。
所以我需要的switch_root
是进入系统并最终返回 initramfs 的一种方法。
答案1
你可以pivot_root
代替switch_root
(这会删除所有内容!)。
如果你的 init 系统不会抱怨 not being pid 1
,那么你可能就完成了。
另一种解决方案是让你的 init 系统对pivot_root
自己足够好,变成......你怎么称呼它?关闭ramfs?这与 initramfs 无关,但与允许您执行关闭操作或其他操作的原理相同。
我认为没有标准的解决方案,因为很少需要在关闭时执行任何操作。
答案2
这可以使用dracut
.
进行备份,以防出现问题(例如系统无法启动)。
切换到
dracut
(而不是initramfs-tools
)。sudo apt update sudo apt install --no-install-recommends dracut
自定义写的
dracut
模块将被要求。钩子
dracut
cleanup
需要运行dracut
函数need_shutdown
。
这会导致dracut
创建文件/run/initramfs/.need_shutdown
.
在关机时/lib/systemd/system/dracut-shutdown.service
运行/usr/lib/dracut/dracut-initramfs-restore
,这将恢复 initramfs 并进入其中。
dracut
shutdown
需要一个钩子。如果实现,它将在 initramfs 内的关闭过程中很晚执行。
cold-boot-attack-defense
是一个dracut
示例模块,可以完成所有这些工作。
参考:
- https://github.com/Kicksecure/security-misc#cold-boot-attack-defense
- https://www.kicksecure.com/wiki/Dev/RAM_Wipe
/usr/lib/dracut/modules.d/40cold-boot-attack-defense
全面披露:
cold-boot-attack-defense
是我开发的。
使用 来执行此操作怎么样initramfs-tools
?
您必须自己为 实现类似的机制initramfs-tools
。尾巴就是这么做的。。模拟这一点可能比执行上面描述的操作要困难得多dracut
。或者也许是发布的解决方案initramfs-tools
Debian 功能请求:支持在关机时恢复 initrd 并转向它
在使用时提供更简单的路径initramfs-tools
。然而,使用起来dracut
会更容易,因为这是dracut
默认功能。