天天看點

linux檔案系統初始化過程(6)---執行init程式一、目的 二、建立磁盤裝置檔案 三、挂載磁盤檔案系統 四、切換根檔案系統 五、最終VFS視圖 六、總結

    核心加載完initrd檔案後,為挂載磁盤檔案系統做好了必要的準備工作,包括挂載了sysfs、proc檔案系統,加載了磁盤驅動程式驅動程式等。接下來,核心跳轉到使用者空間的init程式,由init完成建立磁盤裝置檔案、加載磁盤檔案系統、從rootfs切換到磁盤根檔案系統等工作。

    由于在不同的linux發行版中,init的實作方式差異很大,不能将所有的發行版都分析一遍,是以本文選取ubuntu12.04發行版來描述如何從rootfs切換到磁盤根檔案系統。

    init程式使用udev工具動态的建立磁盤裝置檔案。udev的工作原理是根據sysfs中的裝置資訊,在/dev目錄下建立相應的裝置檔案,是以需要提前準備好sysfs檔案系統。

    首先,建立必要的挂載點目錄/dev、/root、/sys、/proc等;然後,将VFS中的sysfs挂載到rootfs的/sys目錄下,将tmpfs挂載到/dev目錄下(/dev的檔案系統類型為tmpfs);最後,為了輸出列印資訊,建立了/dev/console、/dev/null兩個特殊的裝置檔案。

    這些必要資訊準備好後,就可以啟動udev背景程序,由udev根據sysfs動态的建立磁盤裝置檔案。Udev啟動代碼在scripts/init-top/udev中。

linux檔案系統初始化過程(6)---執行init程式一、目的 二、建立磁盤裝置檔案 三、挂載磁盤檔案系統 四、切換根檔案系統 五、最終VFS視圖 六、總結
linux檔案系統初始化過程(6)---執行init程式一、目的 二、建立磁盤裝置檔案 三、挂載磁盤檔案系統 四、切換根檔案系統 五、最終VFS視圖 六、總結

    磁盤檔案系統的挂載一般有兩種方式:本地方式和網絡方式。根據BOOT變量的值,init選擇執行本地加載或者網絡加載,如果是本地加載則執行/scripts/local腳本;如果是網絡加載則執行/scripts/nfs腳本。個人pc一般都是本地加載,資料中心的伺服器一般是nfs加載。

    最後,由init程式調用/scripts/local腳本挂載磁盤檔案系統。

linux檔案系統初始化過程(6)---執行init程式一、目的 二、建立磁盤裝置檔案 三、挂載磁盤檔案系統 四、切換根檔案系統 五、最終VFS視圖 六、總結

    成功挂載磁盤檔案系統後,需要将rootfs下的/sys、/proc、/dev等重要的目錄都遷移到磁盤檔案系統下。

    最後,通過調用/sbin/run-init程式将核心的根檔案系統從rootfs切換到磁盤檔案系統的根目錄。

linux檔案系統初始化過程(6)---執行init程式一、目的 二、建立磁盤裝置檔案 三、挂載磁盤檔案系統 四、切換根檔案系統 五、最終VFS視圖 六、總結

    到此為止,核心檔案系統初始化過程就全部完成了,下面給出最終的VFS視圖(由于檔案系統過大,是以隻給出其中關鍵的拓撲結構):

linux檔案系統初始化過程(6)---執行init程式一、目的 二、建立磁盤裝置檔案 三、挂載磁盤檔案系統 四、切換根檔案系統 五、最終VFS視圖 六、總結

    init程式的主要工作就是加載磁盤檔案系統,将rootfs下重要的目錄遷移到磁盤檔案系統下,最後将核心根目錄從rootfs切換到磁盤檔案系統的根目錄。

繼續閱讀