術語表:
struct task:程序
struct mnt_namespace:命名空間
struct mount:挂載點
struct vfsmount:挂載項
struct file:檔案
struct super_block:超級塊
struct dentry:目錄
struct inode:索引節點
linux檔案系統主要分為三個部分:檔案系統調用;虛拟檔案系統(VFS);挂載到VFS的實際檔案系統。
其中,VFS是核心,linux檔案系統的本質就是在記憶體中建立一棵VFS樹。當根目錄被建立後,使用者就可以使用系統調用在VFS上建立檔案、删除檔案、挂載各種檔案系統等操作。
該系列文章主要分析linux3.10檔案系統初始化過程,分為三個階段:
1、挂載根檔案系統(rootfs);
2、加載initrd;
3、挂載磁盤檔案系統;
linux檔案系統中重要的資料結構有:檔案、挂載點、超級塊、目錄項、索引節點等。每個資料結構的具體實作請參見源代碼,這裡不再描述。
為了直覺的表示資料結構之間的關系,請參見圖1:圖中含有兩個檔案系統(紅色和綠色表示的部分),并且綠色檔案系統挂載在紅色檔案系統tmp目錄下。一般來說,每個檔案系統在VFS層都是由挂載點、超級塊、目錄和索引節點組成;當挂載一個檔案系統時,實際也就是建立這四個資料結構的過程,是以這四個資料結構的地位很重要,關系也很緊密。由于VFS要求實際的檔案系統必須提供以上資料結構,是以不同的檔案系統在VFS層可以互相通路。
如果程序打開了某個檔案,還會建立file(檔案)資料結構,這樣程序就可以通過file來通路VFS的檔案系統了。
另外,該圖隻給出了主要的關系結構,忽略了部分細節。

圖1
圖2描述了檔案系統初始化過程中主要的函數調用關系。linux檔案系統初始化過程主要分為三個階段:
1、vfs_caches_init()負責挂載rootfs檔案系統,并建立了第一個挂載點目錄:'/';
2、rest_init()負責加載initrd檔案,擴充VFS樹,建立基本的檔案系統目錄拓撲;
3、init程式負責挂載磁盤檔案系統,并将檔案系統的根目錄從rootfs切換到磁盤檔案系統;
圖2
linux檔案系統初始化過程主要分為三個階段:挂載rootfs,提供第一個挂載點''/;加載initrd,擴充VFS樹;執行init程式,完成linux系統的初始化。下面會詳細介紹每個階段的主要内容。