经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Linux/Shell » 查看文章
文件系统(六):一文看懂linux ext4文件系统工作原理
来源:cnblogs  作者:liwen01  时间:2024/6/11 9:50:14  对本文有异议

liwen01 2024.06.09

前言

Linux系统中的ext2、ext3、ext4 文件系统,它们都有很强的向后和向前兼容性,可以在数据不丢失的情况下进行文件系统的升级。目前ext4是一个相对较成熟、稳定且高效的文件系统,适用于绝大部分规模和需求的Linux环境。

ext4它突出的特点有:数据分段管理、多块分配、延迟分配、持久预分配、日志校验、支持更大的文件系统和文件大小。

ext4文件系统的具体实现比较复杂,本文尝试用比较简单的方式用一篇文章的篇幅来简单地介绍一下它的工作原理。

(一)创建ext文件系统

为了分析ext4 文件系统的内部结构和原理,这里我们在Linux中创建一个ext4文件系统镜像,然后通过loop虚拟设备将ext4镜像文件挂载到某个目录上。具体实现步骤如下:

  1. 创建一个1GB的文件
  1. dd if=/dev/zero of=./ext4_image.img bs=1M count=1024
  1. 将这个文件格式化成 ext4 文件系统格式
  1. mkfs.ext4 ext4_image.img
  1. 通过Linux的loop虚拟设备将文件挂载到目录上
  1. sudo mount -o loop ext4_image.img /home/biao/test/ext4/ext4_simulator
  1. dumpe2fs 查看文件系统基本信息
  1. dumpe2fs ext4_image.img

输出内容信息(中间省略了部分内容):

  1. dumpe2fs 1.44.1 (24-Mar-2018)
  2. Filesystem volume name: <none>
  3. Last mounted on: /home/biao/test/ext4/ext4_simulator
  4. Filesystem UUID: 0169498e-f5f7-4fb8-9e9e-532088e41333
  5. Filesystem magic number: 0xEF53
  6. Filesystem revision #: 1 (dynamic)
  7. 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
  8. Filesystem flags: signed_directory_hash
  9. Default mount options: user_xattr acl
  10. Filesystem state: clean
  11. Errors behavior: Continue
  12. Filesystem OS type: Linux
  13. Inode count: 65536
  14. Block count: 262144
  15. Reserved block count: 13107
  16. Free blocks: 247703
  17. Free inodes: 65517
  18. First block: 0
  19. Block size: 4096
  20. Fragment size: 4096
  21. Group descriptor size: 64
  22. Reserved GDT blocks: 127
  23. Blocks per group: 32768
  24. Fragments per group: 32768
  25. Inodes per group: 8192
  26. Inode blocks per group: 512
  27. Flex block group size: 16
  28. Filesystem created: Fri May 24 17:18:57 2024
  29. Last mount time: Wed Jun 5 19:15:36 2024
  30. Last write time: Wed Jun 5 19:15:36 2024
  31. Mount count: 3
  32. Maximum mount count: -1
  33. Last checked: Fri May 24 17:18:57 2024
  34. Check interval: 0 (<none>)
  35. Lifetime writes: 6997 kB
  36. Reserved blocks uid: 0 (user root)
  37. Reserved blocks gid: 0 (group root)
  38. First inode: 11
  39. Inode size: 256
  40. Required extra isize: 32
  41. Desired extra isize: 32
  42. Journal inode: 8
  43. Default directory hash: half_md4
  44. Directory Hash Seed: 0faf0e8c-f385-4ecd-b3a4-db2a3329e121
  45. Journal backup: inode blocks
  46. Checksum type: crc32c
  47. Checksum: 0x32dc1b70
  48. Journal features: journal_64bit journal_checksum_v3
  49. Journal size: 32M
  50. Journal length: 8192
  51. Journal sequence: 0x00000017
  52. Journal start: 1
  53. Journal checksum type: crc32c
  54. Journal checksum: 0xa3c1b983
  55. Group 0: (Blocks 0-32767) csum 0xf19b [ITABLE_ZEROED]
  56. Primary superblock at 0, Group descriptors at 1-1
  57. Reserved GDT blocks at 2-128
  58. Block bitmap at 129 (+129), csum 0x8efc34cf
  59. Inode bitmap at 137 (+137), csum 0x49f91ed6
  60. Inode table at 145-656 (+145)
  61. 28517 free blocks, 8176 free inodes, 3 directories, 8176 unused inodes
  62. Free blocks: 4251-32767
  63. Free inodes: 17-8192
  64. ..........
  65. ..........
  66. ..........
  67. Group 7: (Blocks 229376-262143) csum 0x7daa [INODE_UNINIT, ITABLE_ZEROED]
  68. Backup superblock at 229376, Group descriptors at 229377-229377
  69. Reserved GDT blocks at 229378-229504
  70. Block bitmap at 136 (bg #0 + 136), csum 0x5bd8cca0
  71. Inode bitmap at 144 (bg #0 + 144), csum 0x00000000
  72. Inode table at 3729-4240 (bg #0 + 3729)
  73. 32639 free blocks, 8192 free inodes, 0 directories, 8192 unused inodes
  74. Free blocks: 229505-262143
  75. Free inodes: 57345-65536
1.1 ext4文件系统信息表

(二)ext4 磁盘布局

从上面dumpe2fs的数据上我们可以看出,一个1GB大小的空间,ext4 文件系统将它分隔成了0~7的8个Group。

ext4 的总体磁盘布局如下:

图2.1 ext4总体布局
其中,每个Group中又有superblock、Group descriptors、bitmap、Inode table、usrer data、还有一些保留空间,细分之后的空间布局如下:

图2.2 ext4 group 布局

从上图可以看出:

  1. Backup superblock、Group descriptors、Reserved GDT 是分布在1、3、5、7 这几个Group中,2、4、6Group并没有这些信息。
  2. Block bitmap、Inode bitmap、Inode table 这些元文件在每个Group中的位置并不一样,而是相差1个Block。

为什么需要这样设计?这个下面稍晚点再介绍

(三) superblock超级块

从上面《1.1 ext4文件系统信息表》中可以知道Primary superblock在第0号block,每个block的大小为4096Byte。

用hexdump 命令查看超级块的数据

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

对超级块的部分数据进行解析:

表3.1 superblock参数解析

从上表可以看出superblock的主要内容有:
文件系统信息、块大小和块组信息、Inode 相关信息、文件系统大小和使用情况、日志相关信息、挂载信息、校验和和备份信息

其实使用dumpe2fs命令查看的ext4文件系统信息就是从superblock上的数据解析而来。

除了Primary superblock,还在不同的group中有备份superblock,其内容与Primary superblock原始数据相同,Primary superblock损坏的时候可以从备份区恢复回来。

(四) Group descriptors组描述

在 ext4 文件系统中,Group Descriptor(块组描述符)是一个关键的结构,用于描述和管理文件系统的块组(Block Group)。每个块组包含文件系统中的一部分数据块和 inode,并且有自己的元数据来管理这些资源。Group Descriptor 在超级块之后紧随其后,是文件系统的组织和管理的核心部分

从上面《1.1 ext4文件系统信息表》中可以知道group0 的 Group descriptors 在第1个数据块中,其大小为1个block

group 0 中 Group descriptors 的数据如下:

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

对Group descriptors 的数据进行解析,可以看到详细当前group的详细信息。

图4.1 Group_descriptors参数解析

一个Group descriptors 占用一个block,它不仅仅记录自己Group上的信息,还包括了其它group的Group descriptors

(五) Block bitmap块位图

Block bitmap 块位图用于管理块组(Block Group)中的数据块,Block Bitmap 记录了块组中每个块的使用状态,标识哪些块是已使用的,哪些块是空闲的,里面数据是按位标记,为1表示该块已经被使用。

查看Block bitmap中的数据

  1. biao@ubuntu:~/test/ext4$ hexdump -s 528384 -n 4096 -C ext4_image.img
  2. 00081000 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
  3. *
  4. 00081210 ff ff ff 07 00 00 00 00 00 00 00 00 00 00 00 00 |................|
  5. 00081220 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
  6. *
  7. 00082000
  8. biao@ubuntu:~/test/ext4$

(六) Inode bitmap索引节点位图

与Block bitmap工作原理类似,Inode bitmap 是用于管理块组(Block Group)中的inode。Inode Bitmap记录了块组中每个inode的使用状态,标识哪些inode是已使用的,哪些inode是空闲的。

  1. biao@ubuntu:~/test/ext4$ hexdump -s 561152 -n 4096 -C ext4_image.img
  2. 00089000 ff ff 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
  3. 00089010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
  4. *
  5. 00089400 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
  6. *
  7. 0008a000
  8. biao@ubuntu:~/test/ext4$

(七) Inode table索引节点表

(1)索引节点介绍

索引节点表是相对比较复杂的一个元文件,从上面《1.1 ext4文件系统信息表》我们可以知道:

  1. Inode size: 256
  2. Inode table at 145-656 (+145)
  • 一个索引节点的大小为256Byte
  • 从 Group 0信息中可以知道Group 0 的索引表位置在145-656 块的位置

查看索引节点信息:

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

对第2个索引节点的参数进行解析:

图7.1 Inode table参数解析

在ext4文件系统中,0~11号索引是特殊定义的索引节点:

图7.2 特殊索引节点

(2)inode.i_block介绍

在 ext4 文件系统中,inode 是一个数据结构,代表文件系统中的每个文件和目录。每个 inode 包含了有关文件的元数据,例如文件大小、权限、所有者信息等。inode.i_block 是 inode 结构中用于指向文件数据块的字段,是文件系统如何找到并访问文件内容的核心部分.

inode.i_block 是 ext4 文件系统中确保文件数据高效存储和访问的关键组件,i_block里的数据类型,需要根据i_flags中的参数来确认,上面《图7.1 Inode table参数解析》i_flags 的值是0x080000,同使用的是 Inode uses extents (EXT4_EXTENTS_FL)

iblock的长度是60字节,我们下面通过iblock里的参数找到该inode对应文件所在的block。

(3)通过inode定位到文件block

文件系统中文件信息如下:

  1. root@ubuntu:/home/biao/test/ext4/ext4_simulator# tree
  2. .
  3. ├── lost+found
  4. ├── test1
  5.    └── 0000.media
  6. ├── test2
  7.    └── 0011.media
  8. ├── test3
  9.    └── 0022.media
  10. └── test4
  11. └── 0033.media
  12. 5 directories, 4 files
  13. root@ubuntu:/home/biao/test/ext4/ext4_simulator#

如果我们要找到0033.media文件所在block,我们先通过stat 查看0033.media 的inode节点

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

定位到索引所在的位置:

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

索引节点数据

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

i_block 的偏移量是0x28,对i_block的数据进行解析:

图7.4 0033.media i_block

将逻辑块0开始的0x196个block映射到物理0x84b5开始的0x196个物理块中
0x84b5 = 33973
33973 * 4096 = 139,153,408 = 0x84B 5000

查看文件系统的0x84b5 block数据,与0033.media文件的数据是相同的

第 0x84b5 block

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

0033.media

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

(八) Directory Entries目录项

(1)根目录

通过上面《图7.2 特殊索引节点》我们知道根目录的inode是2,查看根目录的索引节点位置:

根目录 inode 位置

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

根目录 inode 数据

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

图8.1 根目录inode
通过inode 上i_block信息我们可以知道,根目录inode是将逻辑块0开始的1个block映射到物理块号0x1091开始的1个block

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

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

可以看到根目录上的所有信息,下面是对根目录的目录项进行解析

图8.2 根目录项解析

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

(九) ext4 实现原理

1. 文件系统初始化和挂载

  • 挂载文件系统时,内核读取超级块以获取文件系统的基本信息。
  • 内核读取块组描述符,以了解每个块组中元数据的布局。

2. 创建文件

  • 查找空闲 inode:通过检查 inode 位图找到一个空闲的 inode,并在 inode 位图中标记为已使用。
  • 分配数据块:通过检查块位图找到空闲的数据块,并在块位图中标记为已使用。
  • 更新 inode:将新文件的元数据写入 inode 表中的相应位置。
  • 更新目录项:在目标目录的 inode 数据块中添加一个新的目录项,包含文件名和对应的 inode 号。

3. 读取文件

  • 查找 inode:根据文件名在目录项中查找对应的 inode 号,然后读取 inode 表中的相应 inode。
  • 读取数据块:根据 inode 中的块指针,读取文件数据块。

4. 删除文件

  • 释放数据块:根据 inode 中的块指针,更新块位图以标记这些块为空闲。
  • 释放 inode:在 inode 位图中将该 inode 标记为空闲。
  • 更新目录项:从目录的 inode 数据块中删除相应的目录项。

5. 文件系统检查和修复

  • fsck 工具利用超级块、块组描述符、块位图和 inode 位图来检查文件系统的一致性。
  • 修复损坏的结构,例如修复丢失的块或 inode 标记。

(十) 优缺点

优点

  1. 性能改进
    • 延迟分配:数据块分配延迟到实际写入时进行,从而优化文件碎片化和提高写入性能。
    • 多块分配:同时分配多个块,提高大文件写入速度,减少碎片。
    • 快速 fsck:改进的文件系统检查工具 fsck 能够更快地进行一致性检查,减少系统恢复时间。
  2. 大文件和大文件系统支持
    • 支持单个文件最大 16 TB 和文件系统最大 1 EB 的存储容量,适合现代大规模存储需求。
  3. 向后兼容
    • Ext4 文件系统可以向后兼容 Ext3 和 Ext2,允许用户在无需格式化的情况下从这些文件系统无缝迁移到 Ext4。
  4. 日志功能
    • 支持元数据日志和数据日志,有助于提高文件系统的可靠性和防止数据损坏。
  5. 在线碎片整理
    • 支持在线碎片整理工具,可以在系统运行时整理文件碎片,提高文件访问速度。
  6. Extent
    • 使用 extent 来代替传统的块映射方式,提高了大文件的存储效率,减少了文件碎片。
  7. 防止文件系统崩溃
    • 使用日志和其他安全机制,确保文件系统崩溃后能快速恢复。

缺点

  1. 碎片整理效率
    • 尽管支持在线碎片整理,但与一些现代文件系统(如 Btrfs、ZFS)相比,Ext4 的碎片整理效率仍然较低。
  2. 新特性限制
    • 虽然 Ext4 引入了许多改进,但由于其设计上依赖于传统的 Ext 系列架构,它在引入某些现代文件系统的新特性(如快照、数据去重、内置 RAID 等)时受到限制。
  3. 文件系统扩展
    • 尽管 Ext4 支持非常大的文件和文件系统,但在线扩展文件系统的操作复杂度较高,尤其是在需要缩小文件系统时。
  4. 元数据缓存
    • Ext4 在缓存机制上的设计导致在高负载环境下,元数据操作(如创建或删除大量小文件)的性能可能受到影响。

结尾

上面只是简单的介绍了ext4文件系统的基础内容,一些更加详细的内容,比如日志、碎片整理、软连接与硬连接等等都还没有介绍,受篇幅限制,这些以后再介绍吧。

---------------------------End---------------------------
如需获取更多内容
请关注 liwen01 公众号

原文链接:https://www.cnblogs.com/liwen01/p/18237062

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号