5 个不稳定版本

新版本 0.3.2 2024 年 8 月 19 日
0.3.1 2024 年 8 月 6 日
0.3.0 2024 年 8 月 3 日
0.2.0 2024 年 7 月 4 日
0.1.0 2024 年 4 月 18 日

104压缩 中排名

Download history 119/week @ 2024-07-04 2/week @ 2024-07-11 245/week @ 2024-08-01 18/week @ 2024-08-08 131/week @ 2024-08-15

每月 394 次下载

ISC 许可证

59KB
1.5K SLoC

3cpio

3cpio 是一个用于管理 Linux 内核 initramfs cpio 文件的工具。Linux 内核的 initramfs 缓冲区格式 基于新的 newccrc cpio 格式。可以连接多个 cpio 归档,最后一个归档可以压缩。根据 Linux 内核中编译的支持,可以使用不同的压缩算法。3cpio 定制于 initramfs cpio 文件,不会支持其他 cpio 格式。

目前,3cpio 支持检查、列出和提取 initramfs cpio 的内容。

注意:Rust 包名为 threecpio,因为包名不允许以数字开头。

使用示例

检查 Ubuntu 24.04 系统上的 initramfs cpio 内容

$ 3cpio --examine /boot/initrd.img
0	cpio
77312	cpio
7286272	cpio
85523968	zstd

此 initramfs cpio 包含三个未压缩的 cpio 归档,后面跟着一个 Zstandard 压缩的 cpio 归档。

列出 Ubuntu 24.04 系统上的 initramfs cpio 内容

$ 3cpio --list /boot/initrd.img
.
kernel
kernel/x86
kernel/x86/microcode
kernel/x86/microcode/AuthenticAMD.bin
kernel
kernel/x86
kernel/x86/microcode
kernel/x86/microcode/.enuineIntel.align.0123456789abc
kernel/x86/microcode/GenuineIntel.bin
.
usr
usr/lib
usr/lib/firmware
usr/lib/firmware/3com
usr/lib/firmware/3com/typhoon.bin.zst
[...]

第一个 cpio 只包含 AMD 微代码。第二个 cpio 只包含 Intel 微代码。第三个 cpio 包含固件文件和内核模块。

将 Ubuntu 24.04 系统上的 initramfs cpio 内容提取到 initrd 子目录

$ 3cpio --extract -C initrd /boot/initrd.img
$ ls initrd
bin   cryptroot  init    lib    lib.usr-is-merged  run   scripts  var
conf  etc        kernel  lib64  libx32             sbin  usr

基准测试结果

列出 initrd 的内容

使用 time 在不同的 initramfs cpio 上进行五次运行时间比较

系统 内核 压缩 大小 文件 3cpio lsinitramfs lsinitrd
Ryzen 7 5700G 6.5.0-27-generic zstd¹ 102 MB 3496 0.052s 14.243s –³
Ryzen 7 5700G VM 6.8.0-22-generic zstd¹ 63 MB 1934 0.042s 7.239s –³
Ryzen 7 5700G VM 6.8.0-22-generic zstd² 53 MB 1783 0.061s 0.452s 0.560s
RasPi Zero 2W 6.5.0-1012-raspi zstd¹ 24 MB 1538 0.647s 56.253s –³
RasPi Zero 2W 6.5.0-1012-raspi zstd² 30 MB 2028 1.141s 2.286s 6.118s
RasPi Zero 2W 6.8.0-1002-raspi zstd¹ 51 MB 2532 0.713s 164.575s –³
RasPi Zero 2W 6.8.0-1002-raspi zstd -1² 47 MB 2778 1.156秒 2.842秒 9.508秒
RasPi Zero 2W 6.8.0-1002-raspi xz² 41 MB 2778 6.922秒 13.451秒 35.184秒

图例:

  1. 由initramfs-tools生成
  2. dracut --force --${compression}生成。在Raspberry Pi Zero 2W上,默认的zstd -15内存不足。因此使用initramfs-tools的默认值:dracut --force --compress "zstd -1 -q -T0"
  3. lsinitrd只读取文件的前两个cpio存档,但initramfs由四个cpio组成。

结果:

  • 对于由initramfs-tools生成的镜像,3cpio比lsinitramfs快87到274倍。
  • 对于由dracut生成的镜像,3cpio比lsinitramfs快两到八倍。
  • 对于由dracut生成的镜像,3cpio比lsinitrd快五到九倍。

使用的命令

3cpio -t /boot/initrd.img-${version} | wc -l
time 3cpio -t /boot/initrd.img-${version} > /dev/null
time lsinitramfs /boot/initrd.img-${version} > /dev/null
time lsinitrd /boot/initrd.img-${version} > /dev/null

在Raspberry Pi Zero 2W上列出未压缩的单个cpio存档的内容(有关详细信息,请参阅doc/Benchmarks.md

命令 平均值[毫秒] 最小值[毫秒] 最大值[毫秒] 相对
3cpio-t initrd.img 84.3 ± 1.1 82.1 87.0 1.00
bsdcpio-itF initrd.img 98.4 ± 0.9 96.4 101.0 1.17 ± 0.02
cpio-t--file initrd.img 1321.2 ± 2.8 1314.6 1327.6 15.68 ± 0.20
命令 平均值[毫秒] 最小值[毫秒] 最大值[毫秒] 相对
3cpio-tv initrd.img 109.2 ± 1.1 106.9 111.7 1.00
bsdcpio-itvF initrd.img 114.9 ± 1.1 112.6 117.4 1.05 ± 0.01
cpio-tv--file initrd.img 1423.0 ± 3.5 1417.1 1440.6 13.03 ± 0.13

提取initrd的内容

测量提取initrd的时间

系统 发行版 内核 大小 文件 3cpio unmkinitramfs
Ryzen 7 5700G noble 6.8.0-35-generic 70 MB 2097 0.107秒 6.698秒
Ryzen 7 5700G jammy 6.8.0-35-generic 112 MB 3789 0.455秒 2.217秒
Ryzen 7 5700G bookworm 6.1.0-21-amd64 62 MB 2935 0.268秒 1.362秒
RasPi Zero 2W noble 6.8.0-1005-raspi 53 MB 2534 5.075秒 173.847秒

原始测量数据可在doc/Benchmarks.md中找到。

命名和替代品

工具被命名为3cpio,因为它除了GNU cpiolibarchive提供的bsdcpio之外,还是第三个cpio工具。3cpio也是除了initramfs-tools中的lsinitramfsdracut中的lsinitrd之外,第三个可以列出initramfs cpio存档内容的工具。

依赖关系

~115KB