关机时返回 initramfs

关机时返回 initramfs

我有自己的 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.

  1. 进行备份,以防出现问题(例如系统无法启动)。

  2. 切换到dracut(而不是initramfs-tools)。

    sudo apt update sudo apt install --no-install-recommends dracut

  3. 自定义写的dracut模块将被要求。

  4. 钩子dracut cleanup需要运行dracut函数need_shutdown

这会导致dracut创建文件/run/initramfs/.need_shutdown.

在关机时/lib/systemd/system/dracut-shutdown.service运行/usr/lib/dracut/dracut-initramfs-restore,这将恢复 initramfs 并进入其中。

  1. dracut shutdown需要一个钩子。如果实现,它将在 initramfs 内的关闭过程中很晚执行。

cold-boot-attack-defense是一个dracut示例模块,可以完成所有这些工作。

参考:

全面披露:

cold-boot-attack-defense是我开发的。

使用 来执行此操作怎么样initramfs-tools

您必须自己为 实现类似的机制initramfs-tools尾巴就是这么做的。。模拟这一点可能比执行上面描述的操作要困难得多dracut。或者也许是发布的解决方案initramfs-toolsDebian 功能请求:支持在关机时恢复 initrd 并转向它 在使用时提供更简单的路径initramfs-tools。然而,使用起来dracut会更容易,因为这是dracut默认功能。

相关内容