下面就給大家介紹一下“根文件系統(tǒng)”和“文件系統(tǒng)”的聯(lián)系
要不我們就統(tǒng)一簡(jiǎn)稱為FS和RFS:
文件系統(tǒng):File System => FS;
根文件系統(tǒng):Root File System => RFS。
首先你考慮一點(diǎn)描述語(yǔ)句:根文件系統(tǒng)也是一種“文件系統(tǒng)”,可以認(rèn)為是一種“特殊的”“文件系統(tǒng)”,為什么是叫“特殊的”呢?是因?yàn)檫@種“根”“文件系統(tǒng)”承載著某些“特殊的功能”(其實(shí)“文件系統(tǒng)”相同的話,所具備的功能都是一樣的),那就是“操作系統(tǒng)”可能需要通過(guò)某種“布局”來(lái)管理相關(guān)設(shè)備的,諸如軟盤(pán)設(shè)備、硬盤(pán)設(shè)備、虛擬磁盤(pán)設(shè)備等等,這里可能就是用了一種已被定義好了“數(shù)據(jù)結(jié)構(gòu)”的“布局”,即“文件系統(tǒng)”,而出現(xiàn)的“根文件系統(tǒng)”呢可能是用來(lái)?yè)?dān)當(dāng)主要或重要角色。
形象點(diǎn)來(lái)說(shuō),Windows下的C盤(pán)分區(qū)是有一定文件系統(tǒng)的,如FAT32、NTFS,這當(dāng)然也都是文件系統(tǒng)呀。在安裝Windows操作系統(tǒng)時(shí),會(huì)要求你先“格式化”C盤(pán)[當(dāng)然我們目前考慮操作系統(tǒng)是被安裝在C盤(pán)中],采用一種“文件系統(tǒng)”比如NTFS、FAT32等,這一步呀,就類似于安裝“根文件系統(tǒng)”,也就是說(shuō)在C盤(pán)中的NTFS文件系統(tǒng)會(huì)被稱作是“根文件系統(tǒng)”,而在D盤(pán)等中的NTFS文件系統(tǒng)會(huì)被稱作是“文件系統(tǒng)”或你想加上前綴名稱也不是不可以,比如“普通文件系統(tǒng)”,而我們從名稱上來(lái)說(shuō)的話,因?yàn)檫@里出現(xiàn)了一個(gè)字眼“根”,所以我們就有兩種名稱的叫法了,自然就是FS與RFS,所以這種名稱叫法就會(huì)讓人感覺(jué)很是“云里霧里”,而后“不知所云”的],這個(gè)“格式化”過(guò)程就是將C盤(pán)上的存儲(chǔ)空間呀按預(yù)先定義好的一種FS的“數(shù)據(jù)結(jié)構(gòu)”去“初始化”這些磁盤(pán),[這里假設(shè)MINIX FS也可被Windows用來(lái)“格式化”C盤(pán)呀]比如建立引導(dǎo)塊、建立超級(jí)塊、建立兩類位圖塊、建立i節(jié)點(diǎn)位圖塊、建立好數(shù)據(jù)區(qū)塊等)也就是說(shuō),這個(gè)磁盤(pán)分區(qū)必須已經(jīng)按一定數(shù)據(jù)結(jié)構(gòu)的方式把磁盤(pán)空間“組織”好,以便“某種系統(tǒng)”(OS或FS,好象是FS更準(zhǔn)確吧)能“訪問(wèn)”該分區(qū),所以在 0.11內(nèi)核中會(huì)有兩種區(qū)分:mount_root() 和 sys_mount(),分別指“掛載根文件系統(tǒng)”、“掛載文件系統(tǒng)”[這里我覺(jué)得不應(yīng)該用一個(gè)詞:安裝!
我所理解的意思是,“安裝”就是指把某種東西“放”到另一種東西上面去,比如你要安裝某種軟件到C盤(pán),這種軟件的安裝程序可能在D盤(pán),這時(shí)你會(huì)啟動(dòng)D盤(pán)上該軟件的安裝程序,然后安裝程序就會(huì)把軟件默認(rèn)安裝到C盤(pán)上,所以這個(gè)過(guò)程會(huì)叫做“安裝”,安裝前C盤(pán)上沒(méi)有該軟件的任何信息,安裝后C盤(pán)上就會(huì)有該軟件的信息啦],所以呢,要使用sys_mount()功能,某種設(shè)備(具體來(lái)說(shuō)就是某一分區(qū))必須已經(jīng)被某種FS的格式“安裝”好,然后該設(shè)備才會(huì)被“掛載”(mount)到“一個(gè)地方”去。
那我們就以MINIX FS和FAT FS來(lái)分析吧。
在0.11內(nèi)核代碼中,從mount_root(void)中的注釋可知,該函數(shù)會(huì)被“系統(tǒng)調(diào)用函數(shù)”sys_setup()調(diào)用,而在系統(tǒng)開(kāi)機(jī)初始化設(shè)置時(shí)函數(shù)sys_setup()會(huì)被調(diào)用。為什么不會(huì)調(diào)用sys_mount()呢?那我們又何時(shí)使用sys_mount()函數(shù)呢?其實(shí)sys_mount()函數(shù)也是“系統(tǒng)調(diào)用函數(shù)”。我們?cè)趌inux系統(tǒng)中,當(dāng)你在某個(gè)shell的命令行中輸入mount后回車(chē),你會(huì)看到以下提示信息:mount: usage: mount dev dir你大概應(yīng)該清楚了,而這是“正確的提示信息”,因?yàn)槲覀冇缅e(cuò)mount用法了(另外,在/bin目錄下,可以看到有mount這樣一個(gè)文件,mount應(yīng)該就是一個(gè)單獨(dú)的程序了吧:-),好多地方都說(shuō)mount是shell內(nèi)部命令,而我更可能會(huì)認(rèn)為cd才是shell的內(nèi)部命令之一)。
那我們從sys_mount()函數(shù)的注釋中可以知道,該函數(shù)是“安裝文件系統(tǒng)調(diào)用函數(shù)”(我個(gè)人覺(jué)得這句話不太好理解),而我知道函數(shù)的功能,所以我會(huì)這么理解:這個(gè)函數(shù)是一“系統(tǒng)調(diào)用函數(shù)”,其功能是“將一個(gè)‘文件系統(tǒng)’即FS‘掛載’到(現(xiàn)有‘根文件系統(tǒng)’即RFS的)一個(gè)“目錄”上,即目錄文件的i節(jié)點(diǎn)。所以呢,這個(gè)就與“mount dev dir”這樣的提示信息對(duì)應(yīng)起來(lái)了;另外,我們需要知道,dev表示的是某個(gè)設(shè)備上的一個(gè)分區(qū),而dir表示的是某一個(gè)“現(xiàn)有的”文件系統(tǒng)中的“目錄文件”,注意一定是“現(xiàn)有的”,在這里就是我們說(shuō)的“根文件系統(tǒng)”,所以,你要使用mount功能,就得有以下條件:
◆在一個(gè)現(xiàn)有“文件系統(tǒng)”(根文件系統(tǒng)RFS)下面
◆該RFS中已經(jīng)有了一些設(shè)備文件的存在,比如 /dev 下面的 hd0,hd1,等等
◆2中的/dev其實(shí)就是由RFS來(lái)管理的
◆還需要有一個(gè)目錄存在,而該目錄也是在該RFS中的即由RFS來(lái)管理的
◆當(dāng)然你要有實(shí)際的磁盤(pán)設(shè)備存在(/dev/hd0只是表示一個(gè)“虛”的設(shè)備文件名而已)且該設(shè)備已被“FS”格式化好了
◆最后你就會(huì)用mount dev dir這樣的方式,將實(shí)際的磁盤(pán)分區(qū)“掛載”到dir中
假如,你有一個(gè)硬盤(pán)(假設(shè)大小是512MB),就只是一個(gè)分區(qū),該分區(qū)中的FS是 FAT FS(假設(shè)unix可以直接訪問(wèn),大不了看成是與minix fs是一樣的,只是名稱不同而已,以下就是把它看成就是一個(gè)minix fs來(lái)分析的)。
所以當(dāng)你啟動(dòng)了“0.11系統(tǒng)”(這個(gè)說(shuō)法比較簡(jiǎn)化,意思就是你進(jìn)入了sh命令行)后,其實(shí)RFS就已經(jīng)被“自動(dòng)”“掛載”好了(就是mount_root()),這時(shí),你需要在該“0.11系統(tǒng)”中訪問(wèn)那個(gè)硬盤(pán),假設(shè)硬件上你已經(jīng)安裝好了硬盤(pán)了,然后你會(huì)在sh命令行中進(jìn)行“安裝”過(guò)程了,假如是:
mount /dev/hd0 /mnt/fatc
即將第一個(gè)硬盤(pán)的第一個(gè)分區(qū)(目前只有一個(gè)分區(qū))“掛載”到“RFS”中的根目錄下的mnt目錄中的fatc目錄上。所以,你可以直接“進(jìn)入”到 fatc 目錄中去訪問(wèn)該硬盤(pán)里的文件了。
成功了!掛載成功,大功告成!
因?yàn)槟懔私鈨?nèi)核代碼,所以你應(yīng)該知道m(xù)ount一系列過(guò)程的,你要知道以下幾點(diǎn):
◆/dev/hd0, /mnt/fatc都是RFS中的“文件”(統(tǒng)稱),前者是設(shè)備文件,后者是目錄文件?!?/p>
[體現(xiàn)在i節(jié)點(diǎn)結(jié)構(gòu)中,就是各自的inode->i_mode中會(huì)區(qū)分是“設(shè)備類型文件”還是“目錄類型文件”,且前者的inode->zone[0]存有該設(shè)備的設(shè)備號(hào)(還有inode->i_dev也是設(shè)備號(hào),但實(shí)際含義不一樣),后者的inode->i_mount就被置位啦,注意因?yàn)檫@個(gè)i節(jié)點(diǎn)就是一個(gè)“被‘安裝’/‘掛載’好了FS的i節(jié)點(diǎn)。/ 這是目錄,但這個(gè)是RFS的目錄,且是根目錄。
◆/mnt/fatc “相當(dāng)于”就是那個(gè)硬盤(pán)分區(qū)中FS的根目錄。但其實(shí)該硬盤(pán)中的根目錄也是/。
[假設(shè)當(dāng)你去訪問(wèn)那個(gè)分區(qū)“根”目錄(其實(shí)也是/,但你能直接進(jìn)去嗎?)中的某個(gè)文件hello.c,時(shí),你會(huì)在現(xiàn)有sh命令行中,cd /mnt/fatc回車(chē)后 ls hello* -l,然后你會(huì)發(fā)現(xiàn)有hello.c這個(gè)文件,其實(shí)你就應(yīng)該需要知道RFS是怎么“定位”尋找到該hello.c文件的,當(dāng)中有一個(gè)重要的過(guò)程就是需要取每一個(gè)文件的inode信息即iget()函數(shù),該函數(shù)中發(fā)現(xiàn)某文件的inode->i_mount被置位時(shí),就“特別小心”了,為什么?因?yàn)樵搃node表示被“掛載”了一個(gè)文件系統(tǒng),所以RFS會(huì)“切換”到那個(gè)FS的根目錄中去(使用了ROOT_INO,super_block[i].s_dev這樣的參數(shù)),然后再在該FS中按正常的過(guò)程繼續(xù)尋找所需要的文件,所以你能找到]“正常的過(guò)程”就是指:要么從一個(gè)FS的根目錄中開(kāi)始查找文件,要不從一個(gè)文件系統(tǒng)當(dāng)前用戶進(jìn)程的當(dāng)前工作目錄中開(kāi)始查找文件。所以就有一個(gè)重要的說(shuō)法(我是這么理解的):跨文件系統(tǒng)訪問(wèn)文件。這一過(guò)程涉及面較廣,主要數(shù)據(jù)結(jié)構(gòu)有:i節(jié)點(diǎn)、超級(jí)塊。
◆最后,當(dāng)你不需要使用該分區(qū)或是你想把硬盤(pán)拿走,則你會(huì)使用 umount 功能啦,這就對(duì)應(yīng) sys_umount()這一“系統(tǒng)調(diào)用函數(shù)”,那你就要知道該函數(shù)做了些什么事了。
最后,總的來(lái)說(shuō):
mount_root()掛載了一個(gè)MINIX?。疲佑直环Q為是RFS。
然后你可以在該RFS中再掛載別的FS。RFS與系統(tǒng)“共存亡”,自動(dòng)被“掛載”,自動(dòng)被“卸載”。
所以,F(xiàn)AT等也可以是根文件系統(tǒng),當(dāng)然也是文件系統(tǒng)。
所以,當(dāng)你在你電腦上安裝了多操作系統(tǒng)時(shí),假設(shè)在C盤(pán)(FAT32 FS)被裝了 win98,在D盤(pán)(NTFS FS)被安裝了winxp,那么,當(dāng)你進(jìn)入了win98時(shí),你FAT32好象就是RFS,那么NTFS就是FS了;當(dāng)你進(jìn)入了winxp時(shí),NTFS好象就是RFS,那么FAT32就是FS了。
(為什么C盤(pán)是要FAT32呢,因?yàn)閣in98不支持ntfs fs,而你又是裝的win98)
聯(lián)系客服