我知道作業系統在硬碟上存取的第一個東西是超級塊。
但然後呢?
答案1
作業系統依賴內核,而內核使用各種檔案系統的驅動程式進行讀/寫。檔案的處理是透過驅動程式和系統呼叫透過介面進行抽象的,因此當您說open("file.txt")
您不需要知道檔案如何儲存在磁碟上等時。 。這是 ext 系統上的通用片段。
分機範例。
- 積木: 磁碟分為積木的連續空間。
- 區塊組:塊被分成組。
- 索引節點:有關條目(例如檔案、目錄等)的結構化資訊集。
- 目錄: inode <–> 名稱列表
每個區塊組有一個屬於該群組的 inode 結構表。
核心佈局:
Padding 1024 bytes
Super-Block 1 block *
Block Group Descriptor Table many blocks *
Reserved many blocks
Data Block Bitmap 1 block *
inode Bitmap 1 block *
inode Table many blocks *
Data Blocks many more blocks *
超級塊包含以下資訊:
- 索引節點總數
- 區塊總數
- 組中的區塊數
- 群組中的 inode 數量
除了儲存在區塊組 0 中之外,冗餘副本還儲存在其他地方作為備份(以防損壞)。
區塊組描述符表直接在超級街區。除此之外,它還包括:
- 數量區塊組在分區中
- 每個描述符區塊組
每個描述符都包含有關該描述符的資料結構的信息區塊組位於。
區塊組除其他事項外,還成立:
- inode表開始的區塊位址
- 組內目錄數
點陣圖保存有關使用的資訊。0
未使用和1
已使用。
索引節點(索引節點)
inode 結構的作用是不是抓住:
- 姓名
- 文件數據
索引節點保存以下資訊:
- 類型、權限、使用者、日期…指向資料的指針
文件的資料保存在區塊中。索引節點保存有關檔案佔用哪些區塊的資訊。這是透過 inode 中的指標完成的。還有不只一個類型的指針。如果我們呼叫指向資料 PTR 的指針,則:
[PTR] 資料塊的位址
- 12 - 直接指針:
- [PTR] 資料塊的位址
- 1 - 單間接指針:
- [S_PTR] 包含 PTR 清單的區塊位址
- 1 - 雙重間接指標:
- [D_PTR] 包含 S_PTR 清單的區塊位址
- 1 - 三重間接指標:
- [T_PTR] 包含 D_PTR 清單的區塊位址
一個指針的數量堵塞取決於區塊大小。
目錄是一個索引節點。它的數據保存有關文件的資訊。每個條目都連結一個名稱和一個索引節點。每個目錄.
本身也有 , 並..
有效連結到父目錄。這些無法刪除。
根目錄始終在分機上有 inode 2。做stat /
或cd /; stat .
看。它的..
連結是.
建立檔案後,它會以芳香方式添加到其正確的目錄中。
索引節點號碼是索引。它們是索引節點表中的有序索引到索引節點結構。由於索引節點結構的大小是固定的,因此可以計算索引節點結構的位置。
由於超級塊有一個每個群組的索引節點可以透過以下方式找到塊組:
block_group = (inode - 1) / inodes_per_group;
然後找到索引:
inode_index = (inode - 1) % inodes_per_group;
閱讀結構和資料連結。讀取資料。
偵錯檔案
可以用來debugfs
提取有關檔案系統的各種資訊。
-w
如果您關心數據,請確保不使用該標誌。
可以選擇建立一個小樣本來玩。
truncate -s 2M test
mkfs.ext4 -F test
mkdir x
sudo mount test x
sudo chown me x
cd x
echo "Hello Disk" >hello.txt
mkdir a b c
echo "Hello Bee" >b/hib.txt
sudo unount x
debugfs test
輸入?
命令列表。
debugfs: stats
(縮小)
Inode count: 256
Block count: 2048
Reserved block count: 102
Free blocks: 953
Free inodes: 240
First block: 1
Block size: 1024
Fragment size: 1024
Group descriptor size: 64
Blocks per group: 8192
Inodes per group: 256
Inode blocks per group: 32
First inode: 11
Inode size: 128
Directories: 5
Group 0: block bitmap at 18, inode bitmap at 34, inode table at 50
953 free blocks, 240 free inodes, 5 used directories, 240 unused inodes
[Checksum 0x055a]
...
debugfs: imap hello.txt
Inode 12 is part of block group 0
located at block 51, offset 0x0180
其他例子: https://www.cs.montana.edu/courses/309/topics/4-disks/debugfs_example.html