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

Download history 1/week @ 2024-05-20 2/week @ 2024-06-03 316/week @ 2024-06-24 48/week @ 2024-07-01 217/week @ 2024-07-22 312/week @ 2024-07-29 28/week @ 2024-08-05

每月557次下载

MPL-2.0 许可证

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

未来改进

大多数未来改进将发生在konfigkollcrate中,使其适合我另一个项目想法(基本上那个项目需要将其作为库)。

我认为程序本身的主要变化将是错误修复和可能支持更多的Linux发行版和软件包管理器。

MSRV(最低支持的Rust版本)策略

MSRV可能根据需要提升。保证此程序至少可以在当前稳定Rust版本上构建。MSRV更改不被视为破坏性更改,因此即使在补丁版本中也可能更改。

这个名字是什么意思?

paketkoll是瑞典语“package check”的意思,尽管英文翻译并不完美(例如,“ha koll på”意为“keep an eye on”)。

依赖关系

~23–35MB
~661K SLoC