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