Cramfs、JFFS2、YAFFS2的全面对比
Cramfs、JFFS2、YAFFS2的全面對比? http://blog.csdn.net/daofengdeba/article/details/7721340
由于嵌入式系統自身存在一些特殊要求,使得一些傳統的文件系統(如FAT、EXT2等) 并不十分適合。專用的嵌入式文件系統應有一些自身的特性,如文件系統面對的儲存介質特殊性、文件系統應具有的跨平臺的安全性,以及整個系統的即時性等。本文介紹了3種源碼開放的嵌入式文件系統Cramfs、JFFS2、YAFFS2,詳細分析比較了這3種文件系統的主要性能,并根據分析結果指出了各自的適用領域。
Cramfs、JFFS2、YAFFS2是3種性能優越,專用于嵌入式系統的文件系統。本文通過對這3種文件系統的設計原理和主要性能進行分析與比較,歸納出各自的選型依據據和適用領域。 三種嵌入式文件系統主要性能分析與比較 資料安全、運行速度、占用資源、使用范圍等是嵌入式文件系統的主要性能指標。下面從這幾個方面入手,對這三種嵌入式文件系統進行分析與比較。 資料安全 當前的嵌入式系統主要使用固態Flash晶片作為儲存設備。由于Flash設備自身的特點以及嵌入式系統工作環境的復雜多樣性,如何保證資料的安全是嵌入式文件系統首先要考慮的問題。資料安全主要包括資料冗余和掉電保護等部分。 資料冗余Cramfs文件系統是一種只讀文件系統,文件系統內容不可更改,設計思想遵循「只儲存最少的信息」;甚至沒有時間戳之類的信息,除了資料包的CRC校驗信息外,幾乎沒有別的資料冗余。
?
JFFS2文件系統是典型的日志結構的文件系統,它儲存的資料是日志式資料信息。JFFS2在Flash上??只有兩種類型的資料實體:j.ffs2_raw_inode和jffs2_raw dirent。前者包含文件的管理信息,后者用于描述文件在文件系統中的位置。真正的資料信息就保持在jffs2_raw_inode節點的后面,大部分管理的信息都是在系統掛載之后建立起來的。兩種資料實體有著公共的文件頭結構jffs2 _ unknown_node。在這個結構里,有個jint32 _t類型的hdr_crc變量,它代表文件頭部中其他域的CRC校驗值。這說明JFFS2文件系統使用的是CRC循環冗余校驗碼。[文件管理信息 + 文件在文件系統中的位置 + 真正的資料]
?
YAFFS2文件系統是一種類日志文件系統,專用于NAND型Flash設備。其儲存資料的基本單位是chunk,相當于Flash的頁。Chunk中的資料包括兩部分:一部分是資料區,占用Flash的一頁;另一部分是文件信息及冗余資料區,占用Flash頁的OOB區。其冗余資料主要是ECC校驗資料,對于小頁(每頁512位元組)的Flash,每頁有6位元組的ECC資料;對于大頁(每頁2048位元組)的Flash,每頁有24位元組的ECC資料。[專用于nand, 真正的資料放在flash頁, 文件信息和冗余資料放在Flash頁的OOB區]
?
掉電保護:
Cramfs文件系統將文件系統內容解壓到記憶體中,由于其不能寫入,文件系統的內容無法更改,因此不存在掉電保護的問題。[無掉電保護] JFFS2是一種日志結構文件系統,因此不論電源以何種方式在哪個時刻停止供電,JFFS2都能保持資料完整性。當系統遭受不正常斷電后重新啟動時,JFFS2自動將系統恢復到斷電前最后一個穩定狀態。需要注意的是,文件系統在最后一個穩定狀態之后發生的任何改變,都無法進行恢復。 [斷電重啟后恢復到上一個穩定狀態]YAFFS2是一種類日志文件系統,可以在意外掉電重啟后自動提供可靠的資料記錄,防止文件系統的崩潰。它使用獨立的日志文件跟蹤文件系統內容的變化。舉例來說:當應用程式需要寫Flash的某一頁時,它首先修改的是存放于文件日志中的一塊鏡像;只有當日志中的鏡像復制到文件系統中后,資料才真實地寫到該頁上。當發生意外掉電重啟后,YAFFS2沒有像JFFS2那樣,使用舊文件完全代替新寫文件,而是選擇用新文件完全代替舊的文件,或者已寫部分使用新文件,未寫部分使用舊文件。這種方式增強了掉電時未完全寫入文件的安全性能,特別是當意外掉電發生在資料區時,意外掉電時的文件幾乎被完好地保存下來。[斷電重啟后,用新換舊] 運行速度
運行速度可以從以下幾個方面考察:文件系統掛載速度,讀文件速度,寫文件速度等。這里預設的儲存介質是NAND Flash。 一般而言,壓縮的、只讀的文件系統在啟動時需要將文件系統解壓到SDRAM中,這在一定程度上會減緩文件系統掛載速度。但是,Cramfs文件系統在設計時充分考慮了系統掛載的時間,并沒有一次性地把文件系統的所有內容都解壓到記憶體中,而只是在系統需要訪問某個位置的資料時,迅速計算出該資料在Cramfs中的位置,將其解壓縮到記憶體之中,再進行訪問操作。由于其讀文件速度只是找出文件位址以及訪問記憶體的操作,所以無論是掛載速度,還是讀文件速度, Cramfs文件系統都比JFFS2和YAFFS2文件系統要快。 JFFS2文件系統的掛載可以分為以下幾個步驟進行:???
1.檢查每個節點CRC校驗碼的合法性,在記憶體中為每個節點每個節點分配必需的相關的結構;???
2.掃瞄每個i節點的物理節點鏈表,建立鏈接;???
3.釋放掃瞄過程中使用的臨時信息。 可以看出這個過程還是很復雜的,更重要的是,在JFFS2文件系統被掛載時,需要對整個Flash儲存區域進行掃瞄,這就耗費了大量的時間,因此JFFS2文件系統的開機速度非常緩慢。與JFFS2相比,YAFFS2減少了一些功能,掛載時只需掃瞄Flash記憶體的空閑區,根據從OOB(備份資料區)中讀取的yaffs_tags信息判讀是文件頭頁面還是資料頁面,再根據相應信息在記憶體中為每個文件建立一個對??應的yaffs_object對象。由于YAFFS2在系統載入時只需掃瞄各個頁面的OOB區,即可建立起整個文件系統的結構,而不需要像JFFS2那樣掃瞄整個Flash設備,因此大大加快了文件系統的啟動速度。但是,YAFFS2仍然要求對整個Flash設備所有頁的空閑進行掃瞄,這就導致當Flash設備儲存空間變大時,系統掃瞄時間會直線上升。 在文件系統運行時,JFFS2需要維護幾個鏈表來管理擦寫塊。根據擦寫塊上的內容,一個擦寫塊可能會在不同的鏈表上。具 體來說,當一個擦寫塊上都是合法(valid)的節點時,它會在clean_list上;當一個擦寫塊包含至少一個過時(obsolete)的節點時,它 會在dirty_list上;當一個擦寫塊被擦寫完畢,并被寫入Cleanmarker節點后,它會在free_list上。正是以這些鏈表為基礎, JFFS2文件系統才可以實現垃圾回收、損耗平衡等性能。文件系統掛載時YAFFS2在記憶體中建立一個層次結構的索引,可以看作是一個文件樹。樹的最底層指向實際存放文件的頁面,高層則是一層層的索引目錄。文件樹是通過一個聯合結構的節點來實現的。聯合結構是固定大小(32位元組),當它處于最底層時, 由16個2位元組入口來查找頁面ID;當處于其它層時,由8個4位元組指針指向其他更低層的節點。每個文件對應一個文件樹,便于檢索。在以NAND Flash為儲存介質的嵌入式系統中,YAFFS2的文件讀寫性能都優于JFFS2。[YAFFS2比JFFS2啟動速度快,讀寫性能也更優]
?
占用資源 在嵌入式系統中,記憶體和外部記憶體資源匱乏,需要節約使用。因此占用的記憶體和外部記憶體資源量也是衡量嵌入式文件系統的一個重要指標。 如果使用RAMDISK方式運行文件系統,那么在系統運行之后,首先要把Flash上??的映像文件解壓到記憶體中,才可以開始運行程序。這樣,同樣的程式碼不僅在外部記憶體中占據了空間,而且由于解壓縮,還在記憶體中占用了更大的空間。Cramfs雖然是一個壓縮式的文件系統,但前面已介紹過,它并不需要一次性地將所有內容解壓到記憶體之中。由于其對文件內容的壓縮,因此無論是外部記憶體還是記憶體, Cramfs都比JFFS2和YAFFS2占用更少的資源。 JFFS2將文件系統的資料和原資料以節點的形式儲存在Flash上??,其冗余資料只是節點頭部的CRC校驗碼,并且在儲存時對節點的資料進行了壓縮。與之相比,YAFFS2不僅儲存了頁資料的ECC校驗碼,并且沒有Flash設備OOB區儲存資料,而是用來儲存頁節點信息。其映像也是由若干個頁面組成,沒有對資料進行壓縮,因此YAFFS2文件系統映像大大超過了JFFS2文件系統映像。實驗表明,普通YAFFS2映像的大小約為同樣JFFS2映像大小的2倍。當文件系統在記憶體中運行時,JFFS2在記憶體中定義了若干鏈表,YAFFS2在記憶體中為每個文件創建一個文件樹。盡管為每個文件建立一個文件樹需要消耗掉不少的記憶體,但是比起維護JFFS2所需的鏈表消耗的記憶體,還是少一些。在實際運行中,YAFFS2占用的記憶體要小于JFFS2文件系統。[jffs2在儲存時對節點的資料進行了壓縮,系統映像會大于yaffs2的,但是運行時JFFS2維護的鏈表比yaffs的樹更占內存] 使用范圍 要使用Cramfs或JFFS2文件系統,離不開MTD驅動程式層的支援。MTD(Memory Technology Device)是Linux中的一個儲存設備通用界面層。雖然也可以建立在RAM上,但它是專為基于Flash的設備而設計的。MTD包含特定Flash 晶片的驅動程式, Flash晶片驅動向上層提供讀、寫、擦除等基本的Flash操作方法。MTD對這些操作進行封裝后向用戶層提供MTD char和MTD block類型的設備。MTD char類型的設備包括/dev/mtd0等,可以對Flash的原始字元訪問;MTD block類型的設備包括/dev/mtdblock0等,將Flash類比成塊設備,這樣就可以在這些塊設備上創建Cramfs或JFFS2等格式的文件系統。在對用戶層的界面上, Cramfs或JFFS2文件系統還需要作業系統VFS(虛擬文件系統)的支援。 同樣,YAFFS2文件系統支援使用MTD驅 ??動層和VFS層,這也是一般在嵌入式Linux或者μClinux作業系統中使用YAFFS2文件系統的常用方法。除此之外,YAFFS2還帶有NAND Flash晶片驅動,并為嵌入式系統提供了直接訪問文件系統的API,用戶可以不使用Linux中的MTD和VFS,直接對文件進行操作。[cramfs和jffs要利用mtd和vfs的支持, 而yaffs2可用可不用, 但在linux中通常都要用] 圖1?為嵌入式系統的文件系統結構。 AFFS2中的YAFFS2 Direct提供了直接的文件系統界面,因此在那些沒有VFS層的嵌入式系統中也可使用YAFFS2。YAFFS2文件系統的使用范圍要比Cramfs和JFFS2文件系統廣泛;但是需要注意的是,YAFFS2只能用在NAND Flash儲存設備上。 結論 這3種嵌入式文件系統在嵌入式系統中的應用非常廣泛,但是又具有各自的特點。表2?比較了3種文件系統的主要性能,并歸納出各自最適用的領域。 各自最適用的領域具體分析如下:???1. Cramfs是最早的一種嵌入式文件系統,它只儲存了最少的信息,對文件內容進行了壓縮,運行速度比較???
快。但是由于其不能寫入,不支援超過16 MB大小的文件,因此廣泛地應用于儲存空間小、文件系統內容???
較少并且不需要用戶寫入的嵌入式系統中。??
2. JFFS2是一種較早的Flash專用文件系統。目前已有很多JFFS2應用于μClinux以及嵌入式Linux的例子。事???
實上,它已經成為新版Linux中的一種標準文件系統。??
同時它對NOR Flash和NAND Flash提供支援,針對兩種Flash設備共同的特性,提供掉電保護和損耗平衡等???
功能,可供用戶讀寫,十分適合于同時用到這兩種Flash設備的嵌入式系統。??
3. YAFFS2是專為NAND Flash設計的文件系統,它充分考慮了NAND Flash設備的特性,支援ECC校驗,提???
供掉電保護和損耗平衡功能,運行和掛載速度都比JFFS2要快。它支援作業系統廣泛,包括常見的嵌入???
式Linux、WinCE、μClinux。由于它提供Direct界面,因此稍加修改也可使用在沒有作業系統的嵌入式???
系統中。目前,被廣泛應用于使用NAND Flash作為儲存設備的嵌入式系統中。 針對具體應用,可以在考察各種文件系統特點的基礎上,選擇更適合自身系統的一種文件系統解決方案。比如在許多以NAND Flash為儲存介質的應用系統中,都用到「Cramfs YAFFS2」文件系統。以Cramfs作為根文件系統,既提高了啟動速度,也能保護根文件不受破壞;使用YAFFS2作為用戶文件系統,在保證用戶可以自由讀寫文件的基礎上,提高了文件系統的安全性和運行速度,不失為一種優良的嵌入式文件系統解決方案。 擴展: 嵌入式: jffs2,yaffs2,logfs,ubifs文件系統性能分析? http://blog.chinaunix.net/uid-23381466-id-3411483.html Linux支持多種文件系統,包括ext2、ext3、vfat、ntfs、 iso9660、jffs、romfs和nfs等,為了對各類文件系統 進行統一管理,Linux引入了虛擬文件系統VFS(Virtual File System),為各類文件系統提供一個統一的操作界面和應用編程接口。
Linux啟動時,第一個必須掛載的是根文件系統;若系統不能從指定設備上掛載根文件系統,則系統會出錯而退出啟動。之后可以自動或手動掛載其他的文件系統。因此,一個系統中可以同時存在不同的文件系統。
1. 基于FLASH的文件系統
(1) Jffs2: 日志閃存文件系統版本2 (Journalling Flash FileSystem v2)
(2) yaffs:Yet Another Flash File System
(3) Cramfs:Compressed ROM File System
?? ?Cramfs映像通常是放在Flash中,但是也能放在別的文件系統里,使用loopback 設備可以把它安裝別的文件系統里。
(4) Romfs
傳統型的Romfs文件系統是一種簡單的、緊湊的、只讀的文件系統,不支持動態擦寫保存,按順序存放數據,因而支持應用程序以 XIP(eXecute In Place,片內運行)方式運行,在系統運行時,節省RAM空間。uClinux系統通常采用Romfs文件系統。
其他文件系統:fat/fat32也可用于實際嵌入式系統的擴展存儲器(例如PDA, Smartphone, 數碼相機等的SD卡),這主要是為了更好的與最流行的Windows桌面操作系統相兼容。ext2也可以作為嵌入式Linux的文件系統,不過將它用于 FLASH閃存會有諸多弊端。
2. 基于RAM的文件系統
(1) Ramdisk
?? ?Ramdisk是將一部分固定大小的內存當作分區來使用。它并非一個實際的文件系統,而是一種將實際的文件系統裝入內存的機制,并且可以作為根 文件系統。將一些經常被訪問而又不會更改的文件(如只讀的根文件系統)通過Ramdisk放在內存中,可以明顯地提高系統的性能。
?? ?在Linux的啟動階段,initrd提供了一套機制,可以將內核映像和根文件系統一起載入內存。
?? ?
?? ?(2)ramfs/tmpfs
Ramfs是Linus Torvalds開發的一種基于內存的文件系統,工作于虛擬文件系統(VFS)層,不能格式化,可以創建多個,在創建時可以指定其最大能使用的內存大小。
Ramfs/tmpfs文件系統把所有的文件都放在RAM中,所以讀/寫操作發生在RAM中,可以用ramfs/tmpfs來存儲一些臨時性或經常要修改的數據,例如/tmp和/var目錄,這樣既避免了對Flash存儲器的讀寫損耗,也提高了數據讀寫速度。
Ramfs/tmpfs相對于傳統的Ramdisk的不同之處主要在于:不能格式化,文件系統大小可隨所含文件內容大小變化。
Tmpfs的一個缺點是當系統重新引導時會丟失所有數據。
3. 網絡文件系統NFS (Network File System)
NFS是由Sun開發并發展起來的一項在不同機器、不同操作系統之間通過網絡共享文件的技術。在嵌入式Linux系統的開發調試階段,可以利用該技術在主機上建立基于NFS的根文件系統,掛載到嵌入式設備,可以很方便地修改根文件系統的內容。
以上討論的都是基于存儲設備的文件系統(memory-based file system),它們都可用作Linux的根文件系統。實際上,Linux還支持邏輯的或偽文件系統(logical or pseudo file system),例如procfs(proc文件系統),用于獲取系統信息,以及devfs(設備文件系統)和sysfs,用于維護設備文件。
不同的文件系統類型有不同的特點,因而根據存儲設備的硬件特性、系統 需求等有不同的應用場合。在嵌入式Linux應用中,主要的存儲設備為 RAM(DRAM, SDRAM)和ROM(常采用FLASH存儲器),常用的基于存儲設備的文件系統類型包括:jffs2, yaffs, cramfs, romfs, ramdisk, ramfs/tmpfs等。
?
轉載于:https://www.cnblogs.com/mylinux/p/5754716.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Cramfs、JFFS2、YAFFS2的全面对比的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MongoDB数据导入hbase +
- 下一篇: 正则表达式高级用法【原】