Reinstalando pacotes com arquivos ausentes / corrompidos

17

Após um desligamento imundo e um fsck colorido, um monte de arquivos desapareceu. A saída do 'rpm -Va' tem várias centenas de linhas (principalmente arquivos ausentes, mas também alguma soma de verificação e outras incompatibilidades). Existe uma maneira fácil de reinstalar pacotes com arquivos ausentes e / ou corrompidos?

O sistema operacional em questão é o Fedora 22.

jaymmer - Restabelecer Monica
fonte
3
Certamente possível, mas também bastante tedioso para analisar a saída e, para cada arquivo, consulte o pacote que contém esse arquivo e provavelmente leva algum tempo. Por que não simplesmente reinstalar todos os pacotes? yum reinstall $(rpm -qa --qf="%{N}-%{V}\n" | sort)
Doktor5000
Também pode ser muito feio para filtrar todas as questões adicionais causadas por prelink, se não me engano que ainda está ativado por padrão no Fedora acordo com fedorahosted.org/fesco/ticket/1183
doktor5000
Eu, de fato, acabar reinstalar tudo - o problema era que eu tinha esquecido de permitir keep-cache para dnf, acabou de baixar mais de 2 GB de pacotes (e eu tampado internet)
jaymmer - Reintegrar Monica

Respostas:

16

Para fins de referência e integridade, um comando que seria capaz de alcançar o que inicialmente era pedido seria algo assim (rapidamente mexido juntos, mas está funcionando)

rpm -qf $(rpm -Va 2>&1 | grep -vE '^$|prelink:' | sed 's|.* /|/|') | sort -u

Aqui está uma breve explicação das várias partes:

rpm -Va 2>&1

Irá executar uma verificação completa em todos os pacotes atualmente instalados / listados no banco de dados rpm. Ele também redirecionará o stderr para o stdout, pois aqui na minha caixa alguns erros causados ​​pela ativação do pré-link são relatados como erros, mas nós os queremos no stdout.
Atenção: Precisa ser executado como root para poder verificar todos os arquivos, permissões e proprietário / grupo.

grep -vE '^$|prelink:'

suprime exibir de linhas emtpy e tais dos erros prelink (exemplo de tal erro:
prelink: /tmp/#prelink#.B14JBi: Recorded 10 dependencies, now seeing -1)

sed 's|.* /|/|')

filtrará a rpm -Vasaída para mostrar apenas os nomes de arquivos

rpm -qf $()

consultará todos os nomes de arquivos obtidos nos quais os pacotes estão contidos e exibirá o nome e a versão do pacote

| sort -u

suprimirá combinações duplicadas de nome / versão do pacote.

Ao todo, você receberá uma lista de pacotes que falharam na verificação.

rpm -Vaainda pode mostrar alguns problemas não relacionados, pois também verifica as dependências entre os pacotes, que talvez precisem ser suprimidos com a adição --nodeps.

doktor5000
fonte
2

Recentemente, tive um problema semelhante com a falta de arquivos no openSUSE 13.2 e o corrigi com:

rpm -Va --nodeps --nodigest --noscripts --nosignature --nofiledigest --nosize --nomode --nordev --nouser --nogroup --nomtime\
| awk -e '($1=="missing") && ($2=="d") {system("rpm -qf "$3);}; ($1=="missing") && ($2!="d") && ($2!="c") {system("rpm -qf "$2);}'\
| sort -u | xargs zypper in -f

As opções para rpm e a chamada para awk destinam-se a economizar tempo no meu caso, porque não ocorreu corrupção.

auxsvr
fonte
1
Se não houver corrupção de arquivo, você pode até adicionar --nofilese, portanto, basicamente fazer o mesmo, yum check dependenciespois verificará todos os pacotes rpm instalados quanto a problemas de dependência. --nofileseconomizaria muito tempo para instalações não-SSD, mas você também omitiria a verificação de arquivos ausentes. ... apenas por uma questão de perfeição. E lembre-se, se você pesquisar por cordas inglês, você pode querer prefixo com LC_ALL=C;)
doktor5000