Linux文件系统:minix文件系统二进制分析2

系列博文

Linux文件系统:minix文件系统二进制分析1

Linux文件系统:minix文件系统二进制分析3(硬链接与软链接)

前言

  在上一篇文章里,我们对一个刚刚格式化后的minix硬盘的各个属性模块进行了二进制分析,但遗憾的是刚刚格式化的硬盘里并没有任何文件,所以对文件在硬盘里的存储不免还是有些抽象,因此补充本篇文章,让我们深刻理解文件和目录是如何在存储介质中存储的

创建目录和文件

  首先在格式化完成的minix系统盘里创建目录和文件,并在在文件里插入一两句简单的文本,创建完成后如下图所示:根目录下创建一个名为dirdemo的目录和名为file.txt的文本文件,在file.txt文本文件里添加文本“hello minix”,然后再dirdemo目录下创建filelevel2.txt文件,在文件中添加文本“level 2”。

image-20211205095040623

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前,请不能重复挂载了,如果用户再次挂载就会下图的反馈。

image-20211205102825243

  当操作系统执行mount命令时,读取/dev/sdb的超级块,发现s_state值为1,所以认为该设备已被挂载,最终反馈给用户该信息。

inode bitmap

  对比两次hexdump出的二进制文件的inode bitmap部分,如下图所示,右边为本章节创建目录和文件后dump出的二进制文件,可以看到inode bitmap的第一个字节由03变成了1f,比之前多了3个bit置位。

  这是因为我们在本章节创建的目录和文件加起来一共有三个:dirdemofile.txtfilelevel2.txt。在我们输入一条目录创建或文件创建的命令后,操作系统会先去检查硬盘 inode bitmap是否还有可用空间(即是否还有bit位为0的空间),如果有,就将inode bitmap中的一个bit位为0的位置1,然后创建用户指定的文件或目录。

image-20211205103359493

data block bitmap

  data block bitmap前后两次的对比如下图所示,和inode bitmap原理一样,这里就不再做解释。

image-20211205104215431

inode表

  对比inode表如下,右边多了6行二进制数据,每两行代表一个文件或目录的inode信息,因为我们创建的文件和目录一共3个,所以两侧的对比很好理解,第一个inode数据为根目录。

image-20211205105814521

根目录inode节点

  如下图所示,根目录节点指向的数据区包含了:.、…、dirdemo、file.txt。

image-20211205111912335

  这是什么意思呢?我们在根目录下执行ls -la就知道了。

image-20211205112906560

  当我们执行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_mode0x41ed八进制040755目录文件 rwxr-xr-x image-20211205230240267
i_uid0x00000x0000用户root
i_size0x00000060文件大小文件大小为96字节
i_time0x61a11c9d时间
i_gid0x00所在用户组root
i_nlinks0x02引用计数
i_zone0x00b1177数据在第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节点

image-20211205113523204

依次类推file.txt文件

  请根据我前面的思想,区推理file.txt文件,这里不再讲述

image-20211205113736184

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明故宫的记忆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值