头图

// 本文转载自 LWN.net ,这是一个由读者支持的新闻网站,是当前 Linux 社区的权威媒体,致力于在 Linux 和自由软件开发社区中提供最好的报道。原文:LSF/MM/BPF 2023:EROFS 介绍及讨论 https://lwn.net/Articles/934047

近日,在 2023 Linux Storage, Filesystem, Memory-Management and BPF Summit 的文件系统会议上,龙蜥社区高性能存储 SIG 成员 Gao Xiang 介绍了增强型只读文件系统 (EROFS, Enhanced Read-Only File System)[1]。EROFS 文件系统在 2019 年正式引入到 Linux 5.4 中,作为 Android 和嵌入式设备的文件系统用于各大终端厂商中。目前它越来越不局限于原始目标场景,不断突破自身应用边界,辐射全栈业务场景。例如,基于 EROFS 的容器镜像方案(container image)有许多应用落地。

值得一提的是,龙蜥社区联合阿里云、蚂蚁集团和字节跳动等厂商首次将 EROFS 文件系统结合 Dragonfly Nydus 镜像加速运用在容器镜像场景中。龙蜥 ANCK 内核已支持 EROFS 文件系统,并针对下一代容器镜像项目 Nydus 做了大量优化,未来会辐射到更多云边端场景。

Gao Xiang 表示,EROFS 是一个基于块单位的只读文件系统,格式可以非常灵活的集成到 Composefs 或者 Nydus 中,这也有利于可重复性构建(reproducible builds)。过去内核只读文件系统诸多限制,例如,它们没法在非压缩和性能要求很高的场景下进一步提升效率,这是最初开发 EROFS 的原因之一。EROFS 存储(元)数据时是按 block 对齐的(block-aligned),这非常适合 page cache 相关的优化,这种对齐方式还可以结合 Direct I/O 和 DAX [2] 直接内存访问来进行数据访问,这极大的提高了 Linux 数据的访问效率。

(图/龙蜥社区高性能存储 SIG 成员 Gao Xiang 于LSF/MM/BPF 2023 峰会上介绍 EROFS)

SquashFS 是另一个只读文件系统,但它不会以 block-aligned 的方式存储其压缩数据,这会增加元数据的 I/O 开销。EROFS 会把数据压缩并对齐存储到文件系统的 block 中(注,EROFS块大小通常为4k,压缩单位 pcluster 可以是 4k 的整数倍),而 SquashFS 将原始数据按照固定大小(例如 128k)来压缩。另外,与EROFS不同,SquashFS 磁盘格式不允许目录随机访问,这意味着 SquashFS 总是需要对目录项进行线性搜索(linear search),运行效率相对受限。

使用文件系统来替换 tar 或 cpio 归档格式,也是 EROFS 的一个潜在用法,使用 EROFS 的外来不可信镜像(untrusted images) 挂载到主机相比 Ext4/XFS 也更安全。最近机密容器社区(CoCo)Azure 递交了内核 tarfs 文件系统提案[3],这允许 guest 虚拟机直接挂载增强后的 tar 文件。Gao Xiang 表示,在这种场景下, EROFS 或许是一个更好的选择。有一个概念验证性质的 patch set,允许使用 EROFS 直接 mount 人们下载的 tar 文件,这比将整个 tarball 解包到其他文件系统中(例如 ext4 文件系统)再将其挂载到 guest 中要好。

然而,以上这种方法仍然存在问题,比如使用相同 tar 文件的在不同虚拟机 guest 间不能进行 page cache 级别的共享。社区专家 Aleksa Sarai 同意这存在问题,但认为只要不用 tar 归档来作为底层格式就可以更加容易地解决这个问题,以及造成的一系列其他问题。他还说,EROFS 比现在方式要好,他认为还是需要把容器镜像中的 tar 格式替换掉。

目前有很多努力来优化镜像的布局,而这些努力仅仅是因为需要使用 tar 格式。“在我看来,这根本不合理,” Sarai 这样说。社区需要停止花费如此多的精力来解决 tar 格式带来的限制。系统上的 guest 中可能有 500 个 bash 实例,但它们不能以基于 tar 的格式共享相同的 inode,因此它们被视为不同的文件。但是 tar 格式还是需要继续得到支持,所以需要一个兼容的解决方案,Gao Xiang 表示。

Gao Xiang 继续介绍 EROFS 文件系统的功能,包括对文件数据 chunk-based 去重的能力,这块典型的用例是那些将 EROFS 与 Dragonfly image service (Nydus)[4] 结合在一起使用的系统。EROFS 可以有选择的分别对每个文件使用 LZ4 或者 LZMA 来进行压缩,以适应不同的数据访问模式,相比其他方案,EROFS 对较小的压缩单位进行了大量优化,使用较小的压缩单位可以减少 SquashFS 发生的内存放大(memory amplification)问题,压缩数据也可以在page cache 就地解压缩以减少额外的复制和内存分配。

EROFS 在压缩数据处理上,由于原始数据是字节粒度切片的,相比 Squashfs 和Btrfs、F2FS 等其他压缩文件系统,EROFS 文件系统在 Linux 6.1 实现了滚动哈希(rolling hash) 的内容定义的分块(content defined chunking)来支持压缩去重,这相比传统文件系统的对齐块去重在文本等数据集上有更明显的去重优势。

EROFS 的最新使用场景有三种基本形式。第一种是 EROFS 全镜像,它们可以以压缩形式使用,以牺牲某些性能为代价来节省空间,或者采用未压缩的方式在在具有 DAX 或 FS cache 特性的 guest/容器之间共享;第二种是仅有元数据的 EROFS 镜像,文件数据引用别的外部来源,例如 tar 存档或其他二进制格式;第三种是将 EROFS 与 overlayfs 配合使用,如之前讲到的 composefs 中所说的 [5]。

使用 EROFS 可能会提高机器学习数据集的访问性能,Gao Xiang 表示。这些数据集通常在单个目录中有数百万个小文件。训练过程需要读取整个目录并从列表中随机选择文件。由于 EROFS 布局很紧凑,它在这类负载中可能比 Ext4 快两倍。

会议快结束时,大家讨论了如何使用 clone-file-range ioctl() 操作对文件进行 overlayfs 的 copy_up [6] 操作。访问底层文件进行写入时需要执行 copy_up,文件在修改之前会被复制到更高层。如果这些层是来自同一文件系统的 loopback-mount 方式挂载的文件,则可以进行 copy-on-write 操作。社区专家 Amir Goldstein 似乎认为这样做是可行的,并且会很有用,但要实现这一目标还需要做一些工作。

(图/LSF/MM/BPF 2023 现场嘉宾合照)

[1]https://docs.kernel.org/filesystems/erofs.html

[2] https://www.kernel.org/doc/Documentation/filesystems/dax.txt

[3] https://github.com/confidential-containers/community/issues/66

[4]https://github.com/dragonflyoss/image-service

[5] https://lwn.net/Articles/933616/

[6]https://docs.kernel.org/filesystems/overlayfs.html#non-direct...

—— 完 ——


龙蜥社区
40 声望12 粉丝

OpenAnolis龙蜥社区由国内外头部企业联合建立的操作系统开源社区。