ext3檔案系統基礎知識點

531968912發表於2017-12-19
檔案系統的構成
引導塊:儲存引導程式碼
超級塊:單塊大小/總塊數;每組塊數;i節點數/每組i節點數;卷名;最後寫入時間/掛載時間/掛載路徑;空閒i節點/塊資訊(分配新i節點/塊時使用)
組描述符表:每個32位元組,描述每組塊點陣圖/i節點點陣圖/i節點表起始塊號,塊組中空閒塊數和目錄數;檔案系統中所有塊被等分為若干塊組,最後一個可能略小;
塊點陣圖:佔有1個資料塊
I節點點陣圖:佔用1個資料塊,通常用不完
I節點表:存放inode,ext3下每個128位元組,包含12個直接塊指標/1個1級間接快指標/1個2級間接塊指標/1個3級塊指標
資料區:存放檔案資料
對於具備稀疏超級塊特性的檔案系統,只在組號為3/5/7的冪的塊組備份超級塊和塊組描述符,否則每個塊組都有備份;

目錄
目錄也是檔案的一種,除了inode,每個目錄至少佔有1個資料塊,以目錄項的形式儲存其下的檔案列表;
儲存內容包括:檔名的ASCII碼/名字長度/本目錄項長度/i節點號/檔案型別
目錄項長度=max((8位元組固定+檔名), 4*n),對於檔案file.txt,其長度為16;
硬連線:本質上為指向同一inode的不同目錄項而已


--假定每個塊組的inode數量為2008
建立檔案
在/dir1下建立file.txt檔案,大致步驟:
1 讀取超級塊(固定位置),獲取檔案系統基本資訊(塊大小/每組inode數量);讀取組描述符表(固定位置),獲知各個塊組佈局情況;
2 讀取根目錄,從其目錄項中找到dir1以及其inode
   —其inode為2號(固定,位於0號塊組),而inode表開始於5號塊,讀取5號塊訪問第2個inode,其塊指標顯示根目錄的目錄塊號為256;
   --讀取256號塊,遍歷其目錄項,直至找到dir1的目錄項,顯示其inode號為4724;更新根目錄最後訪問時間;
3 建立file.txt的目錄項
   --對dir1的inode號整除運算int(4724/2008)確定其位於2號塊組,其餘數708為該inode表項號,依據2號組描述符表項獲知其i節點表起始於16387塊,
   --讀取該塊, 獲取其708號表項,顯示 dir1目錄塊號為17216
   --讀取17216塊查詢空閒空間,新建檔案file.txt名字長度7字元,需要16位元組空間
   --建立好目錄項,更新該目錄的最後修改時間和最後改變時間,並其改變情況記錄入日誌
4 建立inode
   --優先在父目錄同一塊組建立,即2號組
   --讀取2號塊組位於16386塊的i節點點陣圖,獲知尚未分配的i節點號4850,將其對應bit置1,並將超級塊/組描述符表中空閒inode數減1
   --將該inode地址新增到上一步建立的目錄項中
   --初始化4850號inode
5 分配資料塊
   File.txt需要6個資料塊,檢視2號塊組的塊點陣圖,在本塊組中找出6個空閒塊並將相應bit置1,將這些塊分配到4850號inode的直接塊指標中
   更新超級塊/組描述符中的空閒塊數,更新inode的最後修改時間和改變時間
6  寫資料 
   將file.txt內容寫入新分配的塊中

刪除檔案
1 讀取超級塊 & 組描述符表
2 獲取dir1的inode
   --根目錄inode號為2(位於0號塊組),i節點表起始於第5塊(組描述符表),從第5號塊讀取i節點表並訪問第2個表項
   --從inode的直接塊指標獲知根目錄的目錄塊為256號塊
   --讀取256號塊,遍歷目錄項直至找到dir1記錄,其i節點號為4724
   --更新根目錄最後訪問時間
3 獲取file.txt的inode,回收目錄項
   --dir1的i節點號為4724,取整運算int(4724/2008)=2,位於2號塊組,而2號組的i節點描述符起始於16387號塊(組描述符表)
   --取餘運算(4724%2008)=708,則從16387塊開始讀取第708項inode,inode顯示dir1目錄塊號為17216
   --讀取17216號塊遍歷目錄項,直至找到file.txt匹配項,獲取其i節點號為4850
   --取消該目錄項,其前一項的長度值直接指向其下一項開始處
4 回收file.txt的資料塊,
  --從2號組的i節點表獲取4850號i節點項,將連結數減1,若連結數為0則回收該inode(相應bit置0)
  --對應的6個塊的塊點陣圖bit置0
注:具體請參考馬林編著的《資料重現》

常見問題:
1 為何df顯示磁碟滿但du卻顯示有空閒空間?
刪除檔案時有程式正在開啟,所以實際佔有空間並未釋放;
刪除或truncate一個inode時,先將該inode新增到orphan inode單向連結串列頭,super block結構有相應欄位s_last_orphan指向此連結串列;
如果執行期間系統崩潰,則下次載入該檔案系統時會檢查該連結串列並繼續刪除或truncate操作;

以下是ext4刪除inode的正常過程
-->do_unlinkat
 -->vfs_unlink
  -->ext4_unlink
   -->ext4_delete_entry從該檔案所在目錄中刪除該檔案
   -->ext4_orphan_add
 -->iput
  -->iput_final
   -->generic_drop_inode
    -->generic_delete_inode(inode);
     -->ext4_delete_inode
      -->ext4_truncate清除磁碟上的索引資訊
      -->ext4_orphan_del
      -->ext4_free_inode從記憶體中和磁碟上分別刪除該inode
http://blogimg.chinaunix.net/blog/upfile2/101008204403.pdf
ext3採用間接塊對映,當檔案較大時則對映表開銷會很高,刪除檔案時會將inode中的塊指標清空;
Ext4引入extent,減少了後設資料塊的數量,unlink/truncate的開銷會下降不少,每個extent結構體12位元組,每個inode最多可存放4個;
大部分檔案只需一些extent來描述logical-to-physical塊對映,然而對於稀疏或碎片化十分嚴重的檔案,extent map效率則沒那麼高;
對此需藉助於ext4改進的塊分配器,儘量將小檔案緊鄰存放同時為大檔案分配連續區域;

 

2 如何分配資料塊/inode/目錄項
分配塊
優先在其inode所屬塊組分配,
分配inode
檔案:優先在其父目錄所在組建立;目錄:優先在空餘空間較多的組建立
分配目錄項
從前向後遍歷該目錄的目錄項,對每個目錄項,依據檔名長度計算其改目錄項所需長度,並將其同實際長度值比較,如果不一致則說明要麼為最後一項,要麼跨越了若干被刪除的目錄項,則嘗試在此處分配新目錄項;如當前塊沒有足夠空間,則掛起檔名並分配新塊,linux不允許目錄項跨越塊;


 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25462274/viewspace-2148911/,如需轉載,請註明出處,否則將追究法律責任。

相關文章