自定义 initrd 启动脚本:如何创建 /dev/initctl

自定义 initrd 启动脚本:如何创建 /dev/initctl

我有一台虚拟机(VMM 是 Xen 3.3),配备了两个 IDE HDD(/dev/hda 和 /dev/hdb)。根文件​​系统位于 /dev/hda1,其中安装了 Scientific Linux 5.4。/dev/hdb 包含一个空的 ext2 文件系统。

我想通过使用 aufs (AnotherUnionFS) 在根文件系统之上分层可写文件系统,保护根文件系统不被 VM 写入。对 / 的更改将写入位于 /dev/hdb 的文件系统。(此外,在 VM 外部,支持 /dev/hda 的文件也将设置为只读权限,因此 VMM 也应阻止 VM 在该级别进行修改。)(此设置的目的:能够使用软件实现的故障注入破坏虚拟机,但保留文件系统映像,以便快速将 VM 重新启动到无故障状态。)

如何获取 initrd 初始化脚本来执行创建联合文件系统所需的挂载?

我尝试过两种方法:

  1. 我尝试修改 mkinitrd 创建的 nash 脚本,但我不知道 setuproot 和 switchroot 的作用以及如何让它们使用我的 aufs 作为新根。显然,这里其他人也不知道。(编辑:我收回刚才的话。)

  2. 我尝试构建一个 LiveCD(使用 linux-live-6.3.0),然后从生成的 initrd 中修改 Bash /linuxrc 脚本,并且我得到了正确的挂载,但最终的 /sbin/init 对 /dev/initctl 有所抱怨。

具体来说,我的 /linuxrc 将 aufs 挂载在 /union。/linuxrc 的最后几行有效地执行了以下操作:

cd /union
mkdir -p mnt/live
pivot_root . mnt/live
exec sbin/chroot . sbin/init </dev/console >/dev/console 2>&1

当 init 启动时,它会输出类似 的内容init: /dev/initctl: No such file or directory。应该用什么来创建这个 FIFO?我在原始 linuxrc 和 liblinuxlive 脚本中没有找到这样的文件名。

我尝试通过“mkfifo /dev/initctl”创建它,但是 init 抱怨打开或写入 FIFO 超时。

非常感谢您的帮助或指点。谢谢。

答案1

如果您已经在使用虚拟化解决方案,为什么还要经历这么多麻烦?最简单的解决方案是在主机上使用 LVM 之类的东西,它已经具有快照支持,并向您的 VM 呈现快照。那就是:

  • 创建一个用于保存根文件系统的逻辑卷 (LV)。
  • 创建此 LV 的快照
  • 配置您的虚拟机以从快照启动。

如果您想恢复到干净的文件系统,请删除快照并重新创建。很简单,而且不需要摆弄 initrd 或 aufs —— 事实上,它不需要对客户操作系统进行任何修改。

答案2

正如 phresus 所回答的,init创建了/dev/initctl

我遇到的问题是我的/linuxrc脚本没有以 PID 1 运行。因此,当它执行时init,它也没有以 PID 1 运行。init不以 PID 1 运行的行为如下telinit

为了/linuxrc使用 PID 1 运行,我需要在内核启动行中添加以下内容:root=/dev/ram0 rw init=/linuxrc,如本论坛

现在一切正常。启动虚拟机后,输出mount

aufs on / type aufs (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)

太棒了!顺便问一下,把我自己的答案标记为“答案”是否正确?

答案3

Init 本身通常会创建 initctl。但是,您需要以下内容:

/etc/inittab 必须包含 的条目initdefault。其次,在 重新挂载到正确的根上SIGUSR1之后发送给 init /dev,这将强制 init 重新读取配置。

答案4

正确的解决方案是将 ZFS 用于虚拟机。在进行实验之前,请先创建快照。只需不到一秒钟的时间和一行简短的命令:zfs snap (your volume) snapname。然后您可以做任何事情,甚至格式化卷。现在您想要恢复。一行简短的命令:zfs rollback thesnapshotname。如果您确实格式化了卷,则需要一段时间才能回滚,否则,只需几秒钟即可完成回滚操作。快照后的所有更改都将消失。

相关内容