Python

如何從破壞 yum 的重大錯誤中恢復

  • September 11, 2018

今晚我試圖更新我的 CentOS 7 系統,但一直收到來自 python-urllib3 的錯誤。我將錯誤追踪到一個不應該存在的目錄。

所以,我去刪除了有問題的目錄,並無意中刪除了父目錄。在這種情況下,父級是 /usr/lib/python2.7/site-packages

任何與 yum 合作了足夠長的時間的人都知道這會破壞 yum,所以… 該怎麼辦?我想出的解決方案如下,並努力修復我的系統。

根據對您的系統所做的修改,您可能需要重新做一些修改(/etc 中的自定義配置被 yum reinstall 覆蓋)但這應該適用於 99% 的情況。

由於 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

具體需要修改release和arch,刪除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

引用自:https://unix.stackexchange.com/questions/467796