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 版本
Hacker 笔记¶
有关文件系统布局和实现说明,请参见 fs/cramfs/README。