如何从破坏 yum 的重大错误中恢复过来

如何从破坏 yum 的重大错误中恢复过来

今晚我试图更新我的 CentOS 7 系统,但一直收到来自 python-urllib3 的错误。我将错误跟踪到一个不应该存在的目录。

因此,我删除了有问题的目录,并无意中删除了父目录。在本例中,父级是 /usr/lib/python2.7/site-packages

任何使用 yum 足够长时间的人都知道这会破坏 yum,所以...该怎么办?我想出的解决方案如下,并致力于修复我的系统。

根据对系统所做的修改,您可能需要重新执行其中一些操作(/etc 中的自定义配置会被 yum reinstall 覆盖),但这应该适用于 99% 的情况。

答案1

由于 rpm 不需要 python(感谢上帝),因此我们使用 rpm 来查找名称中包含 python 或需要基本 python 包的每个包的全名。

# rpm -qa |grep -i python |sort
# rpm -q --whatrequires python |sort

获得完整的软件包列表后,您需要找出 yum 从哪里下载它们。

# grep -i '\[base\]' /etc/yum.repos.d/*

这应该给你 /etc/yum.repos.d/CentOS-Base.repo

然后,您需要使用网络浏览器访问镜像列表页面

# egrep 'mirrorlist.*=(os|updates)' /etc/yum.repos.d/CentOS-Base.repo

应该有 2 行。在将其粘贴到浏览器之前,您必须对它们进行一点点修改(在记事本中!):

mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra

具体来说,您需要更改版本和架构,并删除基础设施。

当我去粘贴它时,我的最终看起来像这样。

http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=updates
http://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os

完成后,我可以通过将上面的几个命令组合成 4 个单行脚本来获取我需要的所有包:

# while read line; do wget http://yum.tamu.edu/centos/7.5.1804/updates/x86_64/Packages/${line}.rpm; done < <(while read line; do rpm -ql ${line} |grep -iq /usr/lib/python2.7/site-packages; if [ $? -eq 0 ]; then echo ${line}; fi; done < <(rpm -q --whatrequires python |sort))
# while read line; do wget http://yum.tamu.edu/centos/7.5.1804/os/x86_64/Packages/${line}.rpm; done < <(while read line; do rpm -ql ${line} |grep -iq /usr/lib/python2.7/site-packages; if [ $? -eq 0 ]; then echo ${line}; fi; done < <(rpm -q --whatrequires python |sort))
# while read line; do wget http://yum.tamu.edu/centos/7.5.1804/updates/x86_64/Packages/${line}.rpm; done < <(while read line; do rpm -ql ${line} |grep -iq /usr/lib/python2.7/site-packages; if [ $? -eq 0 ]; then echo ${line}; fi; done < <(rpm -qa |grep -i python |sort))
# while read line; do wget http://yum.tamu.edu/centos/7.5.1804/os/x86_64/Packages/${line}.rpm; done < <(while read line; do rpm -ql ${line} |grep -iq /usr/lib/python2.7/site-packages; if [ $? -eq 0 ]; then echo ${line}; fi; done < <(rpm -qa |grep -i python |sort))

请注意,如果将上述 rpm 命令中的包名称复制并粘贴到发行版上的文本文件中,则可以将其减少到 2 行。例如,如果将包名称放入 /tmp/packagedownload.txt,则可以执行以下操作,而不是执行上述操作:

# while read line; do wget http://yum.tamu.edu/centos/7.5.1804/updates/x86_64/Packages/${line}.rpm; done </tmp/packagedownload.txt
# while read line; do wget http://yum.tamu.edu/centos/7.5.1804/os/x86_64/Packages/${line}.rpm; done </tmp/packagedownload.txt

一旦使用 wget 下载了 rpm 文件,您就可以简单地发出以下命令来修复系统并让 yum 正常工作:

# rpm -ivh --force *.rpm

然后,您可以通过发出以下命令来修复可能仍然损坏的任何其他软件包(希望没有损坏):

# while read line; do xargs yum -y reinstall $line; done </tmp/packagedownload.txt

相关内容