文件系统
下面开始深入地了解文件系统与上面分区的关系,系统有rootfs_rom这个隐藏的只读文件系统,也有rootfs_data这个可写的文件分区,它们之间是什么关系呢?这是OpenWrt设计的一个有意思的地方。
(1)首先,引导程序启动内核完成之后,由内核加载roofs_rom只读分区部分来完成系统的初步启动。
(2)rootfs_rom只读分区采用的是Linux内核支持的squashFS文件系统(一种压缩只读文件系统),加载完毕后将其挂载到/rom目录(同时也挂载为/根目录)。
(3)系统将使用JFFS2文件系统格式化的rootfs_data可写文件分区并且将这部分挂载到/overlay目录。
(4)系统再将/overlay透明挂载为/根目录。
(5)最后将一部分内存挂载为/tmp目录。
(6)挂载情况如下。
root@OpenWrt:~# df
Filesystem      1K-blocks   Used Available Use% Mounted on
rootfs          13248    464   12784  4%/
/dev/root         1792   1792     0 100%/rom
tmpfs           30940   15116   15824 49%/tmp
/dev/mtdblock5      13248    464   12784  4%/overlay
overlayfs:/overlay    13248    464   12784  4%/
tmpfs            512     0    512  0%/dev
7.2.1 透明挂载/根目录
OpenWrt设计的一个特点是:系统先将rootfs_rom挂载为/根目录,这样就具备了一个完整的系统,然后再将rootfs_data以透明方式挂载在/根目录上。OpenWrt透明挂载处理流程如图7-2所示,这样重叠之后的效果是:
(1)我们所看到的根文件系统是由rootfs_rom和rootfs_data两个分区组合在一起的;
(2)当我们修改一个任何位置的文件的时候,所做的修改在rootfs_data里都会记录;
(3)当我们删除一个文件的时候,所做的修改在rootfs_data里都会记录;
(4)当我们增加一个文件的时候,所做的修改在rootfs_data里都会记录;
(5)当我们读取文件的时候,首先检测rootfs_data里的状态,再检测rootfs_rom里的内容,一直到最后给你一个结果。
[插图]
图7-2 OpenWrt透明挂载处理流程示意图
这样做的好处和坏处为:
(1)当对文件进行操作的时候,比如我们修改了一个名字为abc的文件,那么同时在/rom里还有修改之前的那个abc,同时在/overlay里有修改之后的abc,所占的空间是倍增的;
(2)系统不论任何时候,只要通过简单地删除掉/overlay里所有文件,就能达到复原的效果。
一个简单的例子如下。
root@OpenWrt:~# ls/31test
ls:/31test: No such fi le or directory
root@OpenWrt:~# ls/overlay/31test
ls:/overlay/31test: No such fi le or directory
root@OpenWrt:~# touch/31test
root@OpenWrt:~# ls/31test
/31test
root@OpenWrt:~# ls/overlay/31test
/overlay/31test
root@OpenWrt:~# rm/31test
root@OpenWrt:~# ls/overlay/31test
ls:/overlay/31test: No such fi le or directory
不过不建议直接在/overlay里删除,否则会出现不同步的情况!