星期五, 5月 11, 2007

建立jffs2 root file system

轉載自http://blog.bs2.to/bluestorm

JFFS2 全名是Journalling Flash File System Version 2, 其功能就是在管理MTD裝置上所實作的日誌型檔案系統.
相較於其他Flash儲存方案, JFFS2並沒有提供讓傳統檔案系統也可以使用Flash的轉譯層(translation layer).它只會直接在MTD裝置上實做日誌結構的檔案系統. JFFS2會在mount的時候, 掃瞄MTD裝置的日誌內容, 並在RAM中重新建立檔案系統結構本身.

JFFS2的特性,
1, 其斷電可靠度,.
2, 在MTD裝置上實做耗損平衡(wear leveling). 可以確保flash 上所有的區塊具有一致的使用率, 因此可以平衡每個區塊的損耗程度.
3, 在MTD裝置上實做資料壓縮(data compression). 除了節省空間外, 在使用資料前先將它解壓到RAM上.不過, jffs2不能使用XIP(就地執行eXecute In Place).
4, 有實做垃圾收集(garbage collection). 它可以確保你的應用程式不會成長到到埴滿整個檔案系統.也就是寫入前會先檢查檔案系統的可用空間

如何建立jffs2 root file system.

我們在flash 中規劃了一塊32MB的區塊, 想要建構一個大約有2MB資料, 其他30MB可以自由讀寫的檔案系統.
請注意, 雖然我們在driver裡規劃32MB的flash 區塊, 但是我們如果做了一個2MB的jffs2 root file system image, 燒入flash後,能使用的空間仍然是2MB, 而非32MB, 另外的30MB就浪費掉了.

1,假設我們巳經有一個rootfs的資料夾裡, 巳經放好檔案系統了.
2, 把想要增減的檔案或資料夾, 就從rootfs裡加入或移除.
3,用mkfs.jffs2來製作jffs2的image.(一般全部安裝的linux distribution都會有這個命令)

mkfs.jffs2 -r rootfs -o rootfs.jffs2 -e 0x40000 --pad=0x02000000

(1) -r : 指定我們要做image的來源資料夾.
(2) -o : 指定我們要輸出的image檔案的檔名.
(3) -e : 每一塊要抹除的block size. 預設是64KB. 因為較舊的flash, 其block size會不一樣. 要注意.
(4) --pad : 用16進位來表示所要輸出檔案的大小. 也就是root.jffs2的size. 很重要的是, 為了不浪費flash空間, 這個值最好符合flash driver所規劃的區塊大小.以我們的例子來說, 就是32MB.

4, 不同於一般磁碟檔案系統, 無法使用mount -o loop .....命令在loopback裝置上mount jffs2. 必須從真正的MTD裝置來mount jffs2.不然就要使用jffs2reader來檢視image檔的內容.(註, jffs2reader我沒有成功使用過).
5, 若是使用NFS的話, 可以透過網路遠端mount這個image檔案.

沒有留言: