您的位置:首頁(yè) > 軟件教程 > 教程 > 文件系統(tǒng)(六):一文看懂linux ext4文件系統(tǒng)工作原理

文件系統(tǒng)(六):一文看懂linux ext4文件系統(tǒng)工作原理

來(lái)源:好特整理 | 時(shí)間:2024-06-11 09:45:45 | 閱讀:153 |  標(biāo)簽: T in 工作 linux   | 分享到:

liwen01 2024.06.09 前言 Linux系統(tǒng)中的ext2、ext3、ext4 文件系統(tǒng),它們都有很強(qiáng)的向后和向前兼容性,可以在數(shù)據(jù)不丟失的情況下進(jìn)行文件系統(tǒng)的升級(jí)。目前ext4是一個(gè)相對(duì)較成熟、穩(wěn)定且高效的文件系統(tǒng),適用于絕大部分規(guī)模和需求的Linux環(huán)境。 ext4它突出的特點(diǎn)有:數(shù)

liwen01 2024.06.09

前言

Linux系統(tǒng)中的ext2、ext3、ext4 文件系統(tǒng),它們都有很強(qiáng)的向后和向前兼容性,可以在數(shù)據(jù)不丟失的情況下進(jìn)行文件系統(tǒng)的升級(jí)。目前ext4是一個(gè)相對(duì)較成熟、穩(wěn)定且高效的文件系統(tǒng),適用于絕大部分規(guī)模和需求的Linux環(huán)境。

ext4它突出的特點(diǎn)有: 數(shù)據(jù)分段管理、多塊分配、延遲分配、持久預(yù)分配、日志校驗(yàn)、支持更大的文件系統(tǒng)和文件大小。

ext4文件系統(tǒng)的具體實(shí)現(xiàn)比較復(fù)雜,本文嘗試用比較簡(jiǎn)單的方式用一篇文章的篇幅來(lái)簡(jiǎn)單地介紹一下它的工作原理。

(一)創(chuàng)建ext文件系統(tǒng)

為了分析ext4 文件系統(tǒng)的內(nèi)部結(jié)構(gòu)和原理,這里我們?cè)贚inux中創(chuàng)建一個(gè)ext4文件系統(tǒng)鏡像,然后通過(guò)loop虛擬設(shè)備將ext4鏡像文件掛載到某個(gè)目錄上。具體實(shí)現(xiàn)步驟如下:

  1. 創(chuàng)建一個(gè)1GB的文件
dd if=/dev/zero of=./ext4_image.img bs=1M count=1024
  1. 將這個(gè)文件格式化成 ext4 文件系統(tǒng)格式
mkfs.ext4 ext4_image.img
  1. 通過(guò)Linux的loop虛擬設(shè)備將文件掛載到目錄上
sudo mount -o loop ext4_image.img /home/biao/test/ext4/ext4_simulator
  1. dumpe2fs 查看文件系統(tǒng)基本信息
dumpe2fs ext4_image.img  

輸出內(nèi)容信息(中間省略了部分內(nèi)容):

dumpe2fs 1.44.1 (24-Mar-2018)
Filesystem volume name:   
Last mounted on:          /home/biao/test/ext4/ext4_simulator
Filesystem UUID:          0169498e-f5f7-4fb8-9e9e-532088e41333
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit flex_bg sparse_super large_file huge_file dir_nlink extra_isize metadata_csum
Filesystem flags:         signed_directory_hash 
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              65536
Block count:              262144
Reserved block count:     13107
Free blocks:              247703
Free inodes:              65517
First block:              0
Block size:               4096
Fragment size:            4096
Group descriptor size:    64
Reserved GDT blocks:      127
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
Flex block group size:    16
Filesystem created:       Fri May 24 17:18:57 2024
Last mount time:          Wed Jun  5 19:15:36 2024
Last write time:          Wed Jun  5 19:15:36 2024
Mount count:              3
Maximum mount count:      -1
Last checked:             Fri May 24 17:18:57 2024
Check interval:           0 ()
Lifetime writes:          6997 kB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               256
Required extra isize:     32
Desired extra isize:      32
Journal inode:            8
Default directory hash:   half_md4
Directory Hash Seed:      0faf0e8c-f385-4ecd-b3a4-db2a3329e121
Journal backup:           inode blocks
Checksum type:            crc32c
Checksum:                 0x32dc1b70
Journal features:         journal_64bit journal_checksum_v3
Journal size:             32M
Journal length:           8192
Journal sequence:         0x00000017
Journal start:            1
Journal checksum type:    crc32c
Journal checksum:         0xa3c1b983

Group 0: (Blocks 0-32767) csum 0xf19b [ITABLE_ZEROED]
  Primary superblock at 0, Group descriptors at 1-1
  Reserved GDT blocks at 2-128
  Block bitmap at 129 (+129), csum 0x8efc34cf
  Inode bitmap at 137 (+137), csum 0x49f91ed6
  Inode table at 145-656 (+145)
  28517 free blocks, 8176 free inodes, 3 directories, 8176 unused inodes
  Free blocks: 4251-32767
  Free inodes: 17-8192
..........
..........
..........
Group 7: (Blocks 229376-262143) csum 0x7daa [INODE_UNINIT, ITABLE_ZEROED]
  Backup superblock at 229376, Group descriptors at 229377-229377
  Reserved GDT blocks at 229378-229504
  Block bitmap at 136 (bg #0 + 136), csum 0x5bd8cca0
  Inode bitmap at 144 (bg #0 + 144), csum 0x00000000
  Inode table at 3729-4240 (bg #0 + 3729)
  32639 free blocks, 8192 free inodes, 0 directories, 8192 unused inodes
  Free blocks: 229505-262143
  Free inodes: 57345-65536
1.1 ext4文件系統(tǒng)信息表

(二)ext4 磁盤(pán)布局

從上面dumpe2fs的數(shù)據(jù)上我們可以看出,一個(gè)1GB大小的空間,ext4 文件系統(tǒng)將它分隔成了0~7的8個(gè)Group。

ext4 的總體磁盤(pán)布局如下:
文件系統(tǒng)(六):一文看懂linux ext4文件系統(tǒng)工作原理

圖2.1 ext4總體布局
其中,每個(gè)Group中又有superblock、Group descriptors、bitmap、Inode table、usrer data、還有一些保留空間,細(xì)分之后的空間布局如下:

文件系統(tǒng)(六):一文看懂linux ext4文件系統(tǒng)工作原理

圖2.2 ext4 group 布局

從上圖可以看出:

  1. Backup superblock、Group descriptors、Reserved GDT 是分布在1、3、5、7 這幾個(gè)Group中,2、4、6Group并沒(méi)有這些信息。
  2. Block bitmap、Inode bitmap、Inode table 這些元文件在每個(gè)Group中的位置并不一樣,而是相差1個(gè)Block。

為什么需要這樣設(shè)計(jì)?這個(gè)下面稍晚點(diǎn)再介紹

(三) superblock超級(jí)塊

從上面《1.1 ext4文件系統(tǒng)信息表》中可以知道Primary superblock在第0號(hào)block,每個(gè)block的大小為4096Byte。

用hexdump 命令查看超級(jí)塊的數(shù)據(jù)

biao@ubuntu:~/test/ext4$ hexdump -s 0 -n 4096 -C ext4_image.img    
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000400  00 00 01 00 00 00 04 00  33 33 00 00 97 c7 03 00  |........33......|
00000410  ed ff 00 00 00 00 00 00  02 00 00 00 02 00 00 00  |................|
00000420  00 80 00 00 00 80 00 00  00 20 00 00 9c c1 5d 66  |......... ....]f|
00000430  00 d0 5f 66 02 00 ff ff  53 ef 01 00 01 00 00 00  |.._f....S.......|
00000440  81 5b 50 66 00 00 00 00  00 00 00 00 01 00 00 00  |.[Pf............|
00000450  00 00 00 00 0b 00 00 00  00 01 00 00 3c 00 00 00  |............<...|
00000460  c2 02 00 00 6b 04 00 00  01 69 49 8e f5 f7 4f b8  |....k....iI...O.|
00000470  9e 9e 53 20 88 e4 13 33  00 00 00 00 00 00 00 00  |..S ...3........|
00000480  00 00 00 00 00 00 00 00  2f 68 6f 6d 65 2f 62 69  |......../home/bi|
00000490  61 6f 2f 74 65 73 74 2f  65 78 74 34 2f 65 78 74  |ao/test/ext4/ext|
000004a0  34 5f 73 69 6d 75 6c 61  74 6f 72 00 00 00 00 00  |4_simulator.....|
000004b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000004c0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 7f 00  |................|
000004d0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000004e0  08 00 00 00 00 00 00 00  00 00 00 00 0f af 0e 8c  |................|
000004f0  f3 85 4e cd b3 a4 db 2a  33 29 e1 21 01 01 40 00  |..N....*3).!..@.|
00000500  0c 00 00 00 00 00 00 00  81 5b 50 66 0a f3 01 00  |.........[Pf....|
........
biao@ubuntu:~/test/ext4$ 

對(duì)超級(jí)塊的部分?jǐn)?shù)據(jù)進(jìn)行解析:
文件系統(tǒng)(六):一文看懂linux ext4文件系統(tǒng)工作原理

表3.1 superblock參數(shù)解析

從上表可以看出superblock的主要內(nèi)容有:
文件系統(tǒng)信息、塊大小和塊組信息、Inode 相關(guān)信息、文件系統(tǒng)大小和使用情況、日志相關(guān)信息、掛載信息、校驗(yàn)和和備份信息

其實(shí)使用dumpe2fs命令查看的ext4文件系統(tǒng)信息就是從superblock上的數(shù)據(jù)解析而來(lái)。

除了Primary superblock,還在不同的group中有備份superblock,其內(nèi)容與Primary superblock原始數(shù)據(jù)相同,Primary superblock損壞的時(shí)候可以從備份區(qū)恢復(fù)回來(lái)。

(四) Group descriptors組描述

在 ext4 文件系統(tǒng)中,Group Descriptor(塊組描述符)是一個(gè)關(guān)鍵的結(jié)構(gòu),用于描述和管理文件系統(tǒng)的塊組(Block Group)。每個(gè)塊組包含文件系統(tǒng)中的一部分?jǐn)?shù)據(jù)塊和 inode,并且有自己的元數(shù)據(jù)來(lái)管理這些資源。Group Descriptor 在超級(jí)塊之后緊隨其后,是文件系統(tǒng)的組織和管理的核心部分

從上面《1.1 ext4文件系統(tǒng)信息表》中可以知道group0 的 Group descriptors 在第1個(gè)數(shù)據(jù)塊中,其大小為1個(gè)block

group 0 中 Group descriptors 的數(shù)據(jù)如下:

biao@ubuntu:~/test/ext4$ hexdump -s 4096 -n 4096 -C ext4_image.img
00001000  81 00 00 00 89 00 00 00  91 00 00 00 65 6f f0 1f  |............eo..|
00001010  03 00 04 00 00 00 00 00  cf 34 d6 1e f0 1f 9b f1  |.........4......|
00001020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00001030  00 00 00 00 00 00 00 00  fc 8e f9 49 00 00 00 00  |...........I....|
00001040  82 00 00 00 8a 00 00 00  91 02 00 00 b5 79 fd 1f  |.............y..|
00001050  03 00 04 00 00 00 00 00  c2 fd 0a 43 fd 1f c2 4a  |...........C...J|
00001060  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00001070  00 00 00 00 00 00 00 00  8e a7 8c 58 00 00 00 00  |...........X....|
.........
biao@ubuntu:~/test/ext4$ 

對(duì)Group descriptors 的數(shù)據(jù)進(jìn)行解析,可以看到詳細(xì)當(dāng)前group的詳細(xì)信息。
文件系統(tǒng)(六):一文看懂linux ext4文件系統(tǒng)工作原理

圖4.1 Group_descriptors參數(shù)解析

一個(gè)Group descriptors 占用一個(gè)block,它不僅僅記錄自己Group上的信息,還包括了其它group的Group descriptors

(五) Block bitmap塊位圖

Block bitmap 塊位圖用于管理塊組(Block Group)中的數(shù)據(jù)塊,Block Bitmap 記錄了塊組中每個(gè)塊的使用狀態(tài),標(biāo)識(shí)哪些塊是已使用的,哪些塊是空閑的,里面數(shù)據(jù)是按位標(biāo)記,為1表示該塊已經(jīng)被使用。

查看Block bitmap中的數(shù)據(jù)

biao@ubuntu:~/test/ext4$ hexdump -s 528384 -n 4096 -C ext4_image.img
00081000  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
*
00081210  ff ff ff 07 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00081220  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00082000
biao@ubuntu:~/test/ext4$ 

(六) Inode bitmap索引節(jié)點(diǎn)位圖

與Block bitmap工作原理類似,Inode bitmap 是用于管理塊組(Block Group)中的inode。Inode Bitmap記錄了塊組中每個(gè)inode的使用狀態(tài),標(biāo)識(shí)哪些inode是已使用的,哪些inode是空閑的。

biao@ubuntu:~/test/ext4$ hexdump -s 561152 -n 4096 -C ext4_image.img
00089000  ff ff 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00089010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00089400  ff ff ff ff ff ff ff ff  ff ff ff ff ff ff ff ff  |................|
*
0008a000
biao@ubuntu:~/test/ext4$ 

(七) Inode table索引節(jié)點(diǎn)表

(1)索引節(jié)點(diǎn)介紹

索引節(jié)點(diǎn)表是相對(duì)比較復(fù)雜的一個(gè)元文件,從上面《1.1 ext4文件系統(tǒng)信息表》我們可以知道:

Inode size:               256
Inode table at 145-656 (+145)
  • 一個(gè)索引節(jié)點(diǎn)的大小為256Byte
  • 從 Group 0信息中可以知道Group 0 的索引表位置在145-656 塊的位置

查看索引節(jié)點(diǎn)信息:

biao@ubuntu:~/test/ext4$ hexdump -s 593920 -n 4096 -C ext4_image.img
00091000  00 00 00 00 00 00 00 00  81 5b 50 66 81 5b 50 66  |.........[Pf.[Pf|
00091010  81 5b 50 66 00 00 00 00  00 00 00 00 00 00 00 00  |.[Pf............|
00091020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00091070  00 00 00 00 00 00 00 00  00 00 00 00 6f 16 00 00  |............o...|
00091080  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00091100  ed 41 00 00 00 10 00 00  78 15 61 66 e5 5d 50 66  |.A......x.af.]Pf|
00091110  e5 5d 50 66 00 00 00 00  00 00 07 00 08 00 00 00  |.]Pf............|
00091120  00 00 08 00 04 00 00 00  0a f3 01 00 04 00 00 00  |................|
00091130  00 00 00 00 00 00 00 00  01 00 00 00 91 10 00 00  |................|
00091140  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00091170  00 00 00 00 00 00 00 00  00 00 00 00 fa d3 00 00  |................|
00091180  20 00 98 7a 60 ea ef 8e  60 ea ef 8e 78 f5 3f a0  | ..z`...`...x.?.|
00091190  81 5b 50 66 00 00 00 00  00 00 00 00 00 00 00 00  |.[Pf............|
000911a0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00091270  00 00 00 00 00 00 00 00  00 00 00 00 8d 16 00 00  |................|
00091280  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*

對(duì)第2個(gè)索引節(jié)點(diǎn)的參數(shù)進(jìn)行解析:
文件系統(tǒng)(六):一文看懂linux ext4文件系統(tǒng)工作原理

圖7.1 Inode table參數(shù)解析

在ext4文件系統(tǒng)中,0~11號(hào)索引是特殊定義的索引節(jié)點(diǎn):
文件系統(tǒng)(六):一文看懂linux ext4文件系統(tǒng)工作原理

圖7.2 特殊索引節(jié)點(diǎn)

(2)inode.i_block介紹

在 ext4 文件系統(tǒng)中,inode 是一個(gè)數(shù)據(jù)結(jié)構(gòu),代表文件系統(tǒng)中的每個(gè)文件和目錄。每個(gè) inode 包含了有關(guān)文件的元數(shù)據(jù),例如文件大小、權(quán)限、所有者信息等。inode.i_block 是 inode 結(jié)構(gòu)中用于指向文件數(shù)據(jù)塊的字段,是文件系統(tǒng)如何找到并訪問(wèn)文件內(nèi)容的核心部分.

inode.i_block 是 ext4 文件系統(tǒng)中確保文件數(shù)據(jù)高效存儲(chǔ)和訪問(wèn)的關(guān)鍵組件,i_block里的數(shù)據(jù)類型,需要根據(jù)i_flags中的參數(shù)來(lái)確認(rèn),上面《圖7.1 Inode table參數(shù)解析》i_flags 的值是0x080000,同使用的是 Inode uses extents (EXT4_EXTENTS_FL)

文件系統(tǒng)(六):一文看懂linux ext4文件系統(tǒng)工作原理

iblock的長(zhǎng)度是60字節(jié),我們下面通過(guò)iblock里的參數(shù)找到該inode對(duì)應(yīng)文件所在的block。

(3)通過(guò)inode定位到文件block

文件系統(tǒng)中文件信息如下:

root@ubuntu:/home/biao/test/ext4/ext4_simulator# tree
.
├── lost+found
├── test1
│?? └── 0000.media
├── test2
│?? └── 0011.media
├── test3
│?? └── 0022.media
└── test4
    └── 0033.media

5 directories, 4 files
root@ubuntu:/home/biao/test/ext4/ext4_simulator# 

如果我們要找到0033.media文件所在block,我們先通過(guò)stat 查看0033.media 的inode節(jié)點(diǎn)

biao@ubuntu:~/test/ext4/ext4_simulator/test4$ stat 0033.media 
  File: 0033.media
  Size: 1662591         Blocks: 3248       IO Block: 4096   regular file
Device: 719h/1817d      Inode: 16          Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/    biao)   Gid: ( 1000/    biao)
Access: 2024-06-05 10:39:09.000000000 +0800
Modify: 2024-05-14 01:01:26.000000000 +0800
Change: 2024-06-05 10:39:09.423416410 +0800
 Birth: -
biao@ubuntu:~/test/ext4/ext4_simulator/test4$ 

定位到索引所在的位置:

145 * 4096 +(16-1)*256 = 593,920 + 3,840 = 597,760 = 0x91F00

索引節(jié)點(diǎn)數(shù)據(jù)

*
00091f00  a4 81 e8 03 7f 5e 19 00  cd cf 5f 66 cd cf 5f 66  |.....^...._f.._f|
00091f10  66 47 42 66 00 00 00 00  e8 03 01 00 b0 0c 00 00  |fGBf............|
00091f20  00 00 08 00 01 00 00 00  0a f3 01 00 04 00 00 00  |................|
00091f30  00 00 00 00 00 00 00 00  96 01 00 00 b5 84 00 00  |................|
00091f40  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*

i_block 的偏移量是0x28,對(duì)i_block的數(shù)據(jù)進(jìn)行解析:

文件系統(tǒng)(六):一文看懂linux ext4文件系統(tǒng)工作原理

圖7.4 0033.media i_block

將邏輯塊0開(kāi)始的0x196個(gè)block映射到物理0x84b5開(kāi)始的0x196個(gè)物理塊中
0x84b5 = 33973
33973 * 4096 = 139,153,408 = 0x84B 5000

查看文件系統(tǒng)的0x84b5 block數(shù)據(jù),與0033.media文件的數(shù)據(jù)是相同的

第 0x84b5 block

biao@ubuntu:~/test/ext4$ hexdump -s 139153408 -n 4096 -C ext4_image.img
084b5000  01 00 00 00 25 25 01 00  7a 34 9e 74 8f 01 00 00  |....%%..z4.t....|
084b5010  8c d1 0f f2 ff ff ff ff  00 00 00 01 40 01 0c 01  |............@...|
084b5020  ff ff 01 40 00 00 03 00  90 00 00 03 00 00 03 00  |...@............|
084b5030  96 bc 09 00 00 00 01 42  01 01 01 40 00 00 03 00  |.......B...@....|
084b5040  90 00 00 03 00 00 03 00  96 a0 01 20 20 05 11 67  |...........  ..g|
084b5050  be e4 4a 17 25 05 05 05  e1 00 00 03 00 01 00 00  |..J.%...........|
084b5060  03 00 14 2f 84 02 08 00  00 00 01 44 01 c0 73 c0  |.../.......D..s.|
084b5070  c6 d9 00 00 00 01 26 01  ac 39 80 1f cd 51 b5 b2  |......&..9...Q..|
084b5080  70 02 84 80 26 99 cd b5  f6 00 cf a3 06 b7 71 6b  |p...&.........qk|

0033.media

biao@ubuntu:~/test/ext4/ext4_simulator/test4$ hexdump -s 0 -n 4096 -C 0033.media 
00000000  01 00 00 00 25 25 01 00  7a 34 9e 74 8f 01 00 00  |....%%..z4.t....|
00000010  8c d1 0f f2 ff ff ff ff  00 00 00 01 40 01 0c 01  |............@...|
00000020  ff ff 01 40 00 00 03 00  90 00 00 03 00 00 03 00  |...@............|
00000030  96 bc 09 00 00 00 01 42  01 01 01 40 00 00 03 00  |.......B...@....|
00000040  90 00 00 03 00 00 03 00  96 a0 01 20 20 05 11 67  |...........  ..g|
00000050  be e4 4a 17 25 05 05 05  e1 00 00 03 00 01 00 00  |..J.%...........|
00000060  03 00 14 2f 84 02 08 00  00 00 01 44 01 c0 73 c0  |.../.......D..s.|
00000070  c6 d9 00 00 00 01 26 01  ac 39 80 1f cd 51 b5 b2  |......&..9...Q..|
00000080  70 02 84 80 26 99 cd b5  f6 00 cf a3 06 b7 71 6b  |p...&.........qk|

(八) Directory Entries目錄項(xiàng)

(1)根目錄

通過(guò)上面《圖7.2 特殊索引節(jié)點(diǎn)》我們知道根目錄的inode是2,查看根目錄的索引節(jié)點(diǎn)位置:

根目錄 inode 位置

145 * 4096 +(2-1)*256 = 593,920 + 256 = 594,176 = 0x91100

根目錄 inode 數(shù)據(jù)

*
00091100  ed 41 00 00 00 10 00 00  77 be 5f 66 e5 5d 50 66  |.A......w._f.]Pf|
00091110  e5 5d 50 66 00 00 00 00  00 00 07 00 08 00 00 00  |.]Pf............|
00091120  00 00 08 00 04 00 00 00  0a f3 01 00 04 00 00 00  |................|
00091130  00 00 00 00 00 00 00 00  01 00 00 00 91 10 00 00  |................|
00091140  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*

文件系統(tǒng)(六):一文看懂linux ext4文件系統(tǒng)工作原理

圖8.1 根目錄inode
通過(guò)inode 上i_block信息我們可以知道,根目錄inode是將邏輯塊0開(kāi)始的1個(gè)block映射到物理塊號(hào)0x1091開(kāi)始的1個(gè)block

0x1091 = 4,241
4,241 * 4096 = 17,371,136 = 0x109 1000

biao@ubuntu:~/test/ext4$ hexdump -s 17371136 -n 4096 -C ext4_image.img
01091000  02 00 00 00 0c 00 01 02  2e 00 00 00 02 00 00 00  |................|
01091010  0c 00 02 02 2e 2e 00 00  0b 00 00 00 14 00 0a 02  |................|
01091020  6c 6f 73 74 2b 66 6f 75  6e 64 00 00 0c 00 00 00  |lost+found......|
01091030  10 00 05 02 74 65 73 74  31 00 00 00 01 20 00 00  |....test1.... ..|
01091040  10 00 05 02 74 65 73 74  32 00 00 00 02 20 00 00  |....test2.... ..|
01091050  10 00 05 02 74 65 73 74  33 00 00 00 03 20 00 00  |....test3.... ..|
01091060  98 0f 05 02 74 65 73 74  34 00 00 00 00 00 00 00  |....test4.......|
01091070  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
01091ff0  00 00 00 00 00 00 00 00  0c 00 00 de 67 85 5b 11  |............g.[.|
01092000
biao@ubuntu:~/test/ext4$ 

可以看到根目錄上的所有信息,下面是對(duì)根目錄的目錄項(xiàng)進(jìn)行解析

文件系統(tǒng)(六):一文看懂linux ext4文件系統(tǒng)工作原理

圖8.2 根目錄項(xiàng)解析

同樣的方法,可以定位到各子目錄上的信息。

(九) ext4 實(shí)現(xiàn)原理

1. 文件系統(tǒng)初始化和掛載

  • 掛載文件系統(tǒng)時(shí),內(nèi)核讀取超級(jí)塊以獲取文件系統(tǒng)的基本信息。
  • 內(nèi)核讀取塊組描述符,以了解每個(gè)塊組中元數(shù)據(jù)的布局。

2. 創(chuàng)建文件

  • 查找空閑 inode:通過(guò)檢查 inode 位圖找到一個(gè)空閑的 inode,并在 inode 位圖中標(biāo)記為已使用。
  • 分配數(shù)據(jù)塊:通過(guò)檢查塊位圖找到空閑的數(shù)據(jù)塊,并在塊位圖中標(biāo)記為已使用。
  • 更新 inode:將新文件的元數(shù)據(jù)寫(xiě)入 inode 表中的相應(yīng)位置。
  • 更新目錄項(xiàng):在目標(biāo)目錄的 inode 數(shù)據(jù)塊中添加一個(gè)新的目錄項(xiàng),包含文件名和對(duì)應(yīng)的 inode 號(hào)。

3. 讀取文件

  • 查找 inode:根據(jù)文件名在目錄項(xiàng)中查找對(duì)應(yīng)的 inode 號(hào),然后讀取 inode 表中的相應(yīng) inode。
  • 讀取數(shù)據(jù)塊:根據(jù) inode 中的塊指針,讀取文件數(shù)據(jù)塊。

4. 刪除文件

  • 釋放數(shù)據(jù)塊:根據(jù) inode 中的塊指針,更新塊位圖以標(biāo)記這些塊為空閑。
  • 釋放 inode:在 inode 位圖中將該 inode 標(biāo)記為空閑。
  • 更新目錄項(xiàng):從目錄的 inode 數(shù)據(jù)塊中刪除相應(yīng)的目錄項(xiàng)。

5. 文件系統(tǒng)檢查和修復(fù)

  • fsck 工具利用超級(jí)塊、塊組描述符、塊位圖和 inode 位圖來(lái)檢查文件系統(tǒng)的一致性。
  • 修復(fù)損壞的結(jié)構(gòu),例如修復(fù)丟失的塊或 inode 標(biāo)記。

(十) 優(yōu)缺點(diǎn)

優(yōu)點(diǎn)

  1. 性能改進(jìn)
    • 延遲分配 :數(shù)據(jù)塊分配延遲到實(shí)際寫(xiě)入時(shí)進(jìn)行,從而優(yōu)化文件碎片化和提高寫(xiě)入性能。
    • 多塊分配 :同時(shí)分配多個(gè)塊,提高大文件寫(xiě)入速度,減少碎片。
    • 快速 fsck :改進(jìn)的文件系統(tǒng)檢查工具 fsck 能夠更快地進(jìn)行一致性檢查,減少系統(tǒng)恢復(fù)時(shí)間。
  2. 大文件和大文件系統(tǒng)支持
    • 支持單個(gè)文件最大 16 TB 和文件系統(tǒng)最大 1 EB 的存儲(chǔ)容量,適合現(xiàn)代大規(guī)模存儲(chǔ)需求。
  3. 向后兼容
    • Ext4 文件系統(tǒng)可以向后兼容 Ext3 和 Ext2,允許用戶在無(wú)需格式化的情況下從這些文件系統(tǒng)無(wú)縫遷移到 Ext4。
  4. 日志功能
    • 支持元數(shù)據(jù)日志和數(shù)據(jù)日志,有助于提高文件系統(tǒng)的可靠性和防止數(shù)據(jù)損壞。
  5. 在線碎片整理
    • 支持在線碎片整理工具,可以在系統(tǒng)運(yùn)行時(shí)整理文件碎片,提高文件訪問(wèn)速度。
  6. Extent
    • 使用 extent 來(lái)代替?zhèn)鹘y(tǒng)的塊映射方式,提高了大文件的存儲(chǔ)效率,減少了文件碎片。
  7. 防止文件系統(tǒng)崩潰
    • 使用日志和其他安全機(jī)制,確保文件系統(tǒng)崩潰后能快速恢復(fù)。

缺點(diǎn)

  1. 碎片整理效率
    • 盡管支持在線碎片整理,但與一些現(xiàn)代文件系統(tǒng)(如 Btrfs、ZFS)相比,Ext4 的碎片整理效率仍然較低。
  2. 新特性限制
    • 雖然 Ext4 引入了許多改進(jìn),但由于其設(shè)計(jì)上依賴于傳統(tǒng)的 Ext 系列架構(gòu),它在引入某些現(xiàn)代文件系統(tǒng)的新特性(如快照、數(shù)據(jù)去重、內(nèi)置 RAID 等)時(shí)受到限制。
  3. 文件系統(tǒng)擴(kuò)展
    • 盡管 Ext4 支持非常大的文件和文件系統(tǒng),但在線擴(kuò)展文件系統(tǒng)的操作復(fù)雜度較高,尤其是在需要縮小文件系統(tǒng)時(shí)。
  4. 元數(shù)據(jù)緩存
    • Ext4 在緩存機(jī)制上的設(shè)計(jì)導(dǎo)致在高負(fù)載環(huán)境下,元數(shù)據(jù)操作(如創(chuàng)建或刪除大量小文件)的性能可能受到影響。

結(jié)尾

上面只是簡(jiǎn)單的介紹了ext4文件系統(tǒng)的基礎(chǔ)內(nèi)容,一些更加詳細(xì)的內(nèi)容,比如日志、碎片整理、軟連接與硬連接等等都還沒(méi)有介紹,受篇幅限制,這些以后再介紹吧。

---------------------------End---------------------------
如需獲取更多內(nèi)容
請(qǐng)關(guān)注 liwen01 公眾號(hào)
小編推薦閱讀

好特網(wǎng)發(fā)布此文僅為傳遞信息,不代表好特網(wǎng)認(rèn)同期限觀點(diǎn)或證實(shí)其描述。

相關(guān)視頻攻略

更多

掃二維碼進(jìn)入好特網(wǎng)手機(jī)版本!

掃二維碼進(jìn)入好特網(wǎng)微信公眾號(hào)!

本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權(quán),請(qǐng)發(fā)郵件[email protected]

湘ICP備2022002427號(hào)-10 湘公網(wǎng)安備:43070202000427號(hào)© 2013~2025 haote.com 好特網(wǎng)