Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

3.4. 检查 RPM 健全性

创建软件包后,检查软件包的质量。

检查软件包质量的主要工具是 rpmlint

rpmlint 工具执行以下操作:

  • 提高 RPM 可维护性.
  • 通过对 RPM 进行静态分析来启用完整性检查。
  • 通过对 RPM 进行静态分析来启用错误检查。

rpmlint 工具可以检查二进制 RPM、源 RPM (SRPMs)和 SPEC 文件,因此它对打包的所有阶段都很有用,如下例所示。

请注意,rpmlint 有非常严格的准则,因此有时可以接受跳过其中的一些错误和警告,如下例所示。

注意

在以下示例中,rpmlint 在没有任何选项的情况下运行,这会产生一个非详细的输出。如需了解每个错误或警告的详细说明,您可以运行 rpmlint -i

3.4.1. 检查 bello for sanity

本节介绍在检查 bello SPEC 文件示例和 bello 二进制 RPM 时可能发生的警告和错误。

3.4.1.1. 检查 bello SPEC 文件

例 3.2. 在适用于 bello 的 SPEC 文件中运行 rpmlint 命令的输出

$ rpmlint bello.spec
bello.spec: W: invalid-url Source0: https://www.example.com/bello/releases/bello-0.1.tar.gz HTTP Error 404: Not Found
0 packages and 1 specfiles checked; 0 errors, 1 warnings.

对于 bello.spec,只有一个警告,表示 Source0 指令中列出的 URL 不可访问。这是正常的,因为指定的 example.com URL 不存在。假设我们预期此 URL 在未来工作,我们可以忽略这个警告。

例 3.3. 在 SRPM forllo 上运行 rpmlint 命令的输出

$ rpmlint ~/rpmbuild/SRPMS/bello-0.1-1.el8.src.rpm
bello.src: W: invalid-url URL: https://www.example.com/bello HTTP Error 404: Not Found
bello.src: W: invalid-url Source0: https://www.example.com/bello/releases/bello-0.1.tar.gz HTTP Error 404: Not Found
1 packages and 0 specfiles checked; 0 errors, 2 warnings.

对于 bello SRPM,有一个新的警告,表示 URL 指令中指定的 URL 不可访问。假设链接将在以后工作,我们可以忽略此警告。

3.4.1.2. 检查 bello 二进制 RPM

在检查二进制 RPM 时,rpmlint 会检查以下项目:

  • Documentation
  • man page
  • 致地使用文件系统层次结构标准

例 3.4. 在 bello 的二进制 RPM 上运行 rpmlint 命令的输出

$ rpmlint ~/rpmbuild/RPMS/noarch/bello-0.1-1.el8.noarch.rpm
bello.noarch: W: invalid-url URL: https://www.example.com/bello HTTP Error 404: Not Found
bello.noarch: W: no-documentation
bello.noarch: W: no-manual-page-for-binary bello
1 packages and 0 specfiles checked; 0 errors, 3 warnings.

no-documentationno-manual-page-for-binary 警告表示 RPM 没有文档或手册页,因为我们没有提供任何文档或手册页。除以上警告外,RPM 会传递 rpmlint 检查。

3.4.2. 检查 pello for sanity

本节显示在 pello SPEC 文件和 pello 二进制 RPM 示例中检查 RPM 健全时可能出现的警告和错误。

3.4.2.1. 检查 pello SPEC 文件

例 3.5. 在 pello 的 SPEC 文件中运行 rpmlint 命令的输出

$ rpmlint pello.spec
pello.spec:30: E: hardcoded-library-path in %{buildroot}/usr/lib/%{name}
pello.spec:34: E: hardcoded-library-path in /usr/lib/%{name}/%{name}.pyc
pello.spec:39: E: hardcoded-library-path in %{buildroot}/usr/lib/%{name}/
pello.spec:43: E: hardcoded-library-path in /usr/lib/%{name}/
pello.spec:45: E: hardcoded-library-path in /usr/lib/%{name}/%{name}.py*
pello.spec: W: invalid-url Source0: https://www.example.com/pello/releases/pello-0.1.2.tar.gz HTTP Error 404: Not Found
0 packages and 1 specfiles checked; 5 errors, 1 warnings.

invalid-url Source0 警告表示 Source0 指令中列出的 URL 不可访问。这是正常的,因为指定的 example.com URL 不存在。假设此 URL 将在以后正常工作,您可以忽略这个警告。

hardcoded-library-path 错误建议,使用 %{_libdir} 宏而不是使用硬编码的库路径。在本例中,可以安全地忽略这些错误。但是,对于将它们进行生产而言,请确保仔细检查所有错误。

例 3.6. 在 SRPM for pello 上运行 rpmlint 命令的输出

$ rpmlint ~/rpmbuild/SRPMS/pello-0.1.2-1.el8.src.rpm
pello.src: W: invalid-url URL: https://www.example.com/pello HTTP Error 404: Not Found
pello.src:30: E: hardcoded-library-path in %{buildroot}/usr/lib/%{name}
pello.src:34: E: hardcoded-library-path in /usr/lib/%{name}/%{name}.pyc
pello.src:39: E: hardcoded-library-path in %{buildroot}/usr/lib/%{name}/
pello.src:43: E: hardcoded-library-path in /usr/lib/%{name}/
pello.src:45: E: hardcoded-library-path in /usr/lib/%{name}/%{name}.py*
pello.src: W: invalid-url Source0: https://www.example.com/pello/releases/pello-0.1.2.tar.gz HTTP Error 404: Not Found
1 packages and 0 specfiles checked; 5 errors, 2 warnings.

此处新的 invalid-url URL 错误是关于 URL 指令的,它无法被访问。假设该 URL 将在以后有效,您可以安全地忽略此错误。

3.4.2.2. 检查 pello 二进制 RPM

在检查二进制 RPM 时,rpmlint 会检查以下项目:

  • Documentation
  • man page
  • 致地使用文件系统层次结构标准

例 3.7. 在 pello 二进制 RPM 上运行 rpmlint 命令的输出

$ rpmlint ~/rpmbuild/RPMS/noarch/pello-0.1.2-1.el8.noarch.rpm
pello.noarch: W: invalid-url URL: https://www.example.com/pello HTTP Error 404: Not Found
pello.noarch: W: only-non-binary-in-usr-lib
pello.noarch: W: no-documentation
pello.noarch: E: non-executable-script /usr/lib/pello/pello.py 0644L /usr/bin/env
pello.noarch: W: no-manual-page-for-binary pello
1 packages and 0 specfiles checked; 1 errors, 4 warnings.

no-documentationno-manual-page-for-binary 警告表示他 RPM 没有文档或 man page,因为没有提供任何文档。

only-non-binary-in-usr-lib 警告表示您在 /usr/lib/ 中只提供了非二进制工件。该目录通常为共享对象文件保留,它们是二进制文件。因此,rpmlint 预期 /usr/lib/ 目录中的至少一个或者多个文件是二进制的。

这是 rpmlint 检查的一个示例,它是否符合文件系统层次结构标准。通常,使用 RPM 宏来确保文件正确放置。在本例中,可以安全地忽略这个警告。

non-executable-script 错误警告 /usr/lib/pello/pello.py 文件没有执行权限。rpmlint 工具预期文件可以执行,因为文件包含 shebang。在本例中,您可以保留此文件而不具有执行权限,并忽略此错误。

除以上警告和错误外,RPM 传递 rpmlint 检查。

3.4.3. 检查完整性的单元格

本节显示在 pello SPEC 文件和 cello 二进制 RPM 示例中检查 RPM 健全时可能出现的警告和错误。

3.4.3.1. 检查 cello SPEC 文件

例 3.8. 在 SPEC 文件中为 cello 运行 rpmlint 命令的输出

$ rpmlint ~/rpmbuild/SPECS/cello.spec
/home/<username>/rpmbuild/SPECS/cello.spec: W: invalid-url Source0: https://www.example.com/cello/releases/cello-1.0.tar.gz HTTP Error 404: Not Found
0 packages and 1 specfiles checked; 0 errors, 1 warnings.

对于 cello.spec,只有一个警告,表示 Source0 指令中列出的 URL 不可访问。这是正常的,因为指定的 example.com URL 不存在。假设此 URL 将在以后正常工作,您可以忽略这个警告。

例 3.9. 在 SRPM for cello 上运行 rpmlint 命令的输出

$ rpmlint ~/rpmbuild/SRPMS/cello-1.0-1.el8.src.rpm
cello.src: W: invalid-url URL: https://www.example.com/cello HTTP Error 404: Not Found
cello.src: W: invalid-url Source0: https://www.example.com/cello/releases/cello-1.0.tar.gz HTTP Error 404: Not Found
1 packages and 0 specfiles checked; 0 errors, 2 warnings.

对于 cello SRPM,有一个新的警告,表示 URL 指令中指定的 URL 不可访问。假设链接将在以后工作,您可以忽略此警告。

3.4.3.2. 检查 cello 二进制 RPM

在检查二进制 RPM 时,rpmlint 会检查以下项目:

  • Documentation
  • man page
  • 致地使用文件系统层次结构标准

例 3.10. 在用于 cello 的二进制 RPM 上运行 rpmlint 命令的输出

$ rpmlint ~/rpmbuild/RPMS/x86_64/cello-1.0-1.el8.x86_64.rpm
cello.x86_64: W: invalid-url URL: https://www.example.com/cello HTTP Error 404: Not Found
cello.x86_64: W: no-documentation
cello.x86_64: W: no-manual-page-for-binary cello
1 packages and 0 specfiles checked; 0 errors, 3 warnings.

no-documentationno-manual-page-for-binary 警告表示他 RPM 没有文档或 man page,因为您没有提供任何信息。除以上警告外,RPM 会传递 rpmlint 检查。