• openwrt 文件系统加载分析


    对于使用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() { # <rw_root> <ro_root> <dupe?>
            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的主页
    http://www.denx.de/wiki/Know/MiniFOHome
  • 相关阅读:
    C#之事件
    C#之委托
    CIC许可更新
    HMP许可更新
    知识库上传
    [转]spring中<tx:advice></tx:advice>意义
    [转]spring property标签中的 ref属性和ref 标签有什么不同
    [转] Spring@Autowired注解与自动装配
    [转]SpringMVC入门
    [转]SpringMVC拦截器详解[附带源码分析]
  • 原文地址:https://www.cnblogs.com/issuelinux/p/4255844.html
Copyright © 2020-2023  润新知