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 在 压缩 中排名
每月 394 次下载
59KB
1.5K SLoC
3cpio
3cpio 是一个用于管理 Linux 内核 initramfs cpio 文件的工具。Linux 内核的 initramfs 缓冲区格式 基于新的 newc
或 crc
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秒 |
图例:
- 由initramfs-tools生成
- 由
dracut --force --${compression}
生成。在Raspberry Pi Zero 2W上,默认的zstd -15
内存不足。因此使用initramfs-tools的默认值:dracut --force --compress "zstd -1 -q -T0"
- 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 cpio和libarchive提供的bsdcpio
之外,还是第三个cpio工具。3cpio也是除了initramfs-tools中的lsinitramfs
和dracut中的lsinitrd
之外,第三个可以列出initramfs cpio存档内容的工具。
依赖关系
~115KB