1:背景:
最近研究文件系统迫切地需要通过直接查看磁盘上的二进制源码来观察inode bitmap,databitmap,inode table,数据区的信息。可是如何知道各个区域在不同文件系统中所占的块大小,起始地址是个头疼的问题。我试着通过debugfs的一些功能来查找。具体尝试如下:
debugfs /dev/sde3
stat .
可以查看根目录的数据所在的block,根目录数据区block为数据区第一个block,(我这么认为,模糊的记忆,有待求证)
输入ls -i 查看根目录下各个文件的inode编号。本来想通过inode编号反向索引到inode table区的,但没有成功。。。
于是当然就想到了直接看mkfs的源码,看格式化到底默认配置各个区各占多少个block。
2:怎样运行自己的mkfs
在系统中输入格式化指令时:mkfs.ext2 mkfs.ext3 mkfs.ext4等,系统就直接调用了其默认的mke2fs指令。首先我们要搞清楚如下的指令是等价的。
mke2fs -t ext4 = mkfs -t ext4 = mkfs.ext4
所以我们的关键是让系统能够运行我们自己的mke2fs执行文件,而不是系统默认的。步骤如下:
step1:在http://sourceforge.net/projects/e2fsprogs/这个链接文件下下载e2fsprogs源码包
step2:把下载到的e2fsprogs-1.42.11.tar.gz包在linux下解压缩:比如说我解压缩的路径如下
root@f303server:/mnt/sde1/mkfs/e2fsprogs-1.42.11# tar zxvf e2fsprogs-1.42.11.tar.gz
step3:更改congifure文件的执行属性
打开解压缩的文件,文件下有一个配置文件congifure。将其改成可执行文件的属性 chmod +x congifure
congifure 文件是配置文件,运行它能够根据你系统情况生成对应的makefile文件,从而为make做准备。
step4:运行configure文件
./configure configure完成后,系统会生成makefile文件
step5: 编译
make make完之后就生成可执行文件了
step6: 使用编译好的mke2fs
可执行文件mke2fs在misc目录下
cd misc/
ls
我们可以看到绿色的可执行文件标示:
有了它,我们就可以愉快的运行自己的mke2fs了。不过要记得在这里加上路径哦,在:/mnt/sde1/mkfs/e2fsprogs-1.42.11/e2fsprogs-1.42.11/misc路径下,如果直接输入mke2fs,则系统调用的是内核安装默认的。若想要运行我们编译的版本,需要做的是加上当前路径./mke2fs。
请看如下截图,我故意输入错误的mke2fs的指令,让其有Usage提示信息。以便于观察,我在自己的mke2fs版本的上的Usage提示信息加入了TSS,方便打印观察
上图可以看到,黑色标记部分证明了运行的是我编译的mke2fs文件。
到此为止我们就可以在/mnt/sde1/mkfs/e2fsprogs-1.42.11/e2fsprogs-1.42.11/misc路径下输入路径化的./mke2fs -t ext4 /dev/ram0 来用自己编译的mke2fs了。由于可以再mke2fs中间加入辅助打印信息,因此我们就可以方便的看到super block,GDT(块组描述符), inode bitmap , data bitmap,inode table以及数据区的具体位置了。这样用hexdump指令观察disk上的数据就更加有目标性了。为后续观察提供很大的便利。。给自己点个赞!
3.该过程的经历
上述6个步骤我哗啦啦地就总结完了,如果跟着做也哗啦啦很快做完了。可是其实我摸索的过程也挺崎岖的。。。
主要是自己还是too young,too simple,然后被一篇博客误导了。制作嵌入式文件系统工具mkfs.ext2 mkfs.ext2 mkfs.ext2。其实也不叫误导,人家题目都写清楚了是“嵌入式”的,而我确值看了后半句。。o(╯□╰)o~~他应该是在linux上编译e2fsprogs-1.42.11里面的文件,然后再在手机上运行,编译的机器和编译后可执行代码的设备机器不是同一个,所以需要用到交叉编译工具。以前我们嵌入式的课弄过交叉编译这玩意儿,可是没什么印象。我居然很逗地以为我也要交叉编译,按照那个步骤做。。然后一直在整那个交叉编译工具。。疯了~~~
附录:
1.默认格式化为ext2
2.查看mkfs版本