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 中的就地执行(XIP)。映射为读写(因此必须复制到 RAM)的数据段仍可以与未压缩的只读段一起在 cramfs 映像中的同一文件中进行压缩。支持 MMU 和无 MMU 系统。这对于具有非常严格的内存约束的微型嵌入式系统特别方便。
cramfs 映像在内存中的位置取决于系统。您必须知道 cramfs 映像所在的正确物理地址,并为其配置 MTD 设备。此外,该 MTD 设备必须由实现“point”方法的映射驱动程序支持。此类 MTD 驱动程序的示例有 cfi_cmdset_0001 (Intel/Sharp CFI 闪存) 或 physmap (物理内存映射中的闪存设备)。基于此类设备的 MTD 分区也可以。然后,应使用 “mtd:” 前缀指定该设备作为挂载设备参数。例如,要将名为 “fs_partition” 的 MTD 设备挂载到 /mnt 目录
$ mount -t cramfs mtd:fs_partition /mnt
要使用此作为根文件系统启动内核,只需在内核命令行上指定类似 “root=mtd:fs_partition” 的内容即可。
工具¶
可以在此处找到一个可以利用上述最新功能的 mkcramfs 版本
黑客说明¶
有关文件系统布局和实现说明,请参阅 fs/cramfs/README。