對於使用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