1. 程式人生 > >linux文件系統 - 初始化(三)

linux文件系統 - 初始化(三)

視圖 div 目錄遷移 oca script 方式 不能 輸出 str

一、目的

內核加載完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中。

技術分享圖片

技術分享圖片

三、掛載磁盤文件系統

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

最後,由init程序調用/scripts/local腳本掛載磁盤文件系統。

技術分享圖片

四、切換根文件系統

成功掛載磁盤文件系統後,需要將rootfs下的/sys、/proc、/dev等重要的目錄都遷移到磁盤文件系統下。

最後,通過調用/sbin/run-init程序將內核的根文件系統從rootfs切換到磁盤文件系統的根目錄。

技術分享圖片

五、最終VFS視圖

到此為止,內核文件系統初始化過程就全部完成了,下面給出最終的VFS視圖(由於文件系統過大,因此只給出其中關鍵的拓撲結構):

技術分享圖片

六、總結

init程序的主要工作就是加載磁盤文件系統,將rootfs下重要的目錄遷移到磁盤文件系統下,最後將內核根目錄從rootfs切換到磁盤文件系統的根目錄。

linux文件系統 - 初始化(三)