收集程序包所需的所有RPM以制作自定义CentOS DVD

时间:2015-11-13 22:54:34

标签: dependencies rpm yum

我需要复制CentOS仓库中的所有RPM,这些RPM是为DVD构建自定义版CentOS所需的。

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

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

当我执行rpm -qpR时,它已关闭,但它列出的东西不是带路径名或包的文件。

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

套餐也很简单,因为它们是我需要的。

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

我正在考虑说任何依赖于“(”的内容,除了空'()'都可以跳过。这会有用吗?

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

我也得到依赖:     libc.so.6的()(64位)     libc.so.6的(GLIBC_2.14)(64位)     libc.so.6的(GLIBC_2.16)(64位)     libc.so.6的(GLIBC_2.2.5)(64位)     。 。

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

1 个答案:

答案 0 :(得分: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有版本需要考虑,仅仅匹配()并不一定能获得正确版本的库。