对于使用openwrt的嵌入式系统来说,因为硬件绝大多数采用Flash,因此一般使用squash 文件系统和jffs2文件系统。前者是只读的,后者是可写的。我们一般会把jffs2 mount到某个目录下。这样就存在某些目录如/bin是只读的(squash fs),某些目录是可读写的(jffs2),这样对文件的操作会依赖于文件系统的属性和文件的路径。
openwrt使用了mini_fo文件系统,从用户的使用角度看,会觉得整个文件系统都是可写的。用户可以任意修改、删除、添加文件。这种文件系统可以认为是在squash fs和jffs2的文件系统之上实现了一个符号链接,如果用户读取只读文件,则链接到squash文件系统读取,如果用户对只读文件进行了修改,则将修改的文件放到jffs2文件系统上,并修改链接。
如果用户的系统不采用jffs2系统,openwrt会使用ramfs,依旧可以实现上面的功能,不过系统重启后,修改会丢失。
这个最大的好处在于,对于openwrt这嵌入式linux开发平台来说,用户态的应用程序不用关心底层到底使用那种文件系统,不用关心只读的还是可写的,不用关心具体的文件路径。
openwrt启动后,linux内核会加载squash文件系统,这个文件系统是只读的。
openwrt在初始化时,会以mini_fo的文件 系统类型重新mount整个文件系统,这个过程在/etc/preinit的脚本中实现。文件系统的加载在下面shell脚本的红色部分。
package/base-files/files/lib/functions/boot.sh
fopivot() { #
root=$1
{
if grep -q mini_fo /proc/filesystems; then
mount -t mini_fo -o base=/,sto=$1 "mini_fo:$1" /mnt 2>&- && root=/mnt
else
mount --bind / /mnt
mount --bind -o union "$1" /mnt && root=/mnt
fi
} || {
[ "$3" = "1" ] && {
mount | grep "on $1 type" 2>&- 1>&- || mount -o bind $1 $1
dupe $1 $rom
}
}
pivot $root $2
}
下面的链接为mini_fo的主页
阅读(1018) | 评论(0) | 转发(0) |