JFFS2 (Journalling Flash File System version 2) 是可寫壓縮的檔案系統,使用 LZMA 壓縮,支援日誌和 wear leveling。
名詞:erase block、page、node
- 按照儲存裝置空間循序寫入,可批次進行,不太需要 seek,寫入效率變好。
- 對「寫入」最佳化。例如大記憶體時「讀取」可很快從 memory cache 滿足,而「寫入」需要實際存入儲存裝置,反而變成瓶頸。
- 適合 append 方式的儲存裝置。
- 方便同個檔案建立多個不同時間的版本。
- 方便從 crash 恢復,採用最後 consistent 版本,不用分析 data structures 細節。
- 自動 wear leveling
- garbage collection:舊 log reclaim free。
傳統硬碟 seek 是相對較慢的,所以檔案系統傾向於將檔案放在鄰近處 (spatial locality) 並就地修改,而有不同設計理念。
write-through caching
為了跳過壞的 eraseblock,寫入 jffs2 影像檔不是用 cp jffs2.img /dev/mtd2,而是用 flash_eraseall 後再 nandwrite。另外,讀取影像檔是用 nandread。
一開始為 NOR Flash 開發的 log-structured 檔案系統。Flash 寫之前需要抹除,抹除有下列限制:抹除很慢、抹除單位區塊很大、抹除有次數限制。JFFS 強制 wear levelling,將 flash device 視為 circular log,所有檔案和目錄的改變都寫到 the tail of the log in nodes。每個 node,包含 metadata 的 header 先寫入,再來才是檔案資料。在 header 的 offset pointer 可將 node 串起來。node 一開始是 valid,建立新版本後變成 obsolete。The free space remaining in the file system is the gap between the log's tail and its head. When this runs low, a garbage collector copies valid nodes from the head to the tail and skips obsolete ones, thus reclaiming space.
對 flash 的運用
從每個 erase block 開頭開始運用,正常 free space 都在後面。中間如果有 free space 只是浪費,不會造成問題。JFFS2 寫 node 到 flash 不會跨 erase block。可能是用錯誤的 erase block size 產生 JFFS2 image 造成的。erase block 預設是 64KiB,用過小 eraseblock 產生的 image 是無害的。
/proc/mtd
Erase Block Summary (EBS):加速掛載速度。儲存摘要資訊在每個 erase block 結束的地方,稱為 JFFS2_FEATURE_RWCOMPAT_DELETE 的 node,掛載食指需要讀取這部份,不需要 scan 每個 nodes (及讀取所有 page)。摘要資訊的 node 稱為 JFFS2_FEATURE_RWCOMPAT_DELETE,在寫入時啟用 EBS 時自動產生,但 mkfs.jffs2 產生的影像檔需要用 sumtool 插入摘要資訊。較大的 erase block,如 NAND,有較大的加速效果。
參考:
沒有留言:
張貼留言