天天看點

【Linux基礎】 Jffs2根檔案系統制作

JFFS2是Flash上應用最廣的一個日志結構檔案系統。它提供的垃圾回收機制,不需要馬上對擦寫越界的塊進行擦寫,而隻需要将其設定一個标志,标明為髒塊,當可用的塊數不足時,垃圾回收機制才開始回收這些節點。同時,由于JFFS2基于日志結構,在意外掉電後仍然可以保持資料的完整性,而不會丢失資料。 由于實驗平台使用的redhat EL4的環境沒有安裝制作JFFS2檔案系統鏡像的工具mkfs.jffs2,是以首先在Linux系統中安裝mkfs.jffs2工具,Linux入門教育訓練安裝過程需要用到三個工具,分别是:lzo-2.03.tar.gz 、zlib-1.2.3.tar.bz2 、 mtd-utils-1.2.0.tar.bz2(源碼包都在CD光牒視訊點播目錄中可以找到) 安裝的過程如下: 1、首先建立工具的安裝目錄。 #mkdir -p /build_dir/build_jffs2 #cd /build_dir/build_jffs2 将上述三個工具包複制到該目錄下。 2、安裝lzo庫。 本處使用的是 lzo-2.03.tar.gz。具體安裝過程如下: #tar –zxvf lzo-2.03.tar.gz #cd lzo-2.03 #./configure #make #make install 3、安裝ZLIB庫。 本處使用的是zlib-1.2.3.tar.bz2。具體的安裝過程如下: #tar –jxvf zlib-1.2.3.tar.bz2 #cd zlib-1.2.3 #./configure #make #make install 4、安裝MTD工具包 本處使用的是 mtd-utils-1.2.0.tar.bz2。具體的安裝過程如下:  #tar –jxvf mtd-utils-1.2.0.tar.bz2  #cd  #make 上述步驟編譯通過之後會在目前目錄下生成mkfs.jffs2工具,這個工具就是用來制作jffs2檔案系統映象的。把mkfs.jffs2拷貝到/usr/bin/目錄下; #cp mkfs.jffs2 /usr/bin/ mkfs.jffs2工具的使用方法 指令格式: mkfs.jffs2 -r rootfs -e 0x4000 –n –p --pad=0x1e00000 -o rootfs.jffs2 主要參數說明: 實驗平台用到的nand flash 是K9F1208,C語言教程在制作鏡像過程的參數需要和它對應。 -r 指定要做成鏡像檔案的根檔案系統目錄 -o 指定檔案系統映象的輸出檔案名稱 --pad 用16進制來表示所要輸出檔案的大小,也就是root.jffs2的大小。很重要的是, 為了不浪費flash空間, 這個值最好符合flash driver所規劃的區塊大小.這裡使用的是8MB. -p 表示在映像的結尾填充資訊到該flash分區的未使用空間。 -h 檢視幫助 -n 每個擦除的塊中不添加clreanmarker 警告語句。如果挂載後會出現類似:CLEANMARKER node found at 0x01000000 has totlen 0xc != normal 0x0 的警告,則加上 -n 就會消失。 -e 每一塊要擦除的塊大小,示例是64KB,不同的flash其block size不一樣 其餘參數可詳見mkfs.jffs2的幫助說明 常見錯誤: 1、将 rootfs.jffs2下載下傳到NAND FLASH,然後啟動開發闆。出現如下警告: jffs2_scan_eraseblock(): Magic bitmask 0x1985 not found at 0x010ce111: 0xfbdb instead 原因為flash的未使用空間不是全0xff的原因,可以在加載jffs2.img之前,對檔案系統flash加載分區範圍進行擦除,或者在用mk.jffs2生成檔案系統鏡像的時候,用-p選項填充所有未使用空間為0xff。 Bootloader 設定傳遞給核心的指令行參數: root=/dev/mtdblock2 init=/sbin/init console=ttySAC0,115200 rootfstype=jffs2 備注: JFFS2 維護了幾個連結清單來管理擦寫塊,根據擦寫塊上的内容,一個擦寫塊會在不同的連結清單上。具體來說,當一個擦寫塊上都是合法(valid)的節點時,它會在 clean_list 上;當一個擦寫塊包含至少一個過時(obsolete)的節點時,它會在 dirty_list 上;當一個擦寫塊被擦寫完畢,并被寫入 CLEANMARKER 節點後,它會在 free_list 上。而當你在挂載這個檔案系統的時候,如果出現CLEANMARKER node found at 0x0042c000 has totlen 0xc != normal 0x0的警告的時候,可以加一個“-n”的選項,這個主要是由于針對Nand Flash不需要在每個擦除塊的開始寫入CLEANMARKER 節點。 U-BOOT的指令終端設定如下:

 GEC2440#setenv bootargs root=/dev/mtdblock/2 init=/linuxrc console=ttySAC0,115200 rootfstype=jffs2 rw 使用U-BOOT下載下傳rootfs.jffs2鏡像下載下傳到Nand Flash第二個分區。 GEC2440#nand erase 200000 800000 GEC2440#nand write.jffs2 300008000 200000 800000 說明下關于nand flash操作的幾個常用指令的含義 nand write : 向Nand Flash寫入資料,如果NandFlash相應的區域有壞塊,則直接報錯。 nand write.jffs2 :向Nand Flash寫入資料,如果NandFlash相應的區域有壞塊,可以跳過壞塊。 nand read: 讀取Nand Flash相應區域的資料,如果NandFlash相應的區域有壞塊,則直接報錯。 nand read.jffs2s :讀取Nand Flash相應區域的資料,如果NandFlash相應的區域有壞塊,将對應壞塊區域的緩沖填充0xff,然後跳過此壞塊繼續讀取。 nand read.jffs2: 讀取Nand Flash相應區域的資料,如果NandFlash相應的區域有壞塊,直接跳過壞塊。 具體的參考代碼參看U-BOOT源碼:common/cmd_nand.c檔案。 下載下傳完JFFS2檔案系統鏡像後,需要把Linux核心NandFlash的驅動關于檔案系統分區的大小改為和鏡像一樣大,否則會出現類似如下錯誤:   Freeing init memory: 124K   Warning: unable to open an initial console.   Argh. Special inode #171 with mode 0xa1ff had more than one node   Kernel panic: No init found. Try passing init= option to kernel.   Argh. Special inode #63 with mode 0xa1ff had more than one node   Returned error for crccheck of ino #63. Expect badness...   Argh. Special inode #68 with mode 0xa1ff had more than one node 還有一種制作JFFS2檔案系統鏡像的方法,C語言入門在制作鏡像的參數中可以不加—pad選項,生成的檔案系統鏡像可用空間為零,過程如下: #mkfs.jffs2 -r /source/rootfs -e 0x4000 -n -p -o rootfs.jffs2 啟動開發闆燒寫rootfs.jffs2鏡像 GEC2440#nand erase 200000 800000//(把整個存放檔案系統的分區全部擦除)。 GEC2440#nand write.jffs2 30008000 200000 31a28c//(必須是rootfs.jffs2的實際大小。如果寫的大小不符合,那麼分區的其餘部分JFFS2檔案系統将無法識别)。 建立檔案節點: mknod /dev/裝置名裝置類型 主編号 次編号 本文轉載于Linux入門:http://www.weicedu.com/thread-275856-1-1.html

繼續閱讀