總的來分,Linux檔案系統分為兩類,基于Flash和基于RAM的檔案系統。兩者的特點是,基于Flash的檔案系統是掉電可儲存的,但對于RAM的檔案系統掉電是會丢失的。
一、基于Flash的日志型的檔案系統
1、隻讀的CramFS檔案系統簡介
CramFS是一個壓縮式的檔案系統,它并不需要一次性的将檔案系統中的所有内容都解壓縮到記憶體之中,而是在系統需要通路某個位置的資料時,首先計算出該資料在CramFS檔案系統中的位置,将這段資料實時地解壓縮到記憶體中,而不是所有的資料。
A、特點:
a. 采用實時解壓縮方式;
b. CramFS的資料都是經過處理、打包之後的,是以其通常不支援寫操作(通常tmp目錄是可以寫的,這個目錄應該是預設挂載成了RamFS),這個特性剛好适合嵌入式應用中ROM類型的隻讀儲存設備使用;
c. 在CramFS中的檔案大小不能超過16MB;
#define CRAMFS_MODE_WIDTH 16)
d. 目前版本的CramFS隻支援PAGE_CACHE_SIZE為4096的核心,是以要特别注意核心的配置。
B、制作方法
準備好一個根檔案系統rootfs,利用工具mkcramfs生成鏡像檔案cram.img(本文環境為ubuntu10.04,有些鏡像制作工具如果沒有的話,可以自行安裝)
$mkfs.cramfs /rootfs cram.img
可以挂載測試一下,采用虛拟的loopback的塊裝置
$mount -o loop -t cramfs /cram.img /mnt
$ls /mnt
檢視一下,是否有/rootfs中的例如bin、sbin、usr等目錄
可以将其下載下傳到nand MTD的root分區,設定好uboot的啟動參數,例如
$set bootargs noinitrd root=/dev/mtdblock4 console=ttyS0,115200 rootfstype=cramfs mem=64mb
并且特别注意核心配置時要選上File systems --->[*] Miscellaneous filesystems ---> Compressed ROM file system support (cramfs)以支援cramfs檔案系統,同時還應該将MTD相關的塊裝置和分區選上,那麼,系統正常挂載cramfs之後會出現VFS: Mounted root (cramfs filesystem) readonly.
2、基于NAND Flash的yaffs檔案系統簡介
yaffs檔案系統是專門為NAND Flash設計的檔案系統,是一種日志型的檔案系統。
a. 源碼公開,具有很好的移植性,可以在Linux、uClinux和WinCE等平台運作,甚至于沒有作業系統的環境也能夠使用;
b. yaffs利用NAND閃存提供的每個頁面16位元組的備用空間類存放ECC和檔案系統的組織資訊,能夠實作錯誤檢測和壞塊處理;
c. 對于小頁面(512B+16B/頁)通常采用yaffs,而對于大頁面(2KB+64B/頁)或者總量超過512MB的NAND Flash則采用yaffs2。
B、制作
關于yaffs鏡像的制作工具應該根據具體的NAND flash的頁大小有所區分
$mkyaffsimage /rootfs yaffs.img
C、使用
燒寫yaffs鏡像到NAND分區也是很有講究的,因為該鏡像的檔案裡面除了以512位元組為機關的一個頁面的資料外,還有16位元組的NAND Flash備份資料,應該如以下方法燒寫
$usbload
DNW下載下傳鏡像 //注意下載下傳位址
$nand erase 0x2000000 0x3E000000
$nand write.yaffs 0x41000000 0x2000000 $(filesize)
可以有兩種方法使用,在uboot啟動參數的時候就指定好根檔案系統采用yaffs(從延長nand壽命角度和運作速度來講不贊同這麼使用)
$set bootargs root=/dev/mtdblock2 console=ttyS0,115200 rootfstype=yaffs mem=208mb
或者采用其他檔案系統(如cramfs、ramdisk、initramfs或者tmpfs等)作為根檔案系統,在系統和根檔案系統起來之後,在運作
$mount -t yaffs /dev/mtdblock3 /mnt
在/mnt目錄下建一個檔案
$touch /mnt/test
解除安裝之後重新挂載該檔案系統
$umount /mnt
在看一下剛才的test檔案還是存在的
或者建一個專門的system目錄,以用作QT等較大型的圖形界面的鏡像的挂載點。
3、基于NOR Flash的jffs檔案系統簡介
JFFS日志閃存檔案系統最早是由瑞典Axis Communications公司基于Linux 2.0的核心未嵌入式系統開發的檔案系統。JFFS2是RedHat公司基于JFFS開發的閃存檔案系統。JFFS基于MTD驅動層,主要用于NOR型閃存。JFFS3還處于設計階段,主要為了解決JFFS2的不可擴充性,其設計目标是支援大容量閃存(>1TB)的檔案系統。
a. 可讀寫;
b. 支援資料壓縮(YAFFS不支援壓縮,适合存儲容量較大的檔案系統);
c. 基于哈希表的日志型檔案系統;
d. 提供了崩潰/掉電安全保護;
e. 提供“寫平衡”支援等;
B、制作和使用
$mkfs.jffs2 -d /rootfs -o jffs2.img
在ubuntu上直接挂載測試
$mount -t jffs2 jffs2.img /mnt -o loop
能正确顯示之前準備的根檔案系統,則說明制作成功。
4、UBI/UBIFS檔案系統簡介
UBIFS是由Thomas Gleixner,Artem Bityutskiy等人于2006發起的,緻力于開發性能卓越、擴充性高的Flash專用檔案系統。UBI是一種類似于LVM的邏輯卷管理層,主要實作損益均衡,邏輯擦除塊、卷管理和壞塊管理等,而UBIFS則是基于UBI的Flash日志檔案系統。UBI并不直接工作于MTD之上而是工作于UBI卷之上,這是它與JFFS2、YAFFS2的一個顯著差別。
使用UBIFS時,核心選項配置
Device Drivers --->
*> Memory Technology Device (MTD) support --->
UBI - Unsorted block images --->
*> Enable UBI
*> MTD devices emulation driver (gluebi)
File systems --->
[*] Miscellaneous filesystems --->
*> UBIFS file system support
在ubuntu上使用mtd-utils制作UBI鏡像,例如
$mkfs.ubifs -r rootfs -m 2048 -e 129024 -c 4096 -o ubifs.img
$ubinize -o ubi.img -m 2048 -s 512 -p 128KiB ubifs.conf
關于ubifs檔案系統的相關知識,可以參考
這些文章對uboot和核心中如何燒寫和支援ubifs給出了詳細的描述,引用之,在此謝過。
相關參考:
《ARM嵌入式Linux系統開發技術詳解》楊水清等
《LINUX裝置驅動開發詳解》宋寶華等