Como reconstruo um arquivo de status do dpkg corrompido?

26

Sempre que digito sudo apt-get removee, em seguida, pressiono a Tabtecla para preenchimento automático, recebo a seguinte mensagem:

grep-status: /var/lib/dpkg/status:15945: expected a colon
.

Não vejo nada de especialmente estranho na linha 15945 no arquivo de status. É um caractere de ponto no campo de descrição de um pacote de biblioteca mono e a inserção de dois pontos não ajudou. A remoção da linha que contém o ponto também não funcionou. A substituição do arquivo com status antigo resultou na mesma mensagem.

Existe alguma maneira de reconstruir o arquivo de status?

Ramon
fonte
3
Eu não acho que você pode reconstruir completamente o statusarquivo: é uma fonte primária de informações e, embora muitas sejam redundantes, nem todas são. No entanto, provavelmente é possível reparar o arquivo manualmente. Poste um pedaço do arquivo na linha problemática, digamos 20 a 40 linhas, incluindo pelo menos uma Package:linha antes e depois da linha 15945.
Gilles 'SO- deixa de ser mau'
Desde então, tentei desinstalar o mono, mas tudo o que fiz foi alterar o número da linha que é relatada como um erro. Se você seguir o link colar, o número da linha incorreta
Ramón
@ Ramón Então, apt-get, dpkge amigos ainda funcionam corretamente, e que está erroring fora é auto-realização?
Riccardo Murri
Corrigir. Parece haver apenas problemas ao analisar o arquivo de status ao usar o preenchimento automático. Caso contrário, posso instalar e remover pacotes sem erros aparentes.
Ramón
Obtendo o mesmo problema. Eu não acho que usar cegamente uma versão antiga do banco de dados do apt seja a coisa certa a fazer aqui, independentemente de corrigir esse problema.
Oli

Respostas:

7

Finalmente consertei meu sistema disso. A restauração de um backup do arquivo de status não funcionou, pois há muito tempo o problema está em todos os meus backups.

A correção envolve grepping para as quebras de formatação reais e corrigi-las manualmente. Não é tão difícil quanto parece.

http://thepcspy.com/read/fixing-dpkg-status-corruption/

Oli
fonte
Que bom que você encontrou uma solução, Oli e obrigado por compartilhar. No meu caso, além da problemática deb da Lexmark, uma deb Webmin também teve sua descrição malformada, mas nesse caso não causou nenhum problema de análise ao executar um preenchimento automático. Esquisito.
Ramón
3
@Oli você é o titular da licença? Você pode escrever isso aqui?
Braiam
Isso é verdade, bom que eu li o seu post. Eu tinha um missing package namee descobri que, por algum motivo estranho, é melhor eu não perder meu tempo descobrindo, eu tinha uma linha Packaga: landscape-commonque foi corrigida ortograficamente e bam, problema resolvido. O problema é que nunca toquei esse arquivo, nem mais ninguém. Como um computador pode atrapalhar com um erro de ortografia?
Severo Raz
A resposta real também deve estar aqui, para evitar que seja uma resposta apenas de link [se o erro for de uma linha em branco que não preceda "Pacote:" e adicione um .a essa linha em branco].
Xen2050 27/09/18
20

Você deve poder trabalhar com um arquivo de bom estado anterior e atualizar a partir daí. Toda vez que você faz uma instalação ou atualização, o arquivo de status é salvo em um backup compactado em gzip em / var / backups . Executar um ls -l dpkg * no diretório mostra:

-rw-r--r-- 1 root root   2266732 2010-09-30 08:35 dpkg.status.0
-rw-r--r-- 1 root root    624182 2010-09-29 08:49 dpkg.status.1.gz
-rw-r--r-- 1 root root    623844 2010-09-28 08:55 dpkg.status.2.gz
-rw-r--r-- 1 root root    620358 2010-09-24 11:04 dpkg.status.3.gz
-rw-r--r-- 1 root root    619021 2010-09-23 15:34 dpkg.status.4.gz
-rw-r--r-- 1 root root    619013 2010-09-23 08:03 dpkg.status.5.gz
-rw-r--r-- 1 root root    618968 2010-09-21 08:33 dpkg.status.6.gz

Há também um backup do arquivo criado no diretório / var / lib / dpkg / chamado status-old. Executar um status ls -l * no diretório mostra:

-rw-r--r-- 1 root root 2266732 2010-09-30 08:35 status
-rw-r--r-- 1 root root 2267191 2010-09-30 08:35 status-old

Portanto, para se recuperar de uma corrupção, você deve fazer o seguinte:

1. Faça um backup do arquivo de status corrompido :

mv /var/lib/dpkg/status /var/lib/dpkg/status_bkup

2. Copie um arquivo de status recente do dpkg no lugar de qualquer uma das fontes acima:

ou

cp /var/lib/dpkg/status-old /var/lib/dpkg/status

ou

cp /var/backups/dpkg.status.#.gz /var/lib/dpkg/
gunzip -d /var/lib/dpkg/dpkg.status.#.gz 
mv /var/lib/dpkg/dpkg.status.# /var/lib/dpkg/status

3. Em seguida, execute o apt-get update:

sudo apt-get update

Isso deve resolver.

Jim
fonte
2
Eu não sabia sobre os arquivos de status mantidos em / var / backups. Esta é uma boa informação para ter, caso aconteça novamente. Obrigado Jim.
Ramón
Mas é seguro usar uma versão antiga? Quero dizer, certamente não é apenas o preenchimento automático que usa esse arquivo, e usar uma versão antiga com informações de pacotes mais antigos estragará outras coisas muito mais importantes ... como o próprio apt.
Oli
@ Oli não tenho certeza. Eu só tive que fazer isso uma vez. Acho que tive que reinstalar o aplicativo que estava causando o problema, mas, daqui para frente, funcionou. Como todos os conselhos na Internet (ou pelo menos os meus conselhos na Internet), isso funcionou para mim. Isso não significa que necessariamente funcionará para você. Eu o ofereço sem garantia e sem conhecimento expresso de como ele se comportará no seu sistema. Sua milhagem pode variar. Tente por sua conta e risco.
Jim
Esta solução parece ter corrigido meus problemas. Atualizarei se surgirem problemas ao usar um arquivo de status antigo.
Matthew Matthew
No arquivo antigo, podem estar faltando algumas alterações no pacote que foram feitas no sistema, mas na maioria das vezes tudo ficará bem. O procedimento sudo apt update && sudo apt dist-upgradedeve corrigir a maioria dos problemas que esse statusarquivo antigo pode causar. Se o seu sistema tiver uma bagunça maior, em sudo aptitude dist-upgradevez de sudo apt ...sugerir algumas vezes maneiras melhores de corrigir a falha.
Mikko Rantalainen
6

Consegui corrigir esse problema removendo os pacotes que tinham entradas corrompidas no arquivo de status.

sudo dpkg -r handbrake-cli

A solução aceita via pcregrep não funcionou (o pcregrep não encontrou nada).

lacuna
fonte
Muito obrigado, funciona para mim e, de fato, é a abordagem certa. Obrigado #
user2671192
6

Tente um "dpkg -P" para o pacote incorreto. Isso o limpará do repositório local, removendo todos os rastreamentos. No meu sistema, essa foi a correção para os pacotes removidos (mas ainda não eliminados) que produziram esse erro.

normalmente
fonte
5

Nesse caso, eu fazia o backup do /var/lib/dpkg/statusarquivo corrompido e o corrigia manualmente (nas linhas 1888 e 9550) usando as informações de

apt-cache show libssl0.9.8
apt-cache show udev
organizar
fonte
Entendi . O apt-get agora está funcionando sem problemas.
ændrük
3

Este foi um erro (supostamente corrigido): Erro no Launchpad 613018

Upstream: Bug Debian 590885

Essa deve ser uma solução alternativa (backup, sequência de versões de "correção"):

cp /var/lib/dpkg/status ~/dpkg-status.back
sudo sed -i "s/56127_Ubuntu_karmic/56127Ubuntukarmic/" /var/lib/dpkg/status
htorque
fonte
2

Filho de uma...

Ok, o erro real estava na linha 15266, apesar de ter sido relatado cerca de 700 linhas mais abaixo. A entrada problemática no arquivo de status foi causada por uma deb que eu instalei para que minha impressora Lexmark funcionasse há muito tempo. A entrada era para o pacote lexmark-inkjet-08-driver. O campo Descrição não possui um .no lugar de uma quebra de linha. Isso causou o erro de análise.

Para descobrir isso, recorri a um método de solução de problemas de espingarda e comecei a tentar as coisas aleatoriamente. Uma das minhas tentativas grep-status -P ebobas foi descobrir que e era a letra mais comum do alfabeto. Burro, eu sei, mas o último registro de status impresso antes de queixar-se de dois pontos ausentes era para o pacote lexmark e notei a falta de um .personagem depois de alguns minutos olhando para a tela.

Se possível, gostaria de outra resposta que pudesse descrever um método melhor para encontrar esse tipo de problema, caso alguém se deparar com um problema semelhante no futuro. Obrigado.

Ramon
fonte
grep-status -r -P ^deve sempre corresponder a qualquer pacote para analisar o arquivo inteiro e abortar se não puder analisá-lo.
Mikko Rantalainen
2

Como meu status antigo era muito problemático mesmo com apt-get update,

Isso funcionou muito bem para mim:

(como raiz)

cd /var/lib/dpkg 

cp -avf status status.corrupt

tr -cd '\11\12\15\40-\176' < status.corrupt > status

Este comando usa os argumentos -c e -d no comando tr para remover todos os caracteres do fluxo de entrada, exceto os valores octais ASCII que são mostrados entre aspas simples. Este comando permite especificamente que os seguintes caracteres passem por esse filtro Unix:

octal 11: tab

octal 12: avanço de linha

octal 15: retorno de carro

octal 40 a octal 176: todos os caracteres "bons" do teclado

Todos os outros caracteres binários - os caracteres "lixo" no seu arquivo - são removidos durante esse processo de tradução.

CREDITO: http://alvinalexander.com/blog/post/linux-unix/how-remove-non-printable-ascii-characters-file-unix

Se você está curioso para saber o que mudou ou onde estaria o dano: (possivelmente longo)

diff /var/lib/dpkg/{status-old,status} |less
Marcos
fonte