朱小明 武漢學(xué)院信息及傳播學(xué)院信息系
Linux操作系統(tǒng)文件管理概論
朱小明 武漢學(xué)院信息及傳播學(xué)院信息系
隨著計算機(jī)操作系統(tǒng)的發(fā)展,系統(tǒng)的穩(wěn)定性也是越來越重要,但是由于windows操作系統(tǒng)的先天不足,所以linux系統(tǒng)越來越受到歡迎,服務(wù)器操作系統(tǒng),大多都采用linux操作系統(tǒng)用來管理文件。
linux 文件管理 支持系統(tǒng)
Linux系統(tǒng)因為使用VFS,所以其核心可以支持如ext、ext2、ext3、ext4、JFS2等的多種的文件系統(tǒng)。下面咱們就說一下文件系統(tǒng),我們還是從外部使用與內(nèi)部實現(xiàn)兩部分來分開講。
我們知道我們操作系統(tǒng)內(nèi)核的外面也就是用戶空間下,我們是通過系統(tǒng)調(diào)用來使用操作系統(tǒng)提供的功能的。下面我們介紹一下關(guān)于文件和目錄的系統(tǒng)調(diào)用。
2.1 文件系統(tǒng)調(diào)用
Fd=create(fileName,mode); 創(chuàng)建文件系統(tǒng)調(diào)用(文件名,權(quán)限狀態(tài)位)
Fd=open(filename,how); 打開文件(文件名,模式(讀or寫))
Close(fd) 關(guān)閉一個文件,意味著對一個文件的操作全部結(jié)束
N=read(fd,buffers,nbytes) 讀取文件(文件句柄,緩存區(qū),讀取的字節(jié)大小)
N=write(fd,buffer,nbytes) 把數(shù)據(jù)從緩沖區(qū)寫入文件(文件句柄,緩沖區(qū),要寫入的字節(jié)數(shù))
Position=lseek(fd,offset,whence); 移動文件指針
S=stat(name,&buf) 獲取文件狀態(tài)信息
S=fstat(fd,&bug); 獲取文件狀態(tài)信息
2.2 關(guān)于目錄的系統(tǒng)調(diào)用
S=mkdir(path,mode) 創(chuàng)建目錄(目錄路徑,權(quán)限)
S=rmdir(path) 刪除目錄
S=link(oldPath,newPaht) 創(chuàng)建指向已有文件的鏈接
S=unlink(path); 刪除已有鏈接
S=chdir(path) 改變工作目錄
Dir=opendir(path); 打開目錄
S=closedir(dir) 關(guān)閉目錄
dirInfo=readdir(path); 讀取目錄項
下面我們以linux下ext2文件系統(tǒng)來說一下文件系統(tǒng)的內(nèi)部實現(xiàn)。我們首先看一下磁盤的分區(qū)示意圖:
引導(dǎo)區(qū)(啟動時讀取哪個分區(qū)上的操作系統(tǒng))分區(qū)表(記錄各個分區(qū)的位置) 1分區(qū) 2分區(qū) 3分區(qū)
再看一下每個分區(qū)下的數(shù)據(jù)塊:
超級塊(記錄了文件系統(tǒng)的類型,包含的i節(jié)點(diǎn)的個數(shù)、磁盤塊數(shù)、以及空閑塊鏈表的其實位置)組描述符(存放了空閑塊位圖以及i節(jié)點(diǎn)位圖的位置、目錄的個數(shù))塊位圖用來記錄空閑塊的位置I節(jié)點(diǎn)位圖用來記錄空閑i節(jié)點(diǎn)I節(jié)點(diǎn)存儲區(qū)數(shù)據(jù)存儲區(qū)
3.1 Inode(i節(jié)點(diǎn))
因為文件系統(tǒng)要知道所有文件的屬性信息,還要知道文件數(shù)據(jù)在磁盤上的實際存儲位置,所以還要記錄一個文件所占用的磁盤塊。無論是采用鏈表或者位圖來存儲一個硬盤上的文件和目錄信息,都是要耗費(fèi)不少的磁盤空間和內(nèi)存空間,磁盤越大,文件或目錄項或空閑塊就越多。為了解決這個問題,設(shè)計者就想出了這個i節(jié)點(diǎn)的注意,并且在文件系統(tǒng)上實現(xiàn)了。這樣在內(nèi)存中就不必存儲所有文件的位置信息了,需要打開哪些文件就將那些文件的i節(jié)點(diǎn)存儲到內(nèi)存中即可。
3.2 文件系統(tǒng)的空間分配
操作系統(tǒng)根據(jù)文件中空間塊位圖以及i節(jié)點(diǎn)位圖來分配和回收文件的創(chuàng)建和消除的存儲分配。
3.2.1 日志文件系統(tǒng)
為了防止由于系統(tǒng)崩潰或電源突然中斷導(dǎo)致正在進(jìn)行的文件操作中斷所造成的數(shù)據(jù)丟失,ext2文件系統(tǒng)就必須在每個數(shù)據(jù)塊創(chuàng)建或修改后即刻寫入磁盤。
Ext3其實只是ext2文件系統(tǒng)加上了一個日志維護(hù)功能,增強(qiáng)了文件系統(tǒng)的健壯性。每一個磁盤操作都會將其具體的操作位置以及數(shù)據(jù)記錄到日志里。當(dāng)發(fā)生系統(tǒng)崩潰或電源中斷時,再次啟動時,文件系統(tǒng)會比對日志與磁盤是否一致,不一致則根據(jù)日志來完善操作。
3.2.2 網(wǎng)絡(luò)文件系統(tǒng)(NFS)
網(wǎng)絡(luò)功能在linux中占據(jù)著不可動搖的地位,當(dāng)然文件系統(tǒng)也要強(qiáng)大到支持非本地文件系統(tǒng)。其實網(wǎng)絡(luò)文件系統(tǒng)就是在linux操作系統(tǒng)下,將遠(yuǎn)程機(jī)器上的目錄掛載到本地的文件系統(tǒng)上,首先遠(yuǎn)程機(jī)器會檢查客戶機(jī)器的掛載請求以及權(quán)限驗證,通過則將自己的文件系統(tǒng)類型以及被掛載目錄的i節(jié)點(diǎn)信息組成的一個唯一標(biāo)識放到本地。當(dāng)本地有對此文件操作時,文件系統(tǒng)就會檢查當(dāng)前被掛載的目錄是本地文件系統(tǒng)還是網(wǎng)絡(luò)文件系統(tǒng)。如果是網(wǎng)絡(luò)文件系統(tǒng),則通過網(wǎng)絡(luò)文件系統(tǒng)協(xié)議發(fā)送讀取文件或者打開文件的請求,包含文件名以及讀取的位置或要寫入的數(shù)據(jù)或位置,然后遠(yuǎn)程機(jī)器返回相應(yīng)。
盡管文件系統(tǒng)的實現(xiàn)并不復(fù)雜,但它是可伸縮和可擴(kuò)展的體系結(jié)構(gòu)的好例子。文件系統(tǒng)體系結(jié)構(gòu)已經(jīng)發(fā)展了許多年,并成功地支持了許多不同類型的文件系統(tǒng)和許多目標(biāo)存儲設(shè)備類型。由于使用了基于插件的體系結(jié)構(gòu)和多層的函數(shù)間接性,Linux文件系統(tǒng)發(fā)展很值得關(guān)注。
[1]文東戈,孫昌立,王旭.Linux操作系統(tǒng)實用教程[M].北京:清華大學(xué)出版社,2010.
[2]阿正.linux文件系統(tǒng)概述[J]