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改進的塊分配器,儘量將小檔案緊鄰存放同時為大檔案分配連續區域;
2 如何分配資料塊/inode/目錄項
分配塊
優先在其inode所屬塊組分配,
分配inode
檔案:優先在其父目錄所在組建立;目錄:優先在空餘空間較多的組建立
分配目錄項
從前向後遍歷該目錄的目錄項,對每個目錄項,依據檔名長度計算其改目錄項所需長度,並將其同實際長度值比較,如果不一致則說明要麼為最後一項,要麼跨越了若干被刪除的目錄項,則嘗試在此處分配新目錄項;如當前塊沒有足夠空間,則掛起檔名並分配新塊,linux不允許目錄項跨越塊;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25462274/viewspace-2148911/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 檔案系統基礎
- java基礎知識點Java
- JavaWeb基礎知識點JavaWeb
- JavaScript基礎知識點JavaScript
- 推薦系統基礎知識(二)
- Linux系統基礎知識整理Linux
- Linux 檔案系統-ext3 檔案系統介紹(轉)Linux
- Java基礎知識點梳理Java
- Servlet基礎知識點整理Servlet
- JavaScript部分基礎知識點JavaScript
- Java 基礎面試知識點Java面試
- 基礎知識6——建立和管理配置檔案
- Kafka訊息系統基礎知識索引Kafka索引
- Linux系統檔案系統及檔案基礎篇Linux
- 408 知識點筆記——作業系統(檔案系統、裝置管理)筆記作業系統
- linux檔案系統基礎Linux
- c++基礎知識(十一)檔案的複製C++
- vueX基礎知識點筆記Vue筆記
- Python基礎知識點梳理Python
- ES 基礎知識點總結
- Java基礎知識點總結Java
- Redis 基礎知識點總結Redis
- Dubbo基礎入門知識點
- Java入門基礎知識點Java
- CSS基礎知識點總結CSS
- MySQL基礎知識點彙總MySql
- UNIX(IBM AIX)系統基礎知識(轉)IBMAI
- 用python處理文字,本地檔案系統以及使用資料庫的知識基礎Python資料庫
- linux檔案系統基礎(轉)Linux
- Python基礎知識之檔案的讀取操作Python
- 基礎知識5——表空間和資料檔案
- ext3grep ext3檔案系統下恢復檔案
- Java基礎面試知識點總結Java面試
- 前端知識點總結——JavaScript基礎前端JavaScript
- Flutter 知識點總結-基礎篇Flutter
- JavaSE基礎 (全網最全知識點)Java
- iOS基礎面試知識點總結iOS面試
- JavaScript的基礎知識點(面試題)JavaScript面試題