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