6. 如何制作一个文件系统

Linux 文件系统下有一些最基本的目录,不同的目录下存放着不同作用的各类文件。最基本的目录有 /etc/lib/dev/bin 等,它们分别存放着系统配置文件,库文件,设备文件和可执行程序。这些目录一般情况下是必须的,在做嵌入式开发时,需要手动或者是用 busybox 等工具来创建这样一个基本的文件系统。这里仅制作一个非常简单的文件系统,并对该文件系统进行各种常规操作,以便加深对文件系统的理解。

范例:用 dd 创建一个固定大小的文件

还记得 dd 命令么?就用它来产生一个固定大小的文件,这个为 1M(1024\*1024 bytes) 的文件

$ dd if=/dev/zero of=minifs bs=1024 count=1024

查看文件类型,这里的 minifs 是一个充满 \\0 的文件,没有任何特定的数据结构

$ file minifs
minifs: data

说明: /dev/zero 是一个非常特殊的设备,如果读取它,可以获取任意多个 \\0

接着把该文件格式化为某个指定文件类型的文件系统。(是不是觉得不可思议,文件也可以格式化?是的,不光是设备可以,文件也可以以某种文件系统类型进行组织,但是需要注意的是,某些文件系统(如 ext3)要求被格式化的目标最少有 64M 的空间)。

范例:用 mkfs 格式化文件

$ mkfs.ext2 minifs

查看此时的文件类型,这时文件 minifs 就以 ext2 文件系统的格式组织了

$ file minifs
minifs: Linux rev 1.0 ext2 filesystem data

范例:挂载刚创建的文件系统

因为该文件以文件系统的类型组织了,那么可以用 mount 命令挂载并使用它。

请切换到 root 用户挂载它,并通过 -o loop 选项把它关联到一个特殊设备 /dev/loop

$ sudo -s
# mount minifs /mnt/ -o loop

查看该文件系统信息,仅可以看到一个目录文件 lost+found

$ ls /mnt/
lost+found

范例:对文件系统进行读、写、删除等操作

在该文件系统下进行各种常规操作,包括读、写、删除等。(每次操作前先把 minifs 文件保存一份,以便比较,结合相关资料就可以深入地分析各种操作对文件系统的改变情况,从而深入理解文件系统作为一种组织数据的方式的实现原理等)

$ cp minifs minifs.bak
$ cd /mnt
$ touch hello
$ cd -
$ cp minifs minifs-touch.bak
$ od -x minifs.bak > orig.od
$ od -x minifs-touch.bak > touch.od

创建一个文件后,比较此时文件系统和之前文件系统的异同

$ diff orig.od touch.od
diff orig.od touch.od
61,63c61,64
< 0060020 000c 0202 2e2e 0000 000b 0000 03e8 020a
< 0060040 6f6c 7473 662b 756f 646e 0000 0000 0000
< 0060060 0000 0000 0000 0000 0000 0000 0000 0000
---
> 0060020 000c 0202 2e2e 0000 000b 0000 0014 020a
> 0060040 6f6c 7473 662b 756f 646e 0000 000c 0000
> 0060060 03d4 0105 6568 6c6c 006f 0000 0000 0000
> 0060100 0000 0000 0000 0000 0000 0000 0000 0000

通过比较发现:添加文件,文件系统的相应位置发生了明显的变化

$ echo "hello, world" > /mnt/hello

执行 sync 命令,确保缓存中的数据已经写入磁盘(还记得本节图 1 的 buffer cache 吧,这里就是把 cache 中的数据写到磁盘中)

$ sync
$ cp minifs minifs-echo.bak
$ od -x minifs-echo.bak > echo.od

写入文件内容后,比较文件系统和之前的异同

$ diff touch.od echo.od

查看文件系统中的字符串

$ strings minifs
lost+found
hello
hello, world

删除 hello 文件,查看文件系统变化

$ rm /mnt/hello
$ cp minifs minifs-rm.bak
$ od -x minifs-rm.bak > rm.od
$ diff echo.od rm.od

通过查看文件系统的字符串发现:删除文件时并没有覆盖文件内容,所以从理论上说内容此时还是可恢复的

$ strings minifs
lost+found
hello
hello, world

上面仅仅演示了一些分析文件系统的常用工具,并分析了几个常规的操作,如果想非常深入地理解文件系统的实现原理,请熟悉使用上述工具并阅读相关资料。

参考资料: