【问题标题】:Collect all RPMs that are needed by a package to make a custom CentOS DVD收集软件包所需的所有 RPM 以制作自定义 CentOS DVD
【发布时间】:2016-02-15 15:26:44
【问题描述】:

我需要从 CentOS 存储库中复制所有需要为 DVD 构建 CentOS 的自定义版本的 RPM。

基本上我需要我的自定义 RPM 所需软件包的完整列表,以便我可以将它们复制到我正在构建的 ISO 映像中。

我这里有一个自定义 RPM,它不在 repo 中,所以我不能使用 yum deplist。

当我执行 rpm -qpR 时,它很接近,但它列出的东西不是带有路径名或包的文件。

文件很简单,因为我可以循环使用 repoquery --qf='%{name}' -f file-name

包也很简单,因为它们正是我所需要的。

但是我从 rpm -qpR 获得依赖项,例如 config(alsa-lib) 和 rtld(GNU_HASH),它们既不是包也不是文件也不是库。

我正在考虑只说任何带有“(”的依赖项,但可以跳过空的“()”。这可行吗?

我会使用 repoquery 来获取包的空 '()' ,因为它将是一个库。

我还得到如下依赖项: libc.so.6()(64bit) libc.so.6(GLIBC_2.14)(64bit) libc.so.6(GLIBC_2.16)(64bit) libc.so.6(GLIBC_2.2.5)(64bit) . . .

许多不同版本的 GLIBC。我正在考虑从我的仓库安装最新的,因为 glibc 显示为一个包。这安全吗?

【问题讨论】:

  • 你最好在 Unix 和 Linux StackExchange(或类似的)上问这个问题,因为这不是一个真正的编程问题。
  • rpm的话题,这个群比USE更受关注。

标签: dependencies rpm yum


【解决方案1】:

提出了几个问题(您可以考虑重构您的问题)。以下是一些答案:

  • repoquery 可能对部署您的应用程序很有用,但对于分析所需的 RPM 集没有多大用处。对于您正在使用它,给定文件的普通“rpm -qf”将识别包名称,并更快地完成。
  • manpage for rpm 是一个很好的起点。它具有-R 选项:列出此包所依赖的功能。
  • rpm 也有--whatprovides查询所有提供 CAPABILITY 能力的包。.

很大程度上,您的问题似乎忽略了能力。这些可能是特定文件,或者它们可能是引用包和/或其内容的其他方式的名称。例如,这个:

$ rpm -qR `rpm -qf vi`
config(vim-minimal) = 2:7.4.629-5.el6
libacl.so.1()(64bit)  
libacl.so.1(ACL_1.0)(64bit)  
libc.so.6()(64bit)  
libc.so.6(GLIBC_2.11)(64bit)  
libc.so.6(GLIBC_2.2.5)(64bit)  
libc.so.6(GLIBC_2.3)(64bit)  
libc.so.6(GLIBC_2.3.4)(64bit)  
libc.so.6(GLIBC_2.4)(64bit)  
libselinux.so.1()(64bit)  
libtinfo.so.5()(64bit)  
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(VersionedDependencies) <= 3.0.3-1
rtld(GNU_HASH)  
rpmlib(PayloadIsXz) <= 5.2-1

这些行是能力,例如,

$ rpm -q --whatprovides 'libtinfo.so.5()(64bit)'
ncurses-libs-5.7-4.20090207.el6.x86_64

要完成您的任务,您应该递归地遵循这些功能,直到您到达(并且可能忽略)基本系统中的包。一些包提供多种功能:

$ rpm -q --whatprovides 'config(vim-minimal) = 2:7.4.629-5.el6'
no package provides config(vim-minimal) = 2:7.4.629-5.el6
$ rpm -q --whatprovides 'libacl.so.1()(64bit)'
libacl-2.2.49-6.el6.x86_64
$ rpm -q --whatprovides 'libacl.so.1(ACL_1.0)(64bit)'
libacl-2.2.49-6.el6.x86_64
$ rpm -q --whatprovides 'libc.so.6()(64bit)'
glibc-2.12-1.166.el6_7.3.x86_64
$ rpm -q --whatprovides 'libc.so.6(GLIBC_2.11)(64bit)'
glibc-2.12-1.166.el6_7.3.x86_64 
$ rpm -q --whatprovides 'libc.so.6(GLIBC_2.2.5)(64bit)'
glibc-2.12-1.166.el6_7.3.x86_64
$ rpm -q --whatprovides 'libc.so.6(GLIBC_2.3)(64bit)'
glibc-2.12-1.166.el6_7.3.x86_64       
$ rpm -q --whatprovides 'libc.so.6(GLIBC_2.3.4)(64bit)'
glibc-2.12-1.166.el6_7.3.x86_64
$ rpm -q --whatprovides 'libc.so.6(GLIBC_2.4)(64bit)'
glibc-2.12-1.166.el6_7.3.x86_64
$ rpm -q --whatprovides 'libselinux.so.1()(64bit)'
libselinux-2.0.94-5.8.el6.x86_64
$ rpm -q --whatprovides 'libtinfo.so.5()(64bit)'
ncurses-libs-5.7-4.20090207.el6.x86_64
$ rpm -q --whatprovides 'rpmlib(CompressedFileNames) <= 3.0.4-1'
no package provides rpmlib(CompressedFileNames) <= 3.0.4-1                      
$ rpm -q --whatprovides 'rpmlib(FileDigests) <= 4.6.0-1'
no package provides rpmlib(FileDigests) <= 4.6.0-1
$ rpm -q --whatprovides 'rpmlib(PayloadFilesHavePrefix) <= 4.0-1'
no package provides rpmlib(PayloadFilesHavePrefix) <= 4.0-1
$ rpm -q --whatprovides 'rpmlib(VersionedDependencies) <= 3.0.3-1'
no package provides rpmlib(VersionedDependencies) <= 3.0.3-1
$ rpm -q --whatprovides 'rtld(GNU_HASH)'
glibc-2.12-1.166.el6_7.3.x86_64
$ rpm -q --whatprovides 'rpmlib(PayloadIsXz) <= 5.2-1'
no package provides rpmlib(PayloadIsXz) <= 5.2-1

“无包提供”提示此选项未解决的特殊情况。例如,参见Re: rpmlib(VersionedDependencies) <= 3.0.3-1 中讨论的rpmlib 的情况,其中说rpm --showrc 提供了信息。 (vim-minimal 警告是另一种特殊情况——您将在它们出现时处理它和其他警告)。

无需安装 RPM 即可找到它提供的功能。您可以使用 --provides 选项来做到这一点,例如,

rpm -qp --provides your-package-name.rpm

并且(如您之前提到的)使用-R 选项来查看给定包需要什么

rpm -qpR your-package-name.rpm

查看我为ncurses-examples 构建的包,这两个命令给了我

$ rpm -qp  --provides ncurses-examples-6.0-20151107.x86_64.rpm 
ncurses-examples = 6.0-20151107
ncurses-examples(x86-64) = 6.0-20151107

$ rpm -qpR ncurses-examples-6.0-20151107.x86_64.rpm
libc.so.6()(64bit)
libc.so.6(GLIBC_2.2.5)(64bit)
libc.so.6(GLIBC_2.3)(64bit)
libformw6.so.6()(64bit)
libformw6.so.6(NCURSESW6_5.1.20000708)(64bit)
libformw6.so.6(NCURSESW6_5.9.20150530)(64bit)
libm.so.6()(64bit)
libm.so.6(GLIBC_2.2.5)(64bit)
libmenuw6.so.6()(64bit)
libmenuw6.so.6(NCURSESW6_5.1.20000708)(64bit)
libncursesw6.so.6()(64bit)
libncursesw6.so.6(NCURSESW6_5.1.20000708)(64bit)
libncursesw6.so.6(NCURSESW6_5.3.20021019)(64bit)
libncursesw6.so.6(NCURSESW6_5.4.20040208)(64bit)
libncursesw6.so.6(NCURSESW6_5.7.20081102)(64bit)
libpanelw6.so.6()(64bit)
libpanelw6.so.6(NCURSESW6_5.1.20000708)(64bit)
libtinfow6.so.6()(64bit)
libtinfow6.so.6(NCURSES6_TINFO_5.0.19991023)(64bit)
libtinfow6.so.6(NCURSES6_TINFO_5.1.20000708)(64bit)
libtinfow6.so.6(NCURSES6_TINFO_5.4.20040208)(64bit)
libtinfow6.so.6(NCURSES6_TINFO_5.7.20081102)(64bit)
libtinfow6.so.6(NCURSES6_TINFO_5.9.20150530)(64bit)
libutil.so.1()(64bit)
libutil.so.1(GLIBC_2.2.5)(64bit)
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(PayloadIsXz) <= 5.2-1
rtld(GNU_HASH)

与 libc6 一样,ncurses6 ABI 需要考虑版本,仅匹配 () 不一定会获得正确版本的库。

【讨论】:

  • 感谢 Thomas 的想法和对功能的额外解释。不幸的是,我不能使用 rpm -qf 或 --whatprovides,因为它们不在我的自定义仓库中。我什至可能在不同于我用来构建 ISO 的版本的 Linux 版本上运行我的 ISO 构建脚本。我想知道发行版在构建 ISO 时会做什么。他们也需要解决这个问题。也许他们在机器/VM 上安装版本并使用 rpm,但安装东西以找出依赖项似乎应该是不必要且缓慢的。
  • 如果您在/etc/yum.repos.d 中有一个“.repo”文件指向您的本地存储库,yum 可以做到这一点。它依赖于通过 Web 服务进行连接。从createrepo 命令开始。
  • 是的,我在 /etc/yum.repos.d 中有一个 repo 文件。例如,我用我的 repoquery 命令来引用它。但是我的仓库中没有自定义 RPM。自定义 RPM 仅适用于 DVD ISO。
猜你喜欢
  • 2020-03-20
  • 2017-01-06
  • 2012-11-15
  • 2017-08-15
  • 2013-10-01
  • 2012-05-11
  • 2012-06-20
  • 2014-11-30
  • 1970-01-01
相关资源
最近更新 更多