Skip to content
Search RHEL

This page uses Chinese content. Search opens the Chinese documentation.

    Browse this documentation

    RHEL 10 包清单导出:rpm 与 dnf 的口径差

    This content is not available in your language yet.

    做资产审计/漏洞比对时,第一件事是“把已装包导出来”。RHEL 10 上 rpm 与 dnf 都能导,但口径不同:同一台机器,rpm -qa 534 行、dnf repoquery --installed 531 行。差在哪、该用哪个,本页说清。

    在 PVE 390 rhel10-lab(RHEL 10.2 x86_64)上实际执行:

    Terminal window
    rpm -qa | wc -l
    dnf -q repoquery --installed | wc -l
    rpm -qa --qf '%{NAME}\n' | sort -u | wc -l
    dnf -q repoquery --installed --qf '%{name}\n' | sort -u | wc -l
    rpm -qa --qf '%{NAME}\n' | sort -u > /tmp/rpm-n.txt
    dnf -q repoquery --installed --qf '%{name}\n' | sort -u > /tmp/dnf-n.txt
    diff /tmp/rpm-n.txt /tmp/dnf-n.txt

    E3 记录:plans/content-expansion/evidence/rhel/rhel-package-manifest/run.json(9 步,含每步输出 sha256)。

    口径结果说明
    rpm -qa534含 gpg-pubkey 伪包,按安装条目计数
    dnf repoquery --installed531只列 DNF 能识别的已装包
    按包名去重532 / 532rpm 与 dnf 去重后一致

    diff 的差异只有两处:rpm 侧多出 gpg-pubkey,dnf 侧多一个空行。不要把 534 vs 531 当成“dnf 漏了 3 个包”——先按包名去重,再看差异。

    Terminal window
    rpm -qa --qf '%{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n' \
    | sort > /tmp/rpm-manifest.txt
    wc -l /tmp/rpm-manifest.txt # 534
    sha256sum /tmp/rpm-manifest.txt # 656d0bae…

    这份清单适合做离线基线:一行一个 NEVRA,排序稳定,可比对两次构建/两台机器。要 CSV:

    Terminal window
    rpm -qa --qf '%{NAME},%{VERSION},%{RELEASE},%{ARCH}\n' | sort > /tmp/rpm-manifest.csv
    Terminal window
    dnf -q repoquery --installed \
    --qf '%{name},%{evr},%{arch},%{sourcerpm}' | head -3
    # NetworkManager,1:1.56.0-1.el10,x86_64,NetworkManager-1.56.0-1.el10.src.rpm

    sourcerpm 字段把二进制包映射到源包,做 CVE 比对时通常以 source RPM 为单位,避免同一源包多个子包重复计数。

    $ dnf -q list available '*sbom*'
    Error: No matching Packages to list

    RHEL 10 的基础仓库里没有名为 sbom 的包。这不等于“RHEL 没有 SBOM 能力”——可以用 rpm/dnf 导出清单、结合 sourcerpm 自己生成,或使用第三方/红帽其他产品;但不要把“装个 sbom 包”当成默认路径。

    • 先声明口径:按包名、NEVRA 还是 source RPM;
    • 用 sort -u 去重,避免 multilib 重复;
    • 把 gpg-pubkey 这类伪包单独排除或标注;
    • 记录清单的 sha256 与生成时间;
    • CVE 比对用 sourcerpm 聚合;
    • 两台机器比对时,先统一 RHEL minor 与仓库集。
    • 未测试 dnf repoquery --installed 对非仓库安装包(rpm -i 本地包)的覆盖差异;
    • 未测试 multilib 同包多架构的完整差异;
    • 未测试第三方 SBOM 工具(syft、tern 等)在 RHEL 10 上的输出;
    • 未测试 dnf repoquery --latest-limit 与历史版本比对。