根檔案系統與檔案系統的區別

2021-06-01 11:48:45 字數 4223 閱讀 8085

ø         根檔案系統:英文應該為root filesytem,但是有時會被簡單地稱為檔案系統。而實際上就是指的我們前一節所指的linux系統執行所需的一些檔案,命令組成的整個檔案目錄結構。

ø         檔案系統:英文應該為file system或filesytem,指的是用來方便管理檔案儲存和資料組織的一種方法。例如windows下的fat、fat32、ntfs,linux下的ext2,ext3,nfs等,這些應該都屬於這個概念。

所以根檔案系統和檔案系統是兩個概念,請不要誤解了,為了便於理解,讀者可以將檔案系統理解成根檔案系統存放在磁碟的格式。

「檔案系統」與「根檔案系統」。

要不我們就統一簡稱為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)

根檔案系統與檔案系統的區別

根檔案系統 英文應該為root filesytem,但是有時會被簡單地稱為檔案系統。而實際上就是指的我們前一節所指的linux系統執行所需的一些檔案,命令組成的整個檔案目錄結構。檔案系統 英文應該為file system或filesytem,指的是用來方便管理檔案儲存和資料組織的一種方法。例如win...

根檔案系統與檔案系統的區別

根檔案系統 英文應該為root filesytem,但是有時會被簡單地稱為檔案系統。而實際上就是指的我們前一節所指的linux系統執行所需的一些檔案,命令組成的整個檔案目錄結構。檔案系統 英文應該為file system或filesytem,指的是用來方便管理檔案儲存和資料組織的一種方法。例如win...

根檔案系統與檔案系統的區別

根檔案系統 英文應該為root filesytem,但是有時會被簡單地稱為檔案系統。而實際上就是指的我們前一節所指的linux系統執行所需的一些檔案,命令組成的整個檔案目錄結構。檔案系統 英文應該為file system或filesytem,指的是用來方便管理檔案儲存和資料組織的一種方法。例如win...