UBI 檔案系統¶
簡介¶
UBIFS 檔案系統代表 UBI 檔案系統。UBI 代表 “Unsorted Block Images”(未排序塊映象)。UBIFS 是一種快閃記憶體檔案系統,這意味著它被設計為與快閃記憶體裝置一起工作。重要的是要理解,UBIFS 與 Linux 中任何傳統的檔案系統(如 Ext2、XFS、JFS 等)完全不同。UBIFS 代表著一個獨立的檔案系統類別,它與 MTD 裝置而不是塊裝置一起工作。此類的另一個 Linux 檔案系統是 JFFS2。
為了更清楚地說明,這裡有一個 MTD 裝置和塊裝置的簡短比較。
- 1 MTD 裝置代表快閃記憶體裝置,它們由大小相當大的擦除塊組成,通常約為 128KiB。塊裝置由小塊組成,通常為 512 位元組。
2 MTD 裝置支援 3 個主要操作 - 從擦除塊內的某個偏移量讀取,寫入到擦除塊內的某個偏移量,以及擦除整個擦除塊。塊裝置支援 2 個主要操作 - 讀取整個塊和寫入整個塊。
- 3 必須擦除整個擦除塊,然後才能重新寫入其內容。塊可以被簡單地重新寫入。
4 擦除塊在一定數量的擦除週期後會磨損 - 對於 SLC NAND 和 NOR 快閃記憶體,通常為 100K-1G,對於 MLC NAND 快閃記憶體,通常為 1K-10K。塊沒有磨損特性。
- 5 擦除塊可能會變壞(僅在 NAND 快閃記憶體上),軟體應該處理這個問題。硬碟上的塊通常不會變壞,因為硬體具有替換壞塊的機制,至少在現代 LBA 磁碟中是這樣。
應該很明顯為什麼 UBIFS 與傳統檔案系統非常不同。
- 4. 擦除塊在經過一定數量的擦除週期後會磨損 -
通常對於 SLC NAND 和 NOR 快閃記憶體,磨損週期為 10 萬到 10 億次,對於 MLC NAND 快閃記憶體,磨損週期為 1 千到 1 萬次。塊不具有磨損屬性。
- 5. 擦除塊可能會變壞(僅在 NAND 快閃記憶體上),軟體應該
處理這種情況。 硬碟驅動器上的塊通常不會變壞,因為硬體有機制來替換壞塊,至少在現代 LBA 磁碟中是這樣。
UBIFS 在 UBI 之上工作。UBI 是一個獨立的軟體層,可以在 drivers/mtd/ubi 中找到。UBI 基本上是一個卷管理和磨損均衡層。它提供所謂的 UBI 卷,這是一個比 MTD 裝置更高層次的抽象。UBI 裝置的程式設計模型與 MTD 裝置非常相似 - 它們仍然由大的擦除塊組成,它們具有讀取/寫入/擦除操作,但 UBI 裝置沒有磨損和壞塊的限制(上述列表中的第 4 項和第 5 項)。
從某種意義上說,UBIFS 是下一代的 JFFS2 檔案系統,但它與 JFFS2 非常不同且不相容。以下是主要區別。
JFFS2 在 MTD 裝置之上工作,UBIFS 依賴於 UBI 並在 UBI 卷之上工作。
JFFS2 沒有在介質上的索引,並且必須在掛載時構建它,這需要完整的介質掃描。UBIFS 在快閃記憶體介質上維護 FS 索引資訊,不需要完整的介質掃描,因此它的掛載速度比 JFFS2 快很多倍。
JFFS2 是一個寫透檔案系統,而 UBIFS 支援寫回,這使得 UBIFS 在寫入時快得多。
與 JFFS2 類似,UBIFS 支援即時壓縮,這使得可以將大量資料放入快閃記憶體。
與 JFFS2 類似,UBIFS 可以容忍不乾淨的重啟和斷電。它不需要像 fsck.ext2 這樣的東西。UBIFS 會自動重放其日誌並從崩潰中恢復,確保快閃記憶體上的資料結構是一致的。
UBIFS 以對數方式縮放(它使用的大多數資料結構都是樹),因此掛載時間和記憶體消耗不線性依賴於快閃記憶體大小,就像 JFFS2 的情況一樣。這是因為 UBIFS 在快閃記憶體介質上維護 FS 索引。但是,UBIFS 依賴於 UBI,而 UBI 以線性方式縮放。因此,總體而言,UBI/UBIFS 堆疊以線性方式縮放。然而,UBI/UBIFS 的縮放效果明顯優於 JFFS2。
UBIFS 的作者認為,可以開發 UBI2,它也可以以對數方式縮放。UBI2 將支援與 UBI 相同的 API,但它將與 UBI 二進位制不相容。因此,UBIFS 不需要更改即可使用 UBI2。
掛載選項¶
(*) == 預設。
bulk_read
一次讀取更多內容,以利用順序讀取速度更快的快閃記憶體介質 |
no_bulk_read (*) |
不批次讀取 |
no_chk_data_crc (*) |
跳過對資料節點上的 CRC 的檢查,以提高讀取效能。僅當快閃記憶體介質高度可靠時才使用此選項。此選項的效果是檔案內容損壞可能會被忽略。 |
chk_data_crc |
不要跳過對資料節點上的 CRC 的檢查 |
compr=none |
覆蓋預設的壓縮器並將其設定為 “none” |
compr=lzo |
覆蓋預設的壓縮器並將其設定為 “lzo” |
compr=zlib |
覆蓋預設的壓縮器並將其設定為 “zlib” |
auth_key= |
指定用於驗證檔案系統的金鑰。傳遞此選項會使身份驗證成為強制性的。傳遞的金鑰必須存在於核心金鑰環中,並且必須是 ‘logon’ 型別 |
auth_hash_name= |
用於身份驗證的雜湊演算法。用於雜湊和建立 HMAC。典型值包括“sha256”或“sha512” |
快速使用說明¶ |
要掛載的 UBI 卷使用 “ubiX_Y” 或 “ubiX:NAME” 語法指定,其中 “X” 是 UBI 裝置號,“Y” 是 UBI 卷號,“NAME” 是 UBI 卷名。
將 UBI 裝置 0 上的卷 0 掛載到 /mnt/ubifs
將 UBI 裝置 0 的 “rootfs” 卷掛載到 /mnt/ubifs(“rootfs” 是卷名)
$ mount -t ubifs ubi0_0 /mnt/ubifs
以下是將 mtd0 附加到 UBI 並掛載卷 “rootfs” 的核心引導引數示例:ubi.mtd=0 root=ubi0:rootfs rootfstype=ubifs
$ mount -t ubifs ubi0:rootfs /mnt/ubifs
參考文獻¶
MTD 網站上的 UBIFS 文件和 FAQ/HOWTO
http://www.linux-mtd.infradead.org/doc/ubifs.html