我有一个装有两个IDE HDD(/ dev / hda和/ dev / hdb)的虚拟机(VMM是Xen 3.3)。 根文件系统位于/ dev / hda1,其中安装了Scientific Linux 5.4。 / dev / hdb包含一个空的ext2文件系统。
我想通过使用aufs(AnotherUnionFS)来保护根文件系统免受虚拟机的写入,从而在根文件系统之上分层写入一个可写的文件系统。 /的更改将写入位于/ dev / hdb的文件系统。 (此外,在虚拟机之外,支持/ dev / hda的文件也将被设置为只读权限,所以VMM也应该防止虚拟机在该级别修改。)(此设置的目的:能够使用软件实现的故障注入破坏虚拟机,但保留文件系统映像以便快速将VM重新引导到无故障状态。)
如何获得一个initrd初始化脚本来执行必要的挂载来创build联合文件系统?
我已经尝试了两种方法:
我试过修改mkinitrd创build的nash脚本,但是我不知道setuproot和switchroot做了什么,以及如何让它们使用我的aufs作为新的根。 显然, 这里没有人知道。 (编辑:我拿回来。)
我试过build立一个LiveCD(使用linux-live-6.3.0),然后从生成的initrd修改Bash / linuxrc脚本,我得到了正确的安装,但是最终/ sbin / init抱怨/ dev / initctl 。
具体来说,我的/ linuxrc在/ union加载aufs。 / 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”创build它,但是然后init抱怨超时打开或写入FIFO。
将不胜感激任何帮助或指针。 谢谢。
如果您已经在使用虚拟化解决scheme,那么为什么要经历这些麻烦? 最简单的解决scheme是在您的主机上使用LVM等已经支持快照的应用程序,并向您的虚拟机显示快照。 那是:
如果您想恢复到干净的文件系统,请删除快照并重新创build它。 很容易,而且不用关心initrd或aufs – 事实上,它不需要对客户操作系统进行任何修改。
当phresus回答, init创build/dev/initctl 。
我遇到的问题是我的/linuxrc脚本没有运行PID 1.因此,当它执行init ,它也没有运行PID 1. init没有运行,因为PID 1的行为像telinit 。
要让/linuxrc在PID 1下运行,我需要在内核引导行上input以下内容: root=/dev/ram0 rw init=/linuxrc ,如本论坛所述 。
现在它都在工作。 在VM启动的情况下, 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)
好极了! 顺便说一句,把我自己的答案标记为“答案”是否是犹太人?
Init本身通常创buildinitctl。 但是,您需要以下内容:
/etc/inittab 必须包含一个initdefault条目。 其次,将/dev重新挂载到适当的根目录后,将SIGUSR1发送到init,这将强制init重新读取configuration。
正确的解决scheme是将ZFS用于虚拟机。 在做实验之前,制作一个快照。 只需要less于一秒钟和一个短行命令:zfs快照(您的卷)快照名称。 那么你可以做任何事情,甚至格式化音量。 现在你想恢复。 一行简短命令:zfs回滚thesnapshotname。 如果确实格式化了卷,则需要一段时间才能回滚,否则,需要几秒钟才能完成回滚操作。 快照之后的所有更改都将消失。