오늘 밤 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가 제공됩니다.
그런 다음 웹 브라우저를 사용하여 미러 목록 페이지에 액세스해야 합니다.
# 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