您好,登錄后才能下訂單哦!
ext3文件系統基礎知識點有哪些,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
文件系統的構成
引導塊:存儲引導代碼
超級塊:單塊大小/總塊數;每組塊數;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改進的塊分配器,盡量將小文件緊鄰存放同時為大文件分配連續區域;
http://ols.fedoraproject.org/OLS/Reprints-2008/kumar-reprint.pdf
2 如何分配數據塊/inode/目錄項
分配塊
優先在其inode所屬塊組分配,
分配inode
文件:優先在其父目錄所在組創建;目錄:優先在空余空間較多的組創建
分配目錄項
從前向后遍歷該目錄的目錄項,對每個目錄項,依據文件名長度計算其改目錄項所需長度,并將其同實際長度值比較,如果不一致則說明要么為最后一項,要么跨越了若干被刪除的目錄項,則嘗試在此處分配新目錄項;如當前塊沒有足夠空間,則掛起文件名并分配新塊,linux不允許目錄項跨越塊;
看完上述內容,你們掌握ext3文件系統基礎知識點有哪些的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。