你什麼時候會在 switch_root 上使用 pivot_root?
我想更好地了解 Linux 初始化過程,以便通過 ceph 而不是 nfs 對系統進行網路引導。
在此過程中,我遇到了兩種切換 root 的形式。一個稱為switch_root,另一個稱為pivot_root。這些腳本從使用 pxe 引導過程通過 tftp 獲得的記憶體文件系統 (initramfs) 執行。
您什麼時候會使用其中一種?我已經看到在一些 init 腳本中都使用了它們,它們都放在 root 中。
我在這裡找到了一個很好的解釋。但是,讓我嘗試以我在答案中理解的更簡短的格式。
較短的版本
- 當系統啟動時,它需要一個早期的使用者空間。它可以使用 initramfs 或 initrd 來實現。
- initrd被載入到 ramdisk 中,這是一個實際的 FILE SYSTEM。
- initramfs不是文件系統。_
- 使用initrd
pivot_root
和使用initramfsswitch_root
。更長的版本
現在,詳細解釋我上面所說的內容。
雖然 initramfs 和 initrd 的用途相同,但有兩個不同之處。最明顯的區別是將 initrd 載入到 ramdisk 中。它由安裝在 ramdisk 中的實際文件系統(通常是 ext2)組成。另一方面,initramfs 不是文件系統。它只是一個(壓縮的)cpio 存檔(類型為 newc),它被解壓縮到 tmpfs 中。這樣做的副作用是使 initramfs 更加優化,並且能夠在核心引導過程中比 initrd 更早地載入。此外,記憶體中 initramfs 的大小更小,因為核心可以根據實際載入的內容調整 tmpfs 的大小,而不是依賴於預定義的 ramdisk 大小,
還有另一個副作用差異:如何處理根設備(以及切換到它)。由於 initrd 是解壓到 ram 中的實際文件系統,因此根設備實際上必須是 ramdisk。對於 initramfs,有一個核心“rootfs”,它成為將 initramfs 解壓縮到的 tmpfs(如果核心載入了 initramfs;如果沒有,那麼 rootfs 只是通過 root= 核心引導參數指定的文件系統),但是不應將此臨時 rootfs 指定為 root= 引導參數(並且沒有辦法這樣做,因為沒有附加設備)。這意味著在使用 initramfs 時,您仍然可以將真正的根設備傳遞給核心。使用 initrd,您必須自己處理真正的根設備。此外,由於“真實” 帶有 initrd 的根設備是 ramdisk,核心必須真正將根設備從一個真實設備(ramdisk)切換到另一個(你的真實根)。對於 initramfs,initramfs 空間(tmpfs)不是真實設備,因此核心不會切換真實設備。因此,雖然命令 pivot_root 與 initrd 一起使用,但必須對 initramfs 使用不同的命令。Busybox 提供了 switch_root 來完成這個,而 klibc 提供了 new_root。initramfs 必須使用不同的命令。Busybox 提供了 switch_root 來完成這個,而 klibc 提供了 new_root。initramfs 必須使用不同的命令。Busybox 提供了 switch_root 來完成這個,而 klibc 提供了 new_root。