2020年11月27日 星期五

JFFS2

JFFS2 (Journalling Flash File System version 2) 是可寫壓縮的檔案系統,使用 LZMA 壓縮,支援日誌和 wear leveling。

名詞:erase block、page、node

log 架構的檔案系統:log 是有時間順序的紀錄。儲存裝置視為 circular log,將檔案寫入當作 log 寫入。
  • 按照儲存裝置空間循序寫入,可批次進行,不太需要 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,有較大的加速效果。

參考:
  1. http://www.sourceware.org/jffs2/
  2. YAFFS2
  3. UBIFS
  4. https://lirobo.blogspot.com/2019/11/memory-technology-device.html

沒有留言:

張貼留言

SIP header Via

所有 SIP 訊息 都要有 Via,縮寫 v。一開始的 UAC 和後續途經的每個 proxy 都會疊加一個 Via 放傳送的位址,依序作為回應的路徑。 格式 sent-protocol sent-by [ ;branch= branch ][ ; 參數 ...] s...