Cramfs - 將檔案系統壓縮到小型 ROM 中

cramfs 設計得簡單、小巧,並且能夠很好地壓縮檔案。

它使用 zlib 例程一次壓縮一個檔案頁,並允許隨機頁面訪問。 元資料未壓縮,但以非常簡潔的表示形式表示,使其使用的磁碟空間比傳統檔案系統少得多。

您無法寫入 cramfs 檔案系統(使其可壓縮和緊湊也使得在執行時更新 _非常_ 困難),因此您必須使用“mkcramfs”實用程式建立磁碟映像。

使用說明

檔案大小限制為小於 16MB。

最大檔案系統大小略高於 256MB。 (允許檔案系統上的最後一個檔案超過 256MB。)

僅儲存 gid 的低 8 位。 當前版本的 mkcramfs 只是截斷為 8 位,這是一個潛在的安全問題。

支援硬連結,但硬連結檔案在 cramfs 映像中仍將具有 1 的連結計數。

Cramfs 目錄沒有 ... 條目。 目錄(像 cramfs 上的每個其他檔案一樣)始終具有 1 的連結計數。(無需在 find 中使用 -noleaf,順便說一句。)

Cramfs 中未儲存時間戳,因此這些預設設定為 epoch(1970 GMT)。 最近訪問的檔案可能已更新時間戳,但更新僅持續到 inode 快取在記憶體中的時間,之後時間戳將恢復為 1970,即及時倒退。

目前,必須使用相同位元組序的架構來寫入和讀取 cramfs,並且只能由 PAGE_SIZE == 4096 的核心讀取。至少後一個是錯誤,但尚未確定最佳修復方法。 目前,如果您有更大的頁面,您可以更改 mkcramfs.c 中的 #define,只要您不介意檔案系統將來對核心不可讀即可。

記憶體對映 cramfs 映像

CRAMFS_MTD Kconfig 選項增加了直接從物理線性記憶體範圍(通常是非易失性記憶體,如快閃記憶體)載入資料而不是透過塊裝置層載入資料的支援。 這節省了一些記憶體,因為在解壓縮之前不需要中間緩衝來儲存資料。

當資料塊保持未壓縮並正確對齊時,它們將在可能的情況下自動直接對映到使用者空間,從而提供只讀段的 ROM 內 eXecute-In-Place (XIP)。 對映讀寫的段(因此必須複製到 RAM)仍然可以與未壓縮的只讀段一起在同一檔案中以壓縮形式存在於 cramfs 映像中。 支援 MMU 和無 MMU 系統。 這對於記憶體非常緊張的小型嵌入式系統特別方便。

cramfs 映像在記憶體中的位置取決於系統。 您必須知道 cramfs 映像所在的正確物理地址,併為其配置 MTD 裝置。 此外,該 MTD 裝置必須由實現“point”方法的對映驅動程式支援。 此類 MTD 驅動程式的示例包括 cfi_cmdset_0001 (Intel/Sharp CFI flash) 或 physmap (物理記憶體對映中的快閃記憶體裝置)。 基於此類裝置的 MTD 分割槽也可以。 然後,應使用“mtd:”字首作為掛載裝置引數指定該裝置。 例如,要在 /mnt 目錄上掛載名為“fs_partition”的 MTD 裝置

$ mount -t cramfs mtd:fs_partition /mnt

要使用此作為根檔案系統啟動核心,只需在核心命令列上指定類似“root=mtd:fs_partition”的內容即可。

工具

可以在此處找到可以利用上述最新功能的 mkcramfs 版本

https://github.com/npitre/cramfs-tools

對於 /usr/share/magic

0

ulelong 0x28cd3d45

Linux cramfs offset 0

>4

ulelong x

size %d

>8

ulelong x

flags 0x%x

>12

ulelong x

future 0x%x

>16

string >0

signature “%.16s”

>32

ulelong x

fsid.crc 0x%x

>36

ulelong x

fsid.edition %d

>40

ulelong x

fsid.blocks %d

>44

ulelong x

fsid.files %d

>48

string >0

name “%.16s”

512

ulelong 0x28cd3d45

Linux cramfs offset 512

>516

ulelong x

size %d

>520

ulelong x

flags 0x%x

>524

ulelong x

future 0x%x

>528

string >0

signature “%.16s”

>544

ulelong x

fsid.crc 0x%x

>548

ulelong x

fsid.edition %d

>552

ulelong x

fsid.blocks %d

>556

ulelong x

fsid.files %d

>560

string >0

name “%.16s”

Hacker 筆記

有關檔案系統佈局和實現說明,請參見 fs/cramfs/README。