#rpm #server #info #extremely #parser #package #debuginfod

bin+lib debuginfod-rs

一个极快的 debuginfod 服务器,用 Rust 编写

1 个不稳定版本

0.1.0 2023 年 12 月 13 日

#28#rpm

MIT/Apache

2.5MB
432

debuginfod-rs

一个极快的 debuginfod 服务器,用 Rust 编写。

[2023-12-13T08:35:11.001Z INFO  debuginfod_rs] walking 173017 RPM files (477.8 GB)
[2023-12-13T08:35:12.389Z INFO  debuginfod_rs] parsing took: 2.09 s (228.8 GB/s)
  • ⚡️ 比elfutils的debuginfod快30倍(只解析RPM元数据)
  • 🧵 多线程解析器和Web服务器
  • 🦋 内存数据库(每1TB索引的RPM文件约为200MiB)
  • 📦 仅支持基于RPM(支持openSUSE和Fedora/RHEL软件包)
  • 🌐 支持完整的debuginfod Web API
  • 🗜 支持常用的压缩格式(bzip2,gzip,xz,zstd)

实现细节

索引器受益于由 rpmbuild 创建的符号链接,这些链接将每个ELF可执行文件(和共享库)及其相应的build-id路径链接起来。每个Web请求首先识别一个带有build-id的RPM文件,然后按需提取相应的ELF(或源)文件。对foo-debuginfofoo-debugsourcefoo软件包的分组基于源RPM文件(存在于RPM文件元数据中)。

索引速度高度依赖于磁盘速度,在现代AMD CPU上,可以高达~100 GB/s(对于缓存IO)。

已知限制

  • 缺少对RPM容器访问者的AsyncRead支持(内容在Web响应中读取到内存中)
  • 索引器没有实现elfutils对头文件请求的启发式方法,其中文件是build-id的一部分,但实际上存在于不同的RPM软件包中(例如,库的开发子软件包的头文件)
  • 缺少磁盘缓存
  • 缺少对其他容器如.deb的支持

示例用法

debuginfod demo example.

依赖关系

~27–59MB
~1M SLoC