私は今夜CentOS 7システムを更新しようとしましたが、python-urllib3でエラーが発生しました。存在してはいけないディレクトリのエラーを追跡しました。
そのため、問題のあるディレクトリを削除し、誤って親ディレクトリを削除しました。この例では、親は/usr/lib/python2.7/site-packagesです。
yumを長く使ってみた人なら、これがyumを壊すことを知っているはずです。それでは…どうすればいいですか?私が思いついた解決策は次のとおりであり、システムを修正する作業を進めました。
システムの変更によっては、これらの操作の一部をやり直す必要があります(/ etcのカスタム設定はyumの再インストールで上書きされます)、99%の場合には機能します。
答え1
rpmはPythonを必要としないので(ありがとう)、名前にpythonがあるか、デフォルトのPythonパッケージが必要なすべてのパッケージのフルネームを見つけるためにrpmを使用します。
# 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が提供されます。
その後、Webブラウザを使用してミラーリストページにアクセスする必要があります。
# 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つの1行スクリプトにまとめて、必要なすべてのパッケージを入手できます。
# 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