Linux

自定義 initrd 初始化腳本:如何創建 /dev/initctl

  • January 9, 2015

我有一台配備兩個 IDE 硬碟(/dev/hda 和 /dev/hdb)的虛擬機(VMM 是 Xen 3.3)。根文件系統位於 /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。

將不勝感激任何幫助或指示。謝謝。

正如 phresus 回答的那樣,init創建/dev/initctl.

我遇到的問題是我的/linuxrc腳本沒有在 PID 1 下執行。因此,當它執行時init,它也沒有在 PID 1 下執行。init沒有像 PID 1 一樣執行telinit

/linuxrc使用 PID 1 執行,我需要在核心引導行中添加以下內容: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)

耶!順便說一句,將我自己的答案標記為“答案”是否符合規定?

如果您已經在使用虛擬化解決方案,為什麼還要經歷這些麻煩?最簡單的解決方案是在您的主機上使用 LVM 之類的東西,它已經支持快照,並向您的 VM 提供快照。那是:

  • 創建一個邏輯卷(LV)來保存你的根文件系統。
  • 創建此 LV 的快照
  • 將您的 VM 配置為從快照啟動。

如果您想恢復到干淨的文件系統,請刪除快照並重新創建它。很簡單,而且無需擺弄 initrd 或 aufs —— 事實上,它不需要對客戶作業系統進行任何修改。

引用自:https://serverfault.com/questions/95037