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
相關文章
相關標籤/搜索