![关于 package-cleanup --orphans 和 --leaves 的 yum 混淆](https://linux22.com/image/186243/%E5%85%B3%E4%BA%8E%20package-cleanup%20--orphans%20%E5%92%8C%20--leaves%20%E7%9A%84%20yum%20%E6%B7%B7%E6%B7%86.png)
跟随时https://access.redhat.com/solutions/64069 修补之前和之后的系统状态的一般文档始终是良好的做法。这应该包括使用以下标志运行包清理:--orphans、--problems、--dupes、--leaves。
寻找孤儿(当前配置的存储库中不可用的软件包)我确实得到了kernel-3.10.0-1127.el7.x86_64
,这是真的,因为我已经安装了 CentOS 7.8 并升级到 7.9,并且内核软件包位于https://vault.centos.org/7.8.2003/os/Source/SPackages/回购不是 7.9。
[root@localhost boot]# package-cleanup --orphans
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: centos.wielun.net
* extras: centos.wielun.net
* updates: centos.wielun.net
kernel-3.10.0-1127.el7.x86_64
[root@localhost boot]# rpm -qa kernel
kernel-3.10.0-1160.6.1.el7.x86_64
kernel-3.10.0-1127.el7.x86_64
我可以想象,如果我想用来yum history undo
恢复上次所做的更改,并且给定的rpm
包必须在系统上可用,那么建议运行上述命令,但如果它没有被删除,yum update
那么我是否会这样做?真的需要关心包裹是否标记为orphaned
?
接下来,我执行以下命令来获取叶子列表(叶子节点是不被任何其他 RPM 依赖的 RPM):
[root@localhost boot]# package-cleanup --leaves
Loaded plugins: fastestmirror
libsysfs-2.1.0-16.el7.x86_64
[root@localhost boot]# rpm -q --requires libsysfs-2.1.0-16.el7.x86_64
/sbin/ldconfig
/sbin/ldconfig
libc.so.6()(64bit)
libc.so.6(GLIBC_2.2.5)(64bit)
libc.so.6(GLIBC_2.3.4)(64bit)
libc.so.6(GLIBC_2.4)(64bit)
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rtld(GNU_HASH)
rpmlib(PayloadIsXz) <= 5.2-1
[root@localhost boot]# rpm -q --provides libsysfs-2.1.0-16.el7.x86_64
libsysfs = 2.1.0-16.el7
libsysfs(x86-64) = 2.1.0-16.el7
libsysfs.so.2()(64bit)
我检查了rpm -q --provides
该软件包提供的功能libsysfs-2.1.0-16.el7.x86_64
,并列出了 3 项。
当我现在运行时,yum remove libsysfs-2.1.0-16.el7.x86_64
我得到以下信息:
[root@localhost boot]# yum remove libsysfs-2.1.0-16.el7.x86_64
Loaded plugins: changelog, fastestmirror
Resolving Dependencies
--> Running transaction check
---> Package libsysfs.x86_64 0:2.1.0-16.el7 will be erased
--> Finished Dependency Resolution
Dependencies Resolved
=============================================================================================================================================================================================
Package Arch Version Repository Size
=============================================================================================================================================================================================
Removing:
libsysfs x86_64 2.1.0-16.el7 @anaconda 146 k
Transaction Summary
=============================================================================================================================================================================================
Remove 1 Package
根据我的理解, yum 解决了所有依赖关系,看起来我可以随意删除软件包,但我想知道命令的输出rpm -q --provides
。是否正确地说,列出的 3 个项目是与软件包一起安装的内容libsysfs.x86_64 0:2.1.0-16.el7
,并且由于 yum 解决了所有依赖关系,并且系统上没有其他内容需要此软件包 + 它提供的软件包/共享库,因此可以毫无问题地删除它?
如果这是真的,为什么我无法列出作为该 rpm 一部分安装的文件?
[root@localhost boot]# rpm -qa libsysfs
libsysfs-2.1.0-16.el7.x86_64
[root@localhost boot]#
[root@localhost boot]#
[root@localhost boot]# rpm -qlp libsysfs-2.1.0-16.el7.x86_64
error: open of libsysfs-2.1.0-16.el7.x86_64 failed: No such file or directory
感谢您的任何澄清!
答案1
“我真的需要关心包裹是否被标记为孤儿吗?”不,只是意味着该包无法从您当前配置的任何存储库中获得。
引用自 RPM 指南:
在 RPM 术语中,每个包都提供功能。功能只是包声称它提供的一个文本字符串。在大多数情况下,功能会命名文件或包。但该功能可以是任意文本字符串。
查看我的系统(Fedora 33)上的输出rpm -q --provides libsysfs
,提供了三种功能:
# rpm -q --provides libsysfs
libsysfs = 2.1.0-30.fc33
libsysfs(x86-64) = 2.1.0-30.fc33
libsysfs.so.2()(64bit)
当您安装软件包时,可能会通过rpm
(或yum
或)检查这 3 种功能中的一项或多项。dnf
如果当前安装的软件包没有需要这 3 个功能中的任何一个,您可以删除该软件包而不会遇到依赖性错误。
继续,你的最后一个命令应该是rpm -ql libsysfs
.-p
表示查询已卸载的包 - 这需要提供包括扩展名的完整文件名,例如libsysfs-2.1.0-16.el7.x86_64.rpm
顺便说一句,您不需要键入yum remove libsysfs-2.1.0-16.el7.x86_64
即可删除此包。yum remove libsysfs
足够了。