文章目录
系列博文
Linux文件系统:minix文件系统二进制分析3(硬链接与软链接)
前言
在上一篇文章里,我们对一个刚刚格式化后的minix硬盘的各个属性模块进行了二进制分析,但遗憾的是刚刚格式化的硬盘里并没有任何文件,所以对文件在硬盘里的存储不免还是有些抽象,因此补充本篇文章,让我们深刻理解文件和目录是如何在存储介质中存储的
创建目录和文件
首先在格式化完成的minix系统盘里创建目录和文件,并在在文件里插入一两句简单的文本,创建完成后如下图所示:根目录下创建一个名为dirdemo的目录和名为file.txt的文本文件,在file.txt文本文件里添加文本“hello minix”,然后再dirdemo目录下创建filelevel2.txt文件,在文件中添加文本“level 2”。
hexdump硬盘为16进制文本
hexdump -C /dev/sdb > chapter2.hex
dump出的二进制文件内容如下图所示,如果你仔细观察一下以下内容,你会发现我们刚刚创建的目录名和文件名,还有文件里的文本内容,都在这些数据中出现了。
是的,在计算机领域里,一切皆为二进制,文件系统亦是如此,硬盘属于硬件,作为存储介质,它只能存储0或1,我们之所以是以文件的形式看到,是因为最终解释权在文件系统那里。
正如下图所示的一堆二进制数据,是以我们人类肉眼的理解看到的,如果使用软件按照minix的格式去解析如下这一坨二进制数据,然后反馈给人类以视觉,就成了文件和目录的形式了,这就是文件系统干的事情。
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000400 60 15 00 40 01 00 02 00 b0 00 00 00 00 1c 08 10 |`..@............|
00000410 8f 13 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000420 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000800 1f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000810 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000aa0 00 00 00 00 00 00 00 00 00 00 00 00 fe ff ff ff |................|
00000ab0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
*
00000c00 1f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000c10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
000013e0 00 00 00 00 00 00 00 00 00 00 fe ff ff ff ff ff |................|
000013f0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
00001400 ed 41 00 00 80 00 00 00 77 1c a1 61 00 03 b0 00 |.A......w..a....|
00001410 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00001420 ed 41 00 00 60 00 00 00 9d 1c a1 61 00 02 b1 00 |.A..`......a....|
00001430 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00001440 a4 81 00 00 0c 00 00 00 77 1c a1 61 00 01 b2 00 |........w..a....|
00001450 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00001460 a4 81 00 00 08 00 00 00 9d 1c a1 61 00 01 b3 00 |...........a....|
00001470 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
0002c000 01 00 2e 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
0002c010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
0002c020 01 00 2e 2e 00 00 00 00 00 00 00 00 00 00 00 00 |................|
0002c030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
0002c040 02 00 64 69 72 64 65 6d 6f 00 00 00 00 00 00 00 |..dirdemo.......|
0002c050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
0002c060 03 00 66 69 6c 65 2e 74 78 74 00 00 00 00 00 00 |..file.txt......|
0002c070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
0002c400 02 00 2e 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
0002c410 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
0002c420 01 00 2e 2e 00 00 00 00 00 00 00 00 00 00 00 00 |................|
0002c430 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
0002c440 04 00 66 69 6c 65 6c 65 76 65 6c 32 2e 74 78 74 |..filelevel2.txt|
0002c450 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
0002c800 68 65 6c 6c 6f 20 6d 69 6e 69 78 0a 00 00 00 00 |hello minix.....|
0002c810 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
0002cc00 6c 65 76 65 6c 20 32 0a 00 00 00 00 00 00 00 00 |level 2.........|
0002cc10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
01000000
二进制分析
在进行二进制分析时,我们采用对比法,将刚刚格式化后的硬盘二进制文件和本章节一开始创建了一些目录和文件的二进制文件进行对比。
超级块
上一章节讲过,超级块是文件系统的控制块,有整个文件系统信息,在格式化后信息基本不会再发生变化,只有一个属性可以被修改
s_state属性
该属性位于超级块,作为挂载的状态标志存在,当用户mount硬盘成功后,该状态位会被置1,然后写入到硬盘的超级块对应的位置,这样当硬盘挂载成功后,在未umount前,请不能重复挂载了,如果用户再次挂载就会下图的反馈。
当操作系统执行mount命令时,读取/dev/sdb的超级块,发现s_state值为1,所以认为该设备已被挂载,最终反馈给用户该信息。
inode bitmap
对比两次hexdump出的二进制文件的inode bitmap部分,如下图所示,右边为本章节创建目录和文件后dump出的二进制文件,可以看到inode bitmap的第一个字节由03变成了1f,比之前多了3个bit置位。
这是因为我们在本章节创建的目录和文件加起来一共有三个:dirdemo、file.txt、filelevel2.txt。在我们输入一条目录创建或文件创建的命令后,操作系统会先去检查硬盘 inode bitmap是否还有可用空间(即是否还有bit位为0的空间),如果有,就将inode bitmap中的一个bit位为0的位置1,然后创建用户指定的文件或目录。
data block bitmap
data block bitmap前后两次的对比如下图所示,和inode bitmap原理一样,这里就不再做解释。
inode表
对比inode表如下,右边多了6行二进制数据,每两行代表一个文件或目录的inode信息,因为我们创建的文件和目录一共3个,所以两侧的对比很好理解,第一个inode数据为根目录。
根目录inode节点
如下图所示,根目录节点指向的数据区包含了:.、…、dirdemo、file.txt。
这是什么意思呢?我们在根目录下执行ls -la就知道了。
当我们执行ls -la命令后,linux内核查找了上图中根目录的inode节点指向的数据区,将根目录下所有的文件显示了出来。
第二个inode节点
内容如下
00001420 ed 41 00 00 60 00 00 00 9d 1c a1 61 00 02 b1 00 |.A..`......a....|
00001430 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
解析如下
i_mode | 0x41ed | 八进制040755 | 目录文件 rwxr-xr-x |
i_uid | 0x0000 | 0x0000 | 用户root |
i_size | 0x00000060 | 文件大小 | 文件大小为96字节 |
i_time | 0x61a11c9d | 时间 | |
i_gid | 0x00 | 所在用户组 | root |
i_nlinks | 0x02 | 引用计数 | |
i_zone | 0x00b1 | 177 | 数据在第176个data block上(1024x177= 0x2c400) |
然后我们根据i_zone的值找到0x2c400地址的数据,这是该inode节点的数据区,如下图所示,根据右边的字符串我们可以知道,第二个inode节点指向的数据区包含了filelevel2.txt这个字符串。
让我们反向类推一下,filelevel2.txt这个文件在目录dirdemo下,那么第2个inode节点应该指向的时dirdemo这个目录。
0002c400 02 00 2e 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
0002c410 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
0002c420 01 00 2e 2e 00 00 00 00 00 00 00 00 00 00 00 00 |................|
0002c430 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
0002c440 04 00 66 69 6c 65 6c 65 76 65 6c 32 2e 74 78 74 |..filelevel2.txt|
0002c450 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
其实在根目录节点的数据区,就可以看出dirdemo目录指向的是第2个inode节点
依次类推file.txt文件
请根据我前面的思想,区推理file.txt文件,这里不再讲述