,
(1.文華學院,武漢 430086;2.湖北工業大學)
Linux下Ext2文件系統的精剪與優化設計*
周俊杰1,柯躍2
(1.文華學院,武漢 430086;2.湖北工業大學)
基于Linux系統通過精細剪裁和優化設計,構建開發了一個Linux多級用戶的Ext2二級文件系統,以作GPS等專業嵌入式的文件系統。其系統包括各基本實體(索引節點、目錄節點、文件節點等)的定義和各功能模塊的定義及實現,最后展示了系統部分功能模塊的測試數據。本文所構造的Linux文件系統已經過測試并取得了良好效果。
Linux;Ext2;文件系統;優化設計
Linux系統幾乎支持現在所有的主流文件系統,這些文件系統都能掛載到Linux系統上,并對其進行操作。在此基礎上,Linux將對應的文件系統和其相應的一些操作封裝到一起,繼而進一步抽象產生了Linux中重要的文件系統機制,即VFS(虛擬文件系統)[1]。而在所有的文件系統具體操作下一層又加入了一個緩沖區,以提高不同文件系統間的讀寫操作速度。對于Linux系統來說,所有的設備都是文件,包括目錄。正是這種抽象,使得Linux的操作變得簡單、高效,系統整體穩定安全。
本文首先介紹了自主實現的文件系統——Ext2文件系統,分析了它的結構、實現原理,以及底層分配設計和層次結構關系。然后詳細敘述自主開發的文件系統的底層架構設計,以及重要模塊的具體實現流程。最后對主要模塊的功能進行了測試,以驗證本文件系統的可行性。
Ext2是GNU/Linux 系統中標準的文件系統,由于其采用簇塊取層的優良設計,因此存取文件的性能好[2]。一個磁盤分區一般分為1 024、2 048和4 096字節大小的塊,根據不同的使用,可分為不同的塊,主要包括超級塊(Super Block)、inode塊和數據塊。超級塊描述了文件系統的基本信息,inode塊記錄了文件的屬性,是文件系統中的基本單元,是文件系統中的索引。Ext2文件系統的具體結構如圖1所示。

圖1 Ext2文件系統結構示意圖
Linux的文件系統將硬盤分區時會劃分出超級塊、inode Table區塊和Data Block數據區域。一個文件由一個超級塊、inode和數據區域塊組成。當查看某個文件時,先從inode Table中查出文件屬性及數據存放點,再從數據塊中讀取數據。
本文件系統其硬盤是模擬硬盤,即以一個二進制文件(.iso文件)來模擬真正的硬盤。本系統中所有的操作都是對此二進制文件進行,所以本文件系統并沒有真正的硬件設施,也就沒有硬件驅動層。模擬硬盤的分區如圖2所示。

圖2 模擬硬盤分區圖
在磁盤初始化的過程中會將數據區(0x0 4400~0x3 9c00)分為若干塊,每塊512字節,將其中的第0塊作為主目錄區,即存儲目錄區。第1塊用作etc配置信息區,存儲與本文件系統具體配置有關的信息。第2塊當成pwd信息區,即存儲已注冊用戶的id、name和對應的密碼信息。從第3塊到結尾分為若干組,每組共50個數據塊。每組的第一個塊用來保存本組數據塊的物理偏移信息。如圖3所示。

圖3 數據區詳細劃分圖
由于在Linux中所有的設備和信息集合都可以被看成文件,所以本系統中為每個具體文件和目錄文件都創建了一個對應的inode(索引節點)。根據目錄或文件中的inode就可以找到對應的inode。而此inode中已經記錄了對應文件的大小以及對應的物理塊號。通過這種方式就可以很容易對具體文件進行尋址定位。其具體尋址方式如圖4所示。

圖4 文件尋址示意圖
塊管理主要有inode塊和空閑物理塊兩種。由于Linux系統中inode節點信息是線性的,而本系統也繼承了這個特性。從理論上來說,inode節點中沒有必要保存本身的inode號(在線性序列中的序列號)信息。雖然這種實現方式很簡單,但這給inode節點的管理帶來了很大的麻煩。當需要新建inode時,可直接插在序列后面。但當刪除某個節點時就很麻煩,因為此節點之后的每個節點的inode號都會相應地減小1。除此之外,對應文件中的inode號也必須要同步更新,否則在文件尋址時就會出現混亂,甚至會覆蓋重要的信息。所以本系統中inode節點也保存有自身的inode號,與文件或目錄中的inode號相同。
但此時會產生另一個問題,即如何對刪除的inode物理空間進行回收。本系統給出的方法是:刪除時不回收具體物理空間,通過使用一個標識數組來標識對應的inode塊是否可以使用,從而重復管理利用inode空間。此標識數組初始化時全為0。當創建一個inode時,首先會在標識數組中找到第一個為0的塊,將此塊分配給新建的inode節點。inode號對應的標識數組位置會被置1,表示不可使用。當刪除inode時,直接將邏輯節點刪除,將物理節點對應的標識數組對應位置0即可。在退出本系統時,再將inode標識數組中的對應數據寫入到指定的磁盤區。而當再次登錄本系統時,動態地從指定的數據區讀入標識數組。這樣,就很好地完成了inode節點的重復回收利用。
空閑塊即在刪除文件時產生的回收數據塊,空閑塊的管理即為數據塊的回收利用管理。本系統中使用了一個空閑數據塊鏈,來專門管理和回收系統運行時所產生的空閑數據塊。在每次分配數據塊時,若此空閑塊數據鏈不為空,則優先在此空閑數據鏈上分配數據塊;若為空,則直接從當前超級塊上分配數據塊。每次由于刪除文件所產生的空閑數據塊,直接加到空閑數據鏈中即可。在系統退出時,則直接將空閑鏈中的數據寫到指定的磁盤區,在使用本系統時再動態讀取。
系統中的主要實體采用面向對象的思想來看待,作為系統中的功能模塊對象。分析系統中的基本實體結構,可以從微觀來了解系統的大致構架層次及其邏輯關系[3],這對于理解一個系統來說是很重要的。本系統中的重要實體主要有以下幾個:錯誤實體、用戶及用戶組實體、超級塊實體、inode實體、目錄實體、文件實體及頁面緩存實體。
Ext2文件實體定義如下:
typedef struct fileNode{ //同層無同名文件
char fileName[MAXFILENAME]; //文件名
int fileSize; //文件大小
long fileTrueSize;
short fileINode; //對應的inode號
short fileMode; //文件權限:0-root;1-管理員;
//2-一般用戶;3-保留
short fileUserId; //用戶號
short fileGroupId; //組號
struct Dir* fileDir; //文件所屬目錄
struct fileNode* fileNext; //下一個
}FileNode;
由其定義可以很容易看出,文件與目錄關系是通過文件所述目錄信息來描述的。通過這個信息,可以知道此文件屬于哪個目錄。同時,若指定目錄,也可通過此屬性獲得此目錄中所有的文件。通過用戶號、組號和文件權限就可以確定用戶對此文件的訪問允許及操作權限,也就實現了多級用戶能力。
在本系統中硬件層只是一個模擬硬盤,也就沒有硬件驅動層。因此對模擬硬盤的所有基本操作均使用系統自帶的API。在本系統中主要使用5個API,分別為open()、close、read()、write()和lseek()[4]。其中open()為打開或創建文件,close()是關閉文件,read()和write()分別是讀、寫文件,lseek()則是改變當前打開文件的文件指針。
源代碼的主體函數是在進行系統概要設計時通過流程圖編寫的,基本邏輯遵循下述的流程圖。只是在登錄模塊中也加入了退出系統命令,在登錄系統時也可以通過退出系統命令退出,而不必等到登錄成功后才能退出。
Ext2系統程序的主體流程設計如圖5所示。

圖5 Ext2系統流程圖
3.3.1 錯誤處理模塊
錯誤處理模塊是提高整個程序容錯性的核心,同時也提高了系統對錯誤的處理能力。本模塊通過一個全局錯誤變量來實現,每當系統中有可能出現錯誤的地方就加上錯誤判斷,一旦出現錯誤則記錄錯誤所在文件、所在行、具體信息以及錯誤類型,再返回異常。如果存在函數功能模塊嵌套調用,也可以逐層拋出這個異常,以便能準確定位。根據錯誤的類型,可以判斷錯誤的嚴重性,以便能盡量減少損失、避免整個系統崩潰。
3.3.2 模擬硬盤初始化模塊
因為時間和硬件資源等的限制,本系統并沒有真正的硬件,而是使用一個(0x4 4400×2)字節的iso二進制鏡像文件來作為模擬硬盤。所以此模擬硬盤是所有操作的基礎,而模擬硬盤的初始化是為了能夠按文件系統的標準使用此硬盤。
此模塊的實現方式為:將磁盤分為若干個數據塊,每個數據塊的大小為512字節[5]。所有的數據塊編號為0~(n-1),第0塊也就是整個數據區的開始,然后將每50個數據塊分為一組。每個組的第一個數據塊也就是本組的超級塊,記錄著本組所有數據塊的相對地址偏移,也就是上述所說的地址編號。將第0、1、2數據塊單獨空閑出來,第0塊用來存儲主目錄,第1塊用來存儲etc配置環境,第2塊用來存儲注冊用戶的相關信息。這樣從0x0 4400~0x3 9c00的數據區就被分為若干組,并通過超級塊管理本組所有的數據塊。
剩余的從0x0 0000~0x0 0200用來當作系統引導區,即標識此磁盤是否需要初始化。0x0 0200~0x0 0400用來存儲當前超級塊,即標識當前硬盤已經使用的數據塊。0x0 0400~0x0 4400用來存儲系統產生的inode,這是文件索引的核心。0x3 9c00~0x4 4400用來保存當前空閑數據塊,即系統文件刪除導致的空閑數據塊。
3.3.3 數據塊分配回收以及拷貝模塊
當前的超級塊中保存的是當前某一組數據塊的分配情況,同時當前空閑塊中臨時存儲的是當前回收產生的空閑數據塊。當需要進行數據塊分配時,首先在當前空閑數據塊鏈上查找,若不為空則優先從當前空閑數據塊鏈上分配;否則從當前超級塊上分配,即返回當前還是空閑未使用的數據塊的偏移。若當前超級塊中可分配量為0,則讀取下一個超級塊,再給予分配。如果超級塊中可分配塊為0,則返回錯誤。
對于產生的空閑數據塊并沒有在物理上對其進行回收,而是將其加入到當前空閑塊鏈中。當有數據塊分配時,空閑數據鏈上的數據塊優先分配。而數據塊的拷貝則是對于兩個已知編號的數據塊,將其中一個數據塊中的數據拷貝到另一個數據塊中。其實現即為直接從原數據塊中讀取512字節的數據,然后寫入到指定的數據塊中。
3.3.4 索引節點創建和刪除模塊
本系統對于索引節點的管理是使用一個全局的標識數組,相當于將所有的保存索引節點的空間編號。此數組剛開始時被初始化為0,表示所有的inode節點都可以使用。每次分配索引節點時首先遍歷此數組,找到第一個為0的地方即停止,此順序遍歷的序列號就是新產生的inode的物理偏移號[6]。最后初始化新產生的節點并加入到當前inode鏈中,等待系統結束時寫入到硬盤指定位置。
每次索引節點的回收必然伴隨著文件的刪除。刪除時直接將其物理偏移號對應的標識數組下標的數值變為0,表示可以繼續使用,再從索引鏈上刪除索引節點。這樣不用真正地從物理地址上刪除,只需標識為可用,當再次創建索引節點時就會覆蓋原數據。
3.3.5 文件模塊
文件模塊包括創建、讀寫、復制以及刪除功能。文件創建包含帶目錄的創建和直接在當前目錄中創建。當為帶路徑的文件創建時,首先解析出文件名,然后根據路徑逐個解析,當解析到所要創建文件的目錄時再調用在當前目錄中創建文件的模塊。
文件讀寫模塊通過命令行無法實現,因而本系統中只是為命令行寫了一個測試的版本,即將所讀的內容保存到指定的緩存中。通過文件id,首先查找到文件對應的inode,根據inode即可得知文件的具體物理地址,最后調用系統的讀文件函數。
文件復制即將文件節點的文件信息復制到指定的目錄,同時還要把文件中的內容一并復制到新的數據塊中,再加入到指定目錄新建立的文件節點對應的inode中。
文件刪除即將文件對應的文件信息節點從文件鏈中刪除,同時刪除文件所對應的inode塊。在刪除文件對應的inode塊時,首先必須刪除文件所對應數據塊,然后才能從inode鏈上刪除其所對應的inode節點[7]。
3.3.6 頁面緩存模塊
本系統中所有的文件都以邏輯鏈的形式存在,與其對應的inode也是以線性鏈的形式存在。當文件相對較多時,索引或查看文件信息必然會速度較慢。因此特地設計了一個頁面緩存區,用來存放當前使用比較頻繁的數據塊索引和inode索引,以便在訪問數據時提高效率,并使用LRU(最近最久未使用)算法來調度置換緩存頁面[8]。
本節主要展示Ext2系統各模塊的實現界面及實際功能測試效果。測試項有login用戶登錄和regesit用戶注冊、mkDir建立子目錄、mkFile新建文件、delFile刪除文件、copy文件復制、move文件移動、write寫文件命令和read讀文件、cat查看文件內容以及delDir目錄刪除等功能。其中本文僅展示出delDir目錄刪除功能測試結果,如圖6所示。

圖6 delDir命令測試界面
圖6中,在目錄King下擁有目錄Soft,而在
FineCutandOptimumDesignofExt2FileSysteminLinux
ZhouJunjie1,KeYue2
(1.Wenhua College,Wuhan 430086,China;2.Hubei University of Technology)
Based on Linux system,a Ext2 two level file system of Linux multi-level user is constructed and designed to be an embedded file system for GPS and other users through fine tailoring and optimized design.The system includes the definition of each basic entity (index node,directory node,file node etc.) and the definition and implementation of each function module.Finally,the test data of some functional modules of the system are displayed.The Linux file system has been tested and achieves good results.
Linux;Ext2;file system;optimum design
2016年度湖北省高校優秀中青年科技創新團隊計劃項目(No.T201633);2016年啟林教育研究院教育教學研究項目(No.2016-3-20);2014年武漢市信息產業辦軟件產業發展專項(No.GCJH2014005)。
TP368.1
A