在Linux操作系统的文件系统中,超级块相当于文件系统的地图。在超级块中保存着文件系统的属性信息、磁盘布局和资源使用情况等信息。文件系统通过超级块了解磁盘的布局,查找已用和可用资源等。超级块又相当于入口,文件系统的操作通常从超级块开始。
对于Ext4文件系统,我们之前文章已经做了大概的介绍。超级块有一个固定的位置,因此文件系统在启动(挂载)的时候可以从磁盘读取该超级块数据,并完成整个文件系统的初始化工作。
格式化Ext4文件系统
通过执行如下命令格式化一个文件系统:
mkfs.ext4 -O ^flex_bg /dev/sdc
其中^flex_bg表示不使用Flexible Block Groups特性。此时每一个块组描述符只管理一个块组。如果使用该特性,则一个块组描述符可以管理多个块组,默认是16个。为了简单起见,本文暂时以不具备该特性进行描述。
完成格式化后,可以通过dumpe2fs命令获取文件系统的摘要信息。
root@vmhost:~/ext4# dumpe2fs /dev/sdc
dumpe2fs 1.42.13 (17-May-2015)
Filesystem volume name: <none>
Last mounted on: <not available>
Filesystem UUID: bffcb29b-4d49-426f-b8ed-f90b12628905
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype extent sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags: signed_directory_hash
Default mount options: user_xattr acl
Filesystem state: clean
Errors behavior: Continue
Filesystem OS type: Linux
Inode count: 655360 <----文件系统总的inode数量
Block count: 2621440 <----文件系统管理的总逻辑块数量
Reserved block count: 131072
Free blocks: 2541777 <----文件系统剩余的可用逻辑块数量
Free inodes: 655349 <----文件系统剩余的可用inode数量
First block: 0
Block size: 4096 <----文件系统管理的逻辑块的大小
Fragment size: 4096
Reserved GDT blocks: 639
Blocks per group: 32768 <----每一个块组管理的逻辑块的数量
Fragments per group: 32768
Inodes per group: 8192 <----每一个块组所具备的inode数量
Inode blocks per group: 512
Filesystem created: Sun Oct 28 11:01:18 2018
Last mount time: n/a
Last write time: Sun Oct 28 11:01:18 2018
Mount count: 0
Maximum mount count: -1
Last checked: Sun Oct 28 11:01:18 2018
Check interval: 0 (<none>)
Lifetime writes: 131 MB
Reserved blocks uid: 0 (user root)
Reserved blocks gid: 0 (group root)
First inode: 11
Inode size: 256 <----文件系统单个inode所占用的空间,单位是字节
Required extra isize: 28
Desired extra isize: 28
Journal inode: 8
Default directory hash: half_md4
Directory Hash Seed: 501a299f-192f-43bb-a460-5c8f4e7acb33
Journal backup: inode blocks
Journal features: (none)
Journal size: 128M
Journal length: 32768
Journal sequence: 0x00000001
Journal start: 0
下面是其中第一个块组的信息
Group 0: (Blocks 0-32767)
Checksum 0xffa8, unused inodes 8181
Primary superblock at 0, Group descriptors at 1-1
Reserved GDT blocks at 2-640
Block bitmap at 641 (+641), Inode bitmap at 642 (+642)
Inode table at 643-1154 (+643)
31607 free blocks, 8181 free inodes, 2 directories, 8181 unused inodes
Free blocks: 1161-32767
Free inodes: 12-8192
上述内容是从磁盘读取后解析的,其来源就是文件系统的超级块。
磁盘数据分析
我们更具体的分析一下这些数据存储在磁盘的什么地方。前文已述超级块存储在磁盘1K偏移的位置,因此我们可以通过dd命令将该超级块的内容转存在一个文件中。
dd if=/dev/sdc of=./super_block.txt bs=1024 skip=1 count=4
然后通过vim工具将该文件打开,并以二进制的方式看到其内容。
vim -b super_block.txt
为了方便理解,我们将超级块的内容与其数据结构进行对比,其中上面是磁盘数据的二进制显示,而下面是数据结构,具体如图所示。
在上图中,本文简单的罗列了几个超级块的成员的信息,本文简单介绍一下。
inode数量为红色方框的内容,由数据结构可以知道其为32位,小端对齐,因此其值0000 0a00应该为a 0000,转换为10进制则为655360,也就是该磁盘最多可以有655260个inode节点。
逻辑块数量为蓝色方框的内容,按照inode的计算方式,其10进制值为2621440,也即该文件系统总共管理2621440个逻辑块。
每个块组管理的逻辑块数量为绿色方框中的内容,其10进制值为32768,也即每个块组管理32768个逻辑块。
可以对比一下,我们从磁盘获取的信息与通过dumpe2fs命令获取的一致。其它更多的内容可以按照此方式自行分析,本文不再赘述。后续本文将继续介绍块组、inode等在磁盘的存储情况。
转自 IT驿站
关注作者微信公众号,更及时的获取原创IT技术文章。
![公众号二维码](http://upload-images.jianshu.io/upload_images/11058170-b2a7bfdc2a9e9487.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)