ext2檔案系統儲存結構

2021-05-28 17:45:13 字數 1606 閱讀 2370

原文:

看了幾天《深入理解linux核心》的ext2檔案系統部分和vfs部分,稍微了解了點檔案在記憶體中的儲存結構,但是總是弄不清楚在硬碟上實際的儲存方式,特別是資料夾的儲存。

儲存資料夾的結構很簡單,沒有這個資料夾下所有檔案的索引,看了幾遍書,都不能理解在硬碟上資料夾結構的儲存,只能根據網上的例子自己跟著做實驗。(過程參考了的部落格)

首先顯示要分配乙個空間,格式化為ext2分割槽,並在這個空間上進行檔案和資料夾的操作。

dd if=/dev/zero of=disk bs=1m count=1 #建立1mb的空間,並填充為0

mkfs.ext2 disk #格式化為ext2分割槽,從輸出資訊中可以看見block大小為1024byte

mount -o loop disk /mnt/ #掛載分割槽

然後進入掛載的目錄,開始建立檔案和資料夾。

test.txt(內容為hello)

建立test1.txt(內容為hello1)

建立資料夾test

在資料夾test中,建立檔案test2.txt(內容為hello2)

建立檔案test3.txt(內容為hello3)

然後就可以解除安裝這個檔案,用16進製制編輯器開啟disk檔案,檢視ext2的檔案儲存格式。

開啟disk檔案後,跳轉到位址0x800處(開頭第一塊保留為引導塊,後面一塊為塊組0的超級塊),即塊組0的組描述符處。

根據組描述符的結構,在第9個位元組開始是第乙個索引節點表塊的塊號。從這開始的4個位元組(均為little-endian),就是第乙個索引節點表塊的塊號。這裡是8。根據計算可知,它的16進製制位址是0x2000。

因為檔案系統的根目錄總是在索引節點的第二個,每個索引節點大小是固定的,為128位元組(0x80)。即位址0x2080就是根目錄的索引節點(inode)。根據索引節點的結構,可以找到根目錄資料塊編號為0x18,也就是位址0x6000。

在0x6000處,可以看見根目錄下建立的所有目錄和檔案。也就是說,ext2的資料夾結構ext2_dir_entry_2中儲存的內容,不是資料夾本身,而是資料夾中的所有檔案的資訊(包括目錄),其中的第乙個inode欄位,是這個檔案(資料夾)所在的索引節點編號。

這裡找到的除了剛剛建立的乙個資料夾和乙個檔案之外,還有檔案系統建立的時候自動產生的lost+find資料夾和.和..資料夾(分別表示本資料夾和父資料夾)。通過目錄結構的第乙個字段,可以找到想要尋找的檔案(資料夾)所在的inode,然後去索引節點表中尋找這個節點,並找到這個節點的資料儲存位置(i_blocks欄位),再計算分配到的block的位址,讀取實際的資料。

根據目錄的結構查詢,找到test.txt的索引節點偏移量是0x0d。那麼,test.txt的索引節點位址是0x2000+0x80*(0x0d-0x01)=0x2600。在該處找到資料塊的指標為0x27(位址0x9c00)。轉到0x9c00,就可以看見裡面的資料hello。

ext2檔案系統

ext2磁碟結構 ext2分割槽和ext2分組的分布圖 下圖是借用其他部落格的 塊組中的每個塊包含的資訊 超級快 1個塊 描述該分割槽中的整個檔案系統的資訊,包括有多少個快組,每個快組有多少個塊,多少個索引節點等。組描述符塊 n塊 塊點陣圖 1塊 索引節點位圖 1塊 索引節點 n塊 資料塊 n塊 塊...

Ext2檔案系統

ext2檔案系統的總體布局,如下圖。1檔案系統的最小儲存單元是塊 block 塊的大小一般為512bytes,或者是它的整數倍,塊的大小是在格式化是所確定的。不能修改除非重新格式化。上圖中顯示了檔案系統的總體布局,由乙個boot block和對個block group組成,每個block group...

掛載EXT2檔案系統

檔案系統的安裝主要是通用mount命令來實現的,然後通過系統呼叫由使用者態進入到核心態,把某乙個分割槽下的檔案系統掛載到某乙個目錄下,當然掛載也可以能指定掛載的檔案系統。mount函式通過sys mount函式來實現,其具體函式如下 asmlinkage long sys mount char us...