13 个版本
新增 0.3.4 | 2024年8月17日 |
---|---|
0.3.3 | 2024年8月3日 |
0.3.2 | 2024年7月29日 |
0.2.3 | 2024年6月28日 |
0.1.3 | 2024年2月29日 |
#223 in Unix API
每月557次下载
275KB
6K SLoC
包监控器
[ lib.rs ] [ crates.io ] [ AUR ]
这是一个用于Debian/Ubuntu/...上的debsums
和Arch Linux及其衍生系统上的paccheck
的Rust替代品。由于并行使用所有CPU核心,它比这些工具快得多。(它也比pacman -Qkk
快得多,而paccheck
比它慢。)
它的工作是比较已安装文件与包管理器安装的内容,并报告任何差异。
- 在Arch Linux上,它会报告更改了模式、所有者、组、mtime、符号链接目标、文件内容(sha256)或缺失的文件。
- 在Debian上,它只会报告常规文件的内容是否不同。不幸的是,这是Debian上可用的唯一信息(md5sum)。
附加功能
- 有一个标志可以包含或排除“配置文件”(由包管理器标记为这样的文件,而不仅仅是
/etc
中的所有文件,正如人们可能认为的那样)。 - 在Arch Linux上,您可以通过传递
--trust-mtime
来跳过检查mtime匹配的文件的内容。这使得检查速度极快。 - 不依赖于任何特定于发行版的库来与包数据库交互。我们自行解析。这使得它可以更快(并行化!)并且还可以创建一个跨平台的二进制文件,该文件可以在任何发行版上运行,而不需要除libc之外的其他依赖。
- 您还可以使用此工具通过
paketkoll check-unexpected
查找未管理的文件(未由包管理器安装的文件),但这需要一些工作,因为有许多合法的未管理文件。您可能需要为您的系统找到一组合适的--ignore
标志。只有一些简单的忽略选项是内置的(/proc
、/sys
、/home
等。)。
注意事项
- 这不是debsums或paccheck的即插即用替代品,因为它们的命令行标志和输出格式不同。此外,debsums有一些额外的功能,例如过滤掉localepurge删除的文件。
- 与
paccheck
相比,它使用的内存要多得多(3倍)。这主要是由于内存和速度的权衡,尽管仍有改进的空间。 - paketkoll不会报告与
paccheck
完全相同的错误。例如,如果它发现大小不同,它将不会计算校验和,因为它们永远不会匹配。
基准测试
注意:CPU时间实际上与原始工具相当(总体上略好)。但由于并行性,wall时间要好得多,尤其是在不使用--trust-mtime
的情况下(这里的运行时间本身就相当小)。
- 所有运行都是在温暖的磁盘缓存上进行的。
- 使用了paccheck和debsums的发行版安装版本。
- 为了最佳的可移植性,整个系统都使用了Musl构建(使用交叉编译构建)。
- 使用了与在此二进制发布中使用的相同的构建标志(优化级别2,胖LTO)
Arch Linux (x64-64 AMD桌面)
- CPU:AMD Ryzen 5 5600X 6核心处理器(6核心,12线程)
- RAM:32 GB,2 DIMMs DDR4,3600 MHz
- 硬盘:NVME Gen4(WD Black SN850 1TB)
- 内核:6.7.5-arch1-1
pacman -Q | wc -l
指示已安装2211个软件包
仅检查文件属性并信任mtime(这些应该是最相似的选择)
$ hyperfine -i -N --warmup 1 "paketkoll --trust-mtime check" "paccheck --file-properties --quiet"
Benchmark 1: paketkoll --trust-mtime
Time (mean ± σ): 249.4 ms ± 4.8 ms [User: 1194.5 ms, System: 1216.2 ms]
Range (min … max): 242.1 ms … 259.7 ms 12 runs
Benchmark 2: paccheck --file-properties --quiet
Time (mean ± σ): 2.561 s ± 0.020 s [User: 1.504 s, System: 1.053 s]
Range (min … max): 2.527 s … 2.598 s 10 runs
Warning: Ignoring non-zero exit code.
Summary
paketkoll --trust-mtime ran
10.27 ± 0.21 times faster than paccheck --file-properties --quiet
当检查校验和时,速度提升并不那么令人印象深刻,但它仍然很大
$ hyperfine -i -N --warmup 1 "paketkoll check" "paccheck --sha256sum --quiet"
Benchmark 1: paketkoll
Time (mean ± σ): 9.986 s ± 1.329 s [User: 17.368 s, System: 19.087 s]
Range (min … max): 8.196 s … 11.872 s 10 runs
Benchmark 2: paccheck --sha256sum --quiet
Time (mean ± σ): 68.976 s ± 0.339 s [User: 16.661 s, System: 17.816 s]
Range (min … max): 68.413 s … 69.604 s 10 runs
Warning: Ignoring non-zero exit code.
Summary
paketkoll ran
6.91 ± 0.92 times faster than paccheck --sha256sum --quiet
- 安装了许多大型软件包
- 6核心,12线程意味着多线程可以带来相当大的速度提升。
- 我不知道paccheck为什么花费了68秒,但CPU使用率并不高。可能是等待I/O?
Debian (ARM64 Raspberry Pi)
- Raspberry Pi 5(8 GB RAM)
- CPU:Cortex-A76(4核心,4线程)
- 硬盘:通过USB 3.0外包装的SATA SSD启动USB:三星SSD 850 PRO 512GB
- 内核:6.1.0-rpi8-rpi-2712
dpkg-query -l | grep ii | wc -l
指示已安装749个软件包
$ hyperfine -i -N --warmup 1 "paketkoll check" "debsums -c"
Benchmark 1: paketkoll
Time (mean ± σ): 2.664 s ± 0.102 s [User: 3.937 s, System: 1.116 s]
Range (min … max): 2.543 s … 2.813 s 10 runs
Benchmark 2: debsums -c
Time (mean ± σ): 8.893 s ± 0.222 s [User: 5.453 s, System: 1.350 s]
Range (min … max): 8.637 s … 9.199 s 10 runs
Warning: Ignoring non-zero exit code.
Summary
'paketkoll' ran
3.34 ± 0.15 times faster than 'debsums -c'
- 此系统上安装的软件包并不多(它作为无头服务器运行)。这意味着这两个命令都不会特别慢。
- Pi也只有4个核心,这限制了可能的最大速度提升。
Ubuntu 22.04(x86-64英特尔笔记本电脑)
- CPU:12代英特尔(R)酷睿(TM) i9-12950HX(8个P核心和16个线程+ 8个E核心和8个线程)
- RAM:64 GB,2 DIMMs DDR4,3600 MHz
- 硬盘:NVME Gen4(WD SN810 2 TB)
- 内核:6.5.0-17-generic(HWE内核)
dpkg-query -l | grep ii | wc -l
指示已安装4012个软件包
$ hyperfine -i -N --warmup 1 "paketkoll check" "debsums -c"
Benchmark 1: paketkoll
Time (mean ± σ): 5.341 s ± 0.174 s [User: 42.553 s, System: 33.049 s]
Range (min … max): 5.082 s … 5.586 s 10 runs
Benchmark 2: debsums -c
Time (mean ± σ): 92.839 s ± 7.332 s [User: 47.664 s, System: 15.697 s]
Range (min … max): 82.872 s … 103.710 s 10 runs
Warning: Ignoring non-zero exit code.
Summary
paketkoll ran
17.38 ± 1.49 times faster than debsums -c
未来改进
大多数未来改进将发生在konfigkoll
crate中,使其适合我另一个项目想法(基本上那个项目需要将其作为库)。
我认为程序本身的主要变化将是错误修复和可能支持更多的Linux发行版和软件包管理器。
MSRV(最低支持的Rust版本)策略
MSRV可能根据需要提升。保证此程序至少可以在当前稳定Rust版本上构建。MSRV更改不被视为破坏性更改,因此即使在补丁版本中也可能更改。
这个名字是什么意思?
paketkoll是瑞典语“package check”的意思,尽管英文翻译并不完美(例如,“ha koll på”意为“keep an eye on”)。
依赖关系
~23–35MB
~661K SLoC