對文件系統而言,文件僅是一系列可讀寫的數據塊。文件系統並不須要瞭解數據塊應該放到物理介質上什麼位置。這些都是設備驅動的任務。不管什麼時候,只要文件系統須要從包含它的塊設備中讀取信息或數據,它就將請求底層的設備驅動讀取一個基本塊大小整數倍的數據塊。EXT2文件系統將它所使用的邏輯分區劃分紅數據塊組。每一個數據塊組都將那些對文件系統完整性最重要的信息複製出來,同時將實際文件盒目錄看作信息與數據塊。node
羅即文件系統管理的是一個邏輯空間,這個邏輯空間就像一個大的數組,數組的每一個元素就是文件系統操做的基本單位——邏輯塊。邏輯塊是從0開始編號的,並且,邏輯塊是連續的,邏輯塊相對的是物理塊。一般,EXT2的物理塊佔一個或幾個連續的扇區。數組
通常而言,只有塊組0的超級塊纔讀入內存,其餘塊組的超級塊僅僅做爲備份。在系統運行期間,要將超級塊複製到內存系統緩衝區。緩存
在EXT2文件系統中,採用位圖描述數據塊和索引節點的使用狀況,每一個塊組中佔用兩個塊,即一個用來描述該數據塊的使用狀況,另外一個描述該組索引節點的使用狀況。這兩個塊分別稱爲數據位圖塊和索引節點位圖塊。數據位圖塊中的每一位表示該塊組中的每個塊的使用狀況,若是爲0,則表示相應數據塊空閒,若是是1,則表示已分配。數據結構
每一個塊組中的索引節點都存儲在各自的索引節點表中,而且按索引節點號依次存儲。索引節點表一般佔好幾個數據塊,索引節點表所佔的塊使用時也想普通的數據塊同樣被調入塊高速緩存。函數
EXT2整個磁盤的邏輯結構如圖所示:spa
超級塊中包含了描述文件系統基本尺寸和形態的信息。文件系統管理器利用他們來使用和維護文件系統。EXT2超級塊是用來描述EXT2文件系統總體信息的數據結構,是EXT2的核心所在。超級塊經函數ext2_fill_supter讀入後,又在內存中創建一個映像super_block.u.ext2_sb_info結構。3d
結構ext2_super_block列出以下:指針
邏輯塊是從0開始編號的,對塊大小爲1KB的文件系統,s_first_data_block爲1,對其餘文件系統,則爲0.blog
EXT2超級塊被讀入內存後,主要用於填寫VFS的超級塊。此外,它還要填寫另一個結構ext2_super_info。結構ext2_super_info描述了EXT2文件系統特定的信息。之因此要用到這個結構,是由於VFS的超級塊必須兼容各類文件系統的不一樣的超級塊結構,所以每一個文件系統超級塊特定的特性必須用另外一個結構保存於內存中,以加快對文件的操做。EXT2超級塊與VFS超級塊的關係如圖所示:索引
結構ext2_super_info列出以下:
超級塊的操做函數結構以下所示:
在EXT2文件系統中每一個文件與目錄由唯一的inode來描述。每一個數據塊組的EXT2 inode被保存在inode表中,同時還有一個位圖被系統用來跟蹤已分配和未分配的inode。
EXT2文件系統使用索引節點來記錄文件信息。每一個普通文件盒目錄都有唯一的索引節點與之對應,索引節點中含有文件或目錄的重要信息。當你要訪問一個文件或目錄時,經過文件或目錄名首先找到與之對應的索引節點,而後經過索引節點獲得文件或目錄的信息及磁盤上的具體的存儲位置。
EXT2在硬盤上的索引節點的數據結構以下:
EXT2經過索引節點中的數據塊指針數組進行邏輯塊到物理塊的映射。在EXT2索引節點中,數據塊中數組共有15項,前12個爲直接指針,後三個分別爲「一次間接指針」、「二次間接指針」、「三次間接指針」,EXT2默認的物理塊大小爲1KB,塊地址佔4個字節,因此每一個物理塊能夠存儲256個地址。這樣,文件大小最大可達12KB+256KB+64MB+16GB。但實際上,Linux是32位系統,故文件大小最大隻能爲4GB,及整個文件系統都被一個文件所佔用。索引節點的物理塊指針數組如圖所示:
系統是以邏輯塊號爲索引查找物理塊的。例如,要找到第100個邏輯塊對應的物理塊,由於256+12>100>12,因此要用到一次間接塊,在一次間接塊中查找第88項,此項內容就是對應的物理塊的地址。
節點在磁盤上是通過編號的。其中,有一些節點有特殊用途,用戶不能使用。這些特殊節點定義爲:
與EXT2超級塊相似,當磁盤上的索引節點調入內存後,除了要填寫VFS的索引節點外,系統還要根據它填寫另外一個數據結構ext2_inode_info,其做用也是爲了存儲特定文件系統本身的特性。
結構ext2_inode_info分析以下:
VFS索引節點中沒有物理塊指針數組的域,這個EXT2特有的信息在調入內存後,就必須保持在ext2_inode_info這個結構中。
在塊組中緊跟着超級塊後面的塊是組描述符,在start_sect+block_size*2位置上。乘以2的緣由是block_size是KByte爲單位,咱們用扇區訪問。組描述符表每一項爲組描述符,是一個叫ext2_group_desc的數據結構,供32字節。它用來描述某個塊組的總體信息。
找到了組描述符,可獲得不少信息,如該組塊組位圖的位置,該組塊inode位圖位置,該組塊inode表的位置等。
組描述符的定義以下:
在 函數init_ext2_fs註冊了EXT2文件系統,函數分析以下:
文件系統實例ext2_fs_type列出以下:
函數ext2_get_sb打開塊設備,獲得超級塊,將這個超級塊加到全局super_blocks鏈表中,並掛接文件系統。函數ext2_get_sb列出以下:
函數ext2_fill_super從硬盤中讀出超級塊數據並填充超級塊結構。
超級塊操做函數集實例ext2_sops列出以下:
文件的讀寫操做都調用到具體文件系統的讀寫操做函數結構,這裏即調用到EXT2文件系統的ext2_file_operations結構,獲得具體的操做函數。
下圖爲read系統調用的操做函數層次圖,可見EXT2文件系統的讀操做最終調用ext2_readpage函數完成,對於文件讀操做過程當中的文件對內存的映射過程。
結構ext2_file_operations是EXT2文件系統對於文件的操做函數集,列出以下:
ext2_aops結構是EXT2 文件系統中具體操做實現函數集,它被ext2_file_operations結構的函數所調用。列出以下:
ext2_aops結構中的這些函數列出以下:
這些函數除了調用的ext2_get_block函數是EXT2文件系統特有的外,其餘都是fs/buffer.c中的函數。
ext2_get_block()將對文件系統的邏輯塊號轉換爲塊設備的邏輯塊號。這種轉化關係是由ext2_inode結構中i_block[]數組描述的i_block[]的前12項爲直接索引表,第13項爲間接索引塊指針,第14項爲二重索引塊指針,第15項爲三重索引塊指針。當文件長度不超過12個塊時,可經過直接塊索引表直接定位目標塊;當文件長度超過12塊,而且剩餘的部分不超過間接塊索引數量時,就在間接塊索引塊中定位目標塊,依次類推。
函數ext2_get_block功能是從邏輯塊序號獲得對應物理塊。若對應物理塊被刪除,則從新分配,並獲得它間接塊路徑。
函數ext2_get_block具體分析以下:
系統是以邏輯塊號爲索引查找物理塊的。例如,要找到第100個邏輯塊對應的物理塊,由於256+12>100>12,因此要用到一次間接塊,在一次間接塊中查找第88項,此項內容就是對應的物理塊的地址。
函數ext2_get_branch從物理塊中讀取數據到chain的buffer中,函數的參數說明以下:
函數ext2_get_branch的功能是填充Indirect結構的數組,若是運行正常,則返回NULL。函數分析以下:
函數ext2_alloc_branch分配並創建一個塊鏈表,其中參數inode表示需分配塊的節點,參數num表示間接塊的深度,參數offsets是一個數組,即offsets[num],參數branch是存儲鏈表的地方。函數分析以下:
文件系統廣泛存在的一個問題是碎片化,即一個文件所包含的數據塊遍及整個文件系統,這使得對文件數據塊的順序訪問愈來愈慢。EXT2文件系統試圖經過分配一個和當前文件數據塊在物理位置上鄰接,或者至少位於同一個數據塊組中的新塊來解決這個問題。
在EXT2中,目錄是一種特殊的文件,它是由ext2_dir_entry結構組成的列表。爲了減小磁盤空間的浪費,這個結構是可變長的。可是,它還有必定的長度方面的限制:一是文件名最長只能爲255個字符;二是儘管文件名長度能夠不限,但系統自動將之變成4的整數倍,不足的地方用0填充。
EXT2把文件名和文件信息分開存儲,其中文件信息用索引節點來描述,目錄項是用來聯繫文件名和索引節點的。目錄項中,每一對文件名和索引節點號的一個一一對應稱爲一個連接,這就是說,同一個索引節點表能夠對應多個不一樣的文件名。這種連接稱爲硬連接。能夠用ln命令爲一個已存在的文件創建一個新的硬連接:
ln /home/cyf/file1 /home/cyf/file2
創建了一個文件file2,連接到file1上。file2和file1有相同的索引節點號,也就是和file1共享同一個索引節點。在創建了一個新的硬連接後,這個索引節點中的i_links_count值將加1,i_links_count的值反映了連接到這個索引節點上的文件數。
使用硬連接的好處在於:
1)因爲刪除文件時,實際上先對i_links_count作減1,若是i_links_count不爲0,則結束,即僅僅刪除了一個硬連接,實際文件的數據並無刪除。只有在i_links_count爲0時,真正將文件從磁盤上刪除。這樣,你能夠對重要的文件做多個連接,防止文件被刪除。
2)容許用戶在不進入某個目錄的狀況下對該目錄下面的文件進行處理。
符號連接與硬連接最大的不一樣就在於它並不與索引節點創建連接,也就是說,當爲一個文件創建一個符號連接時,索引節點的連接計數並不變化。當你刪除一個文件時,它的符號連接文件也就失去了做用,而當你刪除一個文件的符號連接文件,對該文件自己並沒有影響。