Como se recuperar de um grande erro que quebra o yum

1

Eu estava tentando atualizar meu sistema CentOS 7 hoje e recebi um erro de python-urllib3. Eu rastreei o erro em um diretório que não deveria estar presente.

Então, fui remover o diretório ofensivo e inadvertidamente excluí o pai em vez disso. Neste caso, o pai era /usr/lib/python2.7/site-packages

Qualquer um que tenha trabalhado com o yum por tempo suficiente sabe que iria quebrar o yum, então ... O que fazer? A solução que eu criei está abaixo e trabalhei para consertar meu sistema.

Dependendo de quais modificações foram feitas em seu sistema, você pode ter que refazer algumas delas (configurações customizadas em / etc são sobrescritas por yum reinstalar), mas isso deve funcionar em 99% dos casos.

    
por Speeddymon 09.09.2018 / 02:58

1 resposta

2

Como o rpm não requer python (thank god), usamos o rpm para descobrir o nome completo de cada pacote que tenha python no nome ou que exija o pacote python básico.

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

Uma vez que você tenha a lista completa de pacotes, você precisa descobrir de onde eles são baixados.

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

Isso deve dar a você /etc/yum.repos.d/CentOS-Base.repo

Depois, você precisa visitar a página da lista de espelhos com seu navegador da Web

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

Deve haver 2 linhas. Você terá que fazer um pouco de modificação para eles (em um bloco de notas!) Antes de colá-lo no navegador:

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

Especificamente, você precisa alterar o release e o arco e excluir o infra.

O meu acabou ficando assim quando eu fui colá-lo.

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

Uma vez feito isso, eu pude acessar todos os pacotes que eu precisava combinando vários dos comandos acima juntos em 4 scripts de uma linha:

# 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))

Note que, se você copiar e colar os nomes dos pacotes dos comandos rpm acima em um arquivo de texto em sua distribuição, isso pode ser reduzido a duas linhas. Por exemplo, se você colocar os nomes dos pacotes em /tmp/packagedownload.txt, poderá fazer o seguinte, em vez do acima:

# 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

Uma vez que os arquivos rpm são baixados com wget, você pode simplesmente emitir o comando abaixo para consertar o sistema e obter o yum funcionando:

# rpm -ivh --force *.rpm

Então você pode consertar qualquer outro pacote que ainda possa estar quebrado (esperamos que nenhum seja), emitindo o seguinte:

# while read line; do xargs yum -y reinstall $line; done </tmp/packagedownload.txt
    
por 09.09.2018 / 03:00