Chinaunix首页 | 论坛 | 博客
  • 博客访问: 891310
  • 博文数量: 286
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1841
  • 用 户 组: 普通用户
  • 注册时间: 2015-05-09 16:26
文章分类

全部博文(286)

文章存档

2016年(38)

2015年(248)

我的朋友

分类: 嵌入式

2015-05-11 11:42:22

    对于使用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) |
给主人留下些什么吧!~~