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