linux文件系統與根文件系統

原文地址:http://www.oldlinux.org/oldlinux/archiver/?tid-10875.html

“文件系統”與“根文件系統”。

要不我們就統一簡稱爲FS和RFS:
文件系統:File System => FS;
根文件系統:Root File System => RFS。

首先你考慮一點描述語句:根文件系統也是一種“文件系統”,可以認爲是一種“特殊的”“文件系統”,爲什麼是叫“特殊的”呢?是因爲這種“根”“文件系統”承載着某些“特殊的功能”(其實“文件系統”相同的話,所具備的功能都是一樣的),那就是“操作系統”可能需要通過某種“佈局”來管理相關設備的,諸如軟盤設備、硬盤設備、虛擬磁盤設備等等,這裏可能就是用了一種已被定義好了“數據結構”的“佈局”,即“文件系統”,而出現的“根文件系統”呢可能是用來擔當主要或重要角色。


(形象點來說,Windows下的C盤分區是有一定文件系統的,如FAT32、NTFS,這當然也都是文件系統呀。在安裝Windows操作系統時,會要求你先“格式化”C盤[當然我們目前考慮操作系統是被安裝在C盤中],採用一種“文件系統”比如NTFS、FAT32等,這一步呀,就類似於安裝“根文件系統”,也就是說在C盤中的NTFS文件系統會被稱作是“根文件系統”,而在D盤等中的NTFS文件系統會被稱作是“文件系統”或你想加上前綴名稱也不是不可以,比如“普通文件系統”,而我們從名稱上來說的話,因爲這裏出現了一個字眼“根”,所以我們就有兩種名稱的叫法了,自然就是FS與RFS,所以這種名稱叫法就會讓人感覺很是“雲裏霧裏”,而後“不知所云”的],這個“格式化”過程就是將C盤上的存儲空間呀按預先定義好的一種FS的“數據結構”去“初始化”這些磁盤,[這裏假設MINIX FS也可被Windows用來“格式化”C盤呀]比如建立引導塊、建立超級塊、建立兩類位圖塊、建立i節點位圖塊、建立好數據區塊等)也就是說,這個磁盤分區必須已經按一定數據結構的方式把磁盤空間“組織”好,以便“某種系統”(OS或FS,好象是FS更準確吧)能“訪問”該分區,所以在 0.11內核中會有兩種區分:mount_root() 和 sys_mount(),分別指“掛載根文件系統”、“掛載文件系統”[這裏我覺得不應該用一個詞:安裝!我所理解的意思是,“安裝”就是指把某種東西“放”到另一種東西上面去,比如你要安裝某種軟件到C盤,這種軟件的安裝程序可能在D盤,這時你會啓動D盤上該軟件的安裝程序,然後安裝程序就會把軟件默認安裝到C盤上,所以這個過程會叫做“安裝”,安裝前C盤上沒有該軟件的任何信息,安裝後C盤上就會有該軟件的信息啦],所以呢,要使用sys_mount()功能,某種設備(具體來說就是某一分區)必須已經被某種FS的格式“安裝”好,然後該設備纔會被“掛載”(mount)到“一個地方”去。

那我們就以MINIX FS和FAT FS來分析吧。

在0.11內核代碼中,從mount_root(void)中的註釋可知,該函數會被“系統調用函數”sys_setup()調用,而在系統開機初始化設置時函數sys_setup()會被調用。爲什麼不會調用sys_mount()呢?那我們又何時使用sys_mount()函數呢?其實sys_mount()函數也是“系統調用函數”。我們在linux系統中,當你在某個shell的命令行中輸入mount後回車,你會看到以下提示信息:
mount: usage: mount dev dir
你大概應該清楚了,而這是“正確的提示信息”,因爲我們用錯mount用法了(另外,在/bin目錄下,可以看到有mount這樣一個文件,mount應該就是一個單獨的程序了吧:-),好多地方都說mount是shell內部命令,而我更可能會認爲cd纔是shell的內部命令之一)。
那我們從sys_mount()函數的註釋中可以知道,該函數是“安裝文件系統調用函數”(我個人覺得這句話不太好理解),而我知道函數的功能,所以我會這麼理解:這個函數是一“系統調用函數”,其功能是“將一個‘文件系統’即FS‘掛載’到(現有‘根文件系統’即RFS的)一個“目錄”上,即目錄文件的i節點。所以呢,這個就與“mount dev dir”這樣的提示信息對應起來了;另外,我們需要知道,dev表示的是某個設備上的一個分區,而dir表示的是某一個“現有的”文件系統中的“目錄文件”,注意一定是“現有的”,在這裏就是我們說的“根文件系統”,所以,你要使用mount功能,就得有以下條件:
1、在一個現有“文件系統”(根文件系統RFS)下面
2、該RFS中已經有了一些設備文件的存在,比如 /dev 下面的 hd0,hd1,等等
3、2中的/dev其實就是由RFS來管理的
4、還需要有一個目錄存在,而該目錄也是在該RFS中的即由RFS來管理的
5、當然你要有實際的磁盤設備存在(/dev/hd0只是表示一個“虛”的設備文件名而已)且該設備已被“FS”格式化好了
6、最後你就會用mount dev dir這樣的方式,將實際的磁盤分區“掛載”到dir中

假如,你有一個硬盤(假設大小是512MB),就只是一個分區,該分區中的FS是 FAT FS(假設unix可以直接訪問,大不了看成是與minix fs是一樣的,只是名稱不同而已,以下就是把它看成就是一個minix fs來分析的)。

所以當你啓動了“0.11系統”(這個說法比較簡化,意思就是你進入了sh命令行)後,其實RFS就已經被“自動”“掛載”好了(就是mount_root()),這時,你需要在該“0.11系統”中訪問那個硬盤,假設硬件上你已經安裝好了硬盤了,然後你會在sh命令行中進行“安裝”過程了,假如是:
mount /dev/hd0 /mnt/fatc
即將第一個硬盤的第一個分區(目前只有一個分區)“掛載”到“RFS”中的根目錄下的mnt目錄中的fatc目錄上。所以,你可以直接“進入”到 fatc 目錄中去訪問該硬盤裏的文件了。
成功了!掛載成功,大功告成!

因爲你瞭解內核代碼,所以你應該知道mount一系列過程的,你要知道以下幾點:
1、/dev/hd0, /mnt/fatc都是RFS中的“文件”(統稱),前者是設備文件,後者是目錄文件。 
[體現在i節點結構中,就是各自的inode->i_mode中會區分是“設備類型文件”還是“目錄類型文件”,且前者的inode->zone[0]存有該設備的設備號(還有inode->i_dev也是設備號,但實際含義不一樣),後者的inode->i_mount就被置位啦,注意因爲這個i節點就是一個“被‘安裝’/‘掛載’好了FS的i節點]

2、/ 這是目錄,但這個是RFS的目錄,且是根目錄。

3、/mnt/fatc “相當於”就是那個硬盤分區中FS的根目錄。但其實該硬盤中的根目錄也是/。
 [假設當你去訪問那個分區“根”目錄(其實也是/,但你能直接進去嗎?)中的某個文件hello.c,時,你會在現有sh命令行中,cd /mnt/fatc回車後 ls hello* -l,然後你會發現有hello.c這個文件,其實你就應該需要知道RFS是怎麼“定位”尋找到該hello.c文件的,當中有一個重要的過程就是需要取每一個文件的inode信息即iget()函數,該函數中發現某文件的inode->i_mount被置位時,就“特別小心”了,爲什麼?因爲該inode表示被“掛載”了一個文件系統,所以RFS會“切換”到那個FS的根目錄中去(使用了ROOT_INO,super_block[i].s_dev這樣的參數),然後再在該FS中按正常的過程繼續尋找所需要的文件,所以你能找到]

“正常的過程”就是指:要麼從一個FS的根目錄中開始查找文件,要不從一個文件系統當前用戶進程的當前工作目錄中開始查找文件。

 所以就有一個重要的說法(我是這麼理解的):跨文件系統訪問文件。這一過程涉及面較廣,主要數據結構有:i節點、超級塊。

4、最後,當你不需要使用該分區或是你想把硬盤拿走,則你會使用 umount 功能啦,這就對應 sys_umount()這一“系統調用函數”,那你就要知道該函數做了些什麼事了。

最後,總的來說:
mount_root()掛載了一個MINIX FS又被稱爲是RFS。
然後你可以在該RFS中再掛載別的FS。RFS與系統“共存亡”,自動被“掛載”,自動被“卸載”。
所以,FAT等也可以是根文件系統,當然也是文件系統。

所以,當你在你電腦上安裝了多操作系統時,假設在C盤(FAT32 FS)被裝了 win98,在D盤(NTFS FS)被安裝了winxp,那麼,當你進入了win98時,你FAT32好象就是RFS,那麼NTFS就是FS了;當你進入了winxp時,NTFS好象就是RFS,那麼FAT32就是FS了。
(爲什麼C盤是要FAT32呢,因爲win98不支持ntfs fs,而你又是裝的win98)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章