建立 ext2 & jffs2 file system




建立ext2 file system

Ext2是GNU/LINUX系統中標準的檔案系統, 其特點在於存取檔案的效能極好,對於中小型的檔案尤佳.這是因為其資料區塊快取層的優良設計.
其 單一檔案大小和檔案系統本身的容量上限與檔案系統本身的資料區塊大小有關,在一般常見的x86系統中, 資料的區塊大小是4 KB, 則單一檔案大小的上限為2048GB,而檔案系統的容量上限為16348GB. 但以kernel 2.4來說, 其所使用的單一分割區最大只有1048GB, 因此實際上檔案系統能使用的分割區最大也是2048GB.
如何建立一個ext2的Root FileSystem, 以下的過程全部在Linux Host上進行

1,建立一個空的ext2檔案系統
我們將建立一個檔名為rootfs.ext2的檔案, 且其內容8192KB左右大小的檔案.如下:

dd if=/dev/zero of=rootfs.ext2 bs=1k count=8192
(1), dd這個指令是用來轉換檔案並且copy用的.
(2), if 指的是要被轉換的輸入檔案格式/dev/zero, 可由man zero 來查看其內容.
(3), of 指的是輸出的檔案, 我們將之輸出到rootfs.ext2這個檔案.
(4), bs指的是一個磁區佔用幾個kb.
(5), count指的是要使用多少個bs, 所以最後的容量為 bs*count = 1k*8192


mke2fs -F -m0 -i 4000 rootfs.ext2
(1), mke2fs 指令是用來將碟磁格式化為LINUX檔案系統.
(2), 我們將rootfs.ext2格式化為ext2格式.
(3), -i 選項是指要建立的inode數, 這裡建立了4000個.
(5), 此步驟是建立的個空的ext2檔案系統, 我們必須先將之掛載後才能新增檔案.

2, 將空的ext2檔案系統掛載起來

mount -w -o loop rootfs.ext2 /mnt/tmp
(1), 將rootfs.ext2檔案系統掛載到/mnt/tmp下, 其中-w的選項, 是設定其為read/write模式,
若設為-r則是read only唯讀模式.

3, 新增檔案至檔案系統
現在我們巳經把檔案系統掛載起來, 接著將所需要的檔案加入/mnt/tmp中.

到底要加入哪些檔案, 建議最好是找一個巳經做好的root file system來參考
並修改, 使之能適用於自己的系統.假設我們找到一個檔案系統filesys.ext2,
先將之掛載到/mnt/src的目錄下,

mount -w -o loop filesys.ext2 /mnt/src

再將/mnt/tmp1下的檔案全部複製到/mnt/tmp下

cp -dpR /mnt/src /mnt/tmp

4, 完成檔案系統製作
假設檔案系統巳經複製並修改完畢後, 我們使用umount將檔案系統卸載,

umount -l /mnt/src
umount -l /mnt/tmp

當卸載/mnt/tmp時, 會自動將mount file system時, 所修改的資料, 自動地回存
到rootfs.ext2中, 這個檔也可以稱為root file system的image.

5, 若以後還需要修改時
修改的方式是依照上面2,3的步驟而來, 先把要修改的root file system mount 起來,
依照所需新增,刪除或修改裡面的檔案, 再將修改過的root file system unmount 回原來的
image檔即可.

下列是我做的 script 。




#!/bin/sh
RAMSIZE=32768
STRIP_DIR=rootfs-cpio
TEMP_DIR=ramfs_tempdir

dd if=/dev/zero of=initrd.img bs=1k count=$RAMSIZE
  #/sbin/mke2fs -F -m0 initrd.img
  /sbin/mkfs.ext2 -F -v -m0 initrd.img
mkdir $TEMP_DIR
mount -o loop,exec initrd.img $TEMP_DIR
cp -rf $STRIP_DIR/* $TEMP_DIR/.
umount $TEMP_DIR
gzip -9 initrd.img
mkimage -A arm -O linux -T ramdisk -C gzip -d initrd.img.gz initrd.img
rm -rf initrd.img.gz $TEMP_DIR

PS1:1. mkimage 只是用來產生 uboot header 。
            2. mkfs.ext2, mke2fs 都可以,不過有些平台 mke2fs 的 image 在掛 ramdisk 時會 crc error  。但有些不會。不清楚原因!!!(20100204:mke2fs 加上 -t ext2 ,產生的ramdisk 就不會有 crc error....)

PS2:mkfs (意思為 makfilesystem) 收到選項 -t 檔案系統,自然會尋找程式 mkfs.檔案系統 並執行。以 ext3 為例,如果 mkfs 收到選項 -t ext3,自然會把格式化檔案系統的工作交由 mkfs.ext3 處理。一般 GNU/Linux 都會有 mke2fs、mkfs.ext2、mkfs.ext3、mkfs.ext4 和 mkfs.ext4dev,而事實上四個命令都是同一個程式。


PS3:http://wiki.linux.org.hk/w/Format_disk_as_Ext3
            http://wiki.ubuntu.hk/w/Format_disk




建立 jffs2 file system

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 -p 0x06340000 -e 0x20000 -d ./mtd9 -o mtd9.jffs2

(1) -d:指定我們要做image的來源資料夾.
(2) -o:指定我們要輸出的image檔案的檔名.
(3) -e:每一塊要抹除的block size. 預設是64KB. 因為較舊的flash, 其block size會不一樣. 要注意.
(4) -p:用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檔案.

參考:http://zylix666.blogspot.com/

JFFS2 有以下優點
1. JFFS2 在磁區級別上執行閃存擦除/寫/讀操作要比 Ext2 文件系統好。
2. JFFS2 提供了比 Ext2fs 更好的崩潰/掉電安全保護。
當需要更改少量數據時,Ext2 文件系統將整個磁區複製到記憶體(DRAM)中,在記憶體中合併新數據,並寫回整個磁區。
這意味著為了更改單個字,必須對整個磁區(64 KB)執行讀/擦除/寫例程 — 這樣做的效率非常低。
要是運氣差,當正在 DRAM 中合併數據時,發生了電源故障或其他事故,那麼將丟失整個數據集合,
因為在將數據讀入 DRAM 後就擦除了閃存磁區。JFFS2 附加文件而不是重寫整個磁區,並且具有崩潰/掉電安全保護這一功能。
3. 這可能是最重要的一點:JFFS2 是專門為象閃存晶片那樣的嵌入式設備創建的,所以它的整個設計提供了更好的閃存管理。

JFFS2 在嵌入式系統中有以下缺點
1. 當文件系統已滿或接近滿時,JFFS2 會大大放慢運行速度。

留言

這個網誌中的熱門文章

NMEA標準格式 -- GPS

網路 Transformer 的用途

cut,sed,awk 字串處理