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。