ext2文件系統解構探析

內容要點:

  超級塊

  塊位圖

  inode位圖

  數據塊

  inode結構

  VFS基本原理

    整理聽課筆記及自己可與蒐集的各種資料,按理解總結一些文件系統,並且其中部分內容可參看我的上篇筆記《硬盤存儲結構小結》;

 

文件系統:

系統結構:
     塊設備:文件組織管理以物理塊爲單位。物理塊是塊設備上大小相同的存儲區域(如磁盤上的扇區)。一個塊究竟多大是在格式化時確定的,例如mke2fs的-b選項可以設定塊大小爲1024、2048或4096字節。
    一個文件系統一般使用塊設備上一個獨立的邏輯分區;
    文件邏輯分區中除了有表示文件內容的邏輯塊(稱爲數據塊)外,還設置了包含管理和控制信息的邏輯塊。
    磁盤上可能有多個邏輯分區,每個分區可以使用不同的文件子系統;
    ext2文件系統把邏輯分區劃分爲塊組,並且從0開始編號。每個塊組包含的等量的物理塊(即塊組大小是相同的;物理分區最後一個塊組可能小些);在塊組的數據塊中存儲文件或目錄;
   


    上圖中啓動塊(Boot Block)的大小是確定的,就是1KB,啓動塊是由PC標準規定的,用來存儲磁盤分區信息和啓動信息,任何文件系統都不能使用啓動塊。啓動塊之後纔是ext2文件系統的開始,ext2文件系統將整個分區劃成若干個同樣大小的塊組(Block Group),每個塊組都由以下部分組成:


           
超級塊(Super Block)
    描述整個分區的文件系統信息,例如塊大小、文件系統版本號、上次mount的時間等等。
    超級塊位於每個塊組的最前面,每個塊組包含超級塊的內容是相同的(超級塊在每個塊組的開頭都有一份拷貝);
    系統運行期間,把超級塊複製到系統緩衝區內,只需把塊組0的超級塊讀入內存,其它塊組的超級塊做爲備份


 
塊組描述符表(GDT,Group Descriptor Table)
    由很多塊組描述符組成,Linux組描述符爲32字節,整個分區分成多少個塊組就對應有多少個塊組描述符。
    每個塊組描述符(Group Descriptor)存儲一個塊組的描述信息,例如在這個塊組中從哪裏開始是inode表,從哪裏開始是數據塊等等。
    和超級塊類似,塊組描 述符表在每個塊組的開頭也都有一份拷貝,具有相同內容的組描述符表放在每個塊組中做爲備份,這些信息是非常重要的,一旦超級塊意外損壞就會丟失整個分區的數據,一旦塊組描述符意外損壞就會丟失整個塊組的數 據,因此它們都有多份拷貝。通常內核只用到第0個塊組中的拷貝,當執行e2fsck檢查文件系統一致性時,第0個塊組中的超級塊和塊組描述符表就會拷貝到其它塊組,這樣當第0個塊組的開頭意外損壞時就可以用其它拷貝來恢復,從而減少損失。
 


塊位圖(Block Bitmap)
    每個塊組都有一個塊位圖,位於組描述符表之後,用來描述本塊組中數據塊的使用狀況,它本身佔一個邏輯塊,其中的每個bit 代表本塊組中的一個塊,這個bit爲1表示該塊已用,這個bit爲0表示該塊空閒可用;各位的順序與塊組中數據塊順序一致;
    爲什麼用df命令統計整個磁盤的已用空間非常快呢?因爲只需要查看每個塊組的塊位圖即可,而不需要搜遍整個分區。相反,用du命令查看一個較大目錄的已用空間就非常慢,因爲不可避免地要搜遍整個目錄的所有文件。
    調優:與此相聯繫的另一個問題是:在格式化一個分區時究竟會劃出多少個塊組呢?主要的限制在於塊位圖本身必須只佔一個塊。用mke2fs格式化時默認塊大小是1024字節,可以用-b參數指定塊大小,現在設塊大小指定爲b字節,那麼一個塊可以有8b個bit,這樣大小的一個塊位圖就可以表示8b個塊的佔用情況,因此一個塊組最多可以有8b個塊,如果整個分區有s個塊,那麼就可以有s/(8b)個塊組。格式化時可以用-g參數指定一個塊組有多少個塊,但是通常不需要手動指定,mke2fs工具會計算出最優的數值。
inode位圖(inode Bitmap)
    和塊位圖類似,本身佔一個塊,其中每個bit表示一個inode是否空閒可用。
inode表(inode Table)
    一個塊組中所有文件的inode形成了inode表, 表項序號是inode號;
    我們知道,一個文件除了數據需要存儲之外,一些描述信息也需要存儲,例如文件類型(常規、目錄、符號鏈接等),權限,文件大小,創建/修改/訪問時間等,也就是ls -l命令看到的那些信息,這些信息存在inode中而不是數據塊中。每個文件都有一個inode,一個塊組中的所有inode組成了inode表。
    inode表佔多少個塊在格式化時就要決定並寫入塊組描述符中,mke2fs格 式化工具的默認策略是一個塊組有多少個8KB就分配多少個inode。由於數據塊佔了整個塊組的絕大部分,也可以近似認爲數據塊有多少個8KB就分配多少 個inode,換句話說,如果平均每個文件的大小是8KB,當分區存滿的時候inode表會得到比較充分的利用,數據塊也不浪費。如果這個分區存的都是很 大的文件(比如電影),則數據塊用完的時候inode會有一些浪費,如果這個分區存的都是很小的文件(比如源代碼),則有可能數據塊還沒用完inode就 已經用完了,數據塊可能有很大的浪費。如果用戶在格式化時能夠對這個分區以後要存儲的文件大小做一個預測,也可以用mke2fs的-i參數手動指定每多少個字節分配一個inode。
數據塊(Data Block)
    根據不同的文件類型有以下幾種情況
    1.  對於常規文件,文件的數據存儲在數據塊中。
    2.  對於目錄,該目錄下的所有文件名和目錄名存儲在數據塊中,注意文件名保存在它所在目錄的數據塊中,除文件名之外,ls -l命令看到的其它信息都保存在該文件的inode中。注意這個概念:目錄也是一種文件,是一種特殊類型的文件。
    3.  對於符號鏈接,如果目標路徑名較短則直接保存在inode中以便更快地查找,如果目標路徑名較長則分配一個數據塊來保存。
    4.  設備文件、FIFO和socket等特殊文件沒有數據塊,設備文件的主設備號和次設備號保存在inode中。



  inode結構:
   inode是EXT2基本構件,表示文件系統樹型結構的節點。
   EXT2文件系統中的每個文件由一個inode描述,且只能由一個inode描述。
   inode與文件一起存放在外存,系統運行時,把inode寫入內存建立映像,加快文件系統速度。



虛擬文件系統VFS簡介:
  作用:
     Linux的虛擬文件系統VFS屏蔽了各種文件系統的差別,爲處理各種不同文件系統提供了統一的接口。
  工作原理:
     



描述:
   VFS並不是一種實際文件系統
   EXT2等物理文件系統是存在於外存空間的,而VFS 僅存在於內存
   VFS是在系統啓動時建立,在系統關閉時消失的,物理文件系統是長期存在於外存。
   VFS中包含着向物理文件系統轉換的一系列數據結構,如VFS超級塊、VFS的inode等、各種操作函數的轉換入口。
文件系統註冊:
  向系統內核註冊文件系統的兩種方式:
     1. 系統引導時在VFS中註冊,在系統關閉時註銷。
     2. 把文件系統做爲可裝卸模塊,安裝時在VFS中註冊,並在模塊卸載時註銷
文件系統的安裝(也可稱爲mount掛載):
    文件系統除在VFS中註冊,還必須安裝到系統中。
    要安裝的文件系統必須已經存在於外存磁盤空間上,每個文件系統佔用一個獨立的磁盤分區,並且具有各自的樹型層次結構。
    EXT3是RedHat Linux 5的標準文件系統,所以系統把EXT3文件系統的磁盤分區做爲系統根文件系統
    EXT2以外的文件系統安裝在根文件系統下的某個目錄下,成爲系統樹型結構中的一個分枝。
    用於安裝其它文件系統的目錄稱爲安裝點或安裝目錄
圖示:
     


參考:http://www.chinaup.org/man/linux_c/ch29s02.html

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章