Linux

核心如何掛載根分區?

  • November 20, 2018

我的問題是關於從單獨的 /boot 分區引導 Linux 系統。如果大多數配置文件都位於單獨的 / 分區上,核心如何在啟動時正確掛載它?

對此的任何詳細說明都會很棒。我覺得好像我缺少一些基本的東西。我最關心的是操作的過程和順序。

謝謝!

編輯:我認為我需要問的更多的是根核心參數中使用的 dev 文件的行。例如,假設我將根參數設置為 root=/dev/sda2。核心如何有 /dev/sda2 文件的映射?

Linux 最初使用 ramdisk(稱為initrd,表示“INITial RamDisk”)作為/. 該磁碟上的內容足以找到真正的根分區(包括所需的任何驅動程序和文件系統模組)。它將根分區掛載到 上的臨時掛載點initrd,然後呼叫pivot_root(8)以交換根和臨時掛載點,使initrd位於要umount編輯的位置,而實際的根文件系統位於/.

在古代,核心被硬編碼以知道根 fs 的設備主要/次要編號,並在初始化所有內置於核心中的設備驅動程序後掛載該設備。該rdev實用程序可用於修改核心映像中的根設備編號,而無需重新編譯它。

最終,引導載入程序出現並可以將命令行傳遞給核心。如果root=參數被傳遞,它告訴核心根 fs 在哪里而不是內置值。需要訪問的驅動程序仍然必須內置到核心中。雖然該參數在目錄中看起來像一個普通的設備節點,但在根 fs 掛載之前/dev顯然沒有/dev目錄,因此核心無法在那裡查找 dev 節點。相反,某些眾所周知的設備名稱被硬編碼到核心中,因此可以將字元串轉換為設備編號。正因為如此,核心可以辨識類似的東西/dev/sda1,但不能辨識更奇特的東西,比如/dev/mapper/vg0-root卷 UUID。

後來,initrd圖片中出現了。與核心一起,引導載入程序會載入initrd映像,這是某種壓縮的文件系統映像(gzip 壓縮的 ext2 映像、gzip 壓縮的 romfs 映像、squashfs 最終占主導地位)。核心會將這個映像解壓縮到一個 ramdisk 中,並將該 ramdisk 掛載為 root fs。此映像包含一些額外的驅動程序和啟動腳本,而不是真正的init. 這些引導腳本執行各種任務來辨識硬體、啟動諸如 RAID 陣列和 LVM 之類的東西、檢測 UUID,並解析核心命令行以找到真正的根,現在可以通過 UUID、卷標和其他高級東西來指定。然後它將真正的根 fs 掛載到 中/initrd,然後執行pivot_root系統呼叫以進行核心交換//initrd,然後/sbin/init在真正的根上執行,然後解除安裝/initrd並釋放 ramdisk。

最後,今天我們有initramfs. 這類似於initrd,但不是載入到 ramdisk 中的壓縮文件系統映像,而是壓縮的 cpio 存檔。一個 tmpfs 被掛載為根目錄,並在那裡提取存檔。引導腳本沒有使用pivot_root被認為是骯髒的hack,而是將真正的根安裝在 中,刪除tmpfs 根中的所有文件,然後進入,然後執行。initramfs``/root``chroot``/root``/sbin/init

引用自:https://unix.stackexchange.com/questions/9944