Como recriar um arquivo de status do dpkg corrompido?

24

Sempre que eu digitar sudo apt-get remove e depois pressionar a tecla Tab para preenchimento automático, recebo a seguinte mensagem:

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

Não vejo nada 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 inserir dois pontos não ajudou. Remover a linha que contém o ponto também não funcionou. Sobrescrever o arquivo com status antigo resultou na mesma mensagem.

Existe alguma maneira de reconstruir o arquivo de status?

    
por Ramón 27.09.2010 / 23:08

8 respostas

7

Eu finalmente consertei meu sistema nisso. A restauração de um backup do arquivo de status não funcionou porque tive o problema por tanto tempo, em todos os meus backups.

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

link

    
por Oli 30.01.2011 / 03:07
17

Você deve poder trabalhar com um arquivo de status válido conhecido anteriormente e atualizá-lo a partir dele. Toda vez que você faz uma instalação ou uma atualização, o arquivo de status é salvo em um backup gzipado em / var / backups . Fazendo 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. Fazendo um ls -l status * 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

Então, para se recuperar de uma corrupção, você deve ser capaz de 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 dpkg recente 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 ser feito.

    
por Jim 04.10.2010 / 17:20
5

Nesse caso, eu faria o backup do arquivo /var/lib/dpkg/status corrompido e, em seguida, o corrigirei manualmente (nas linhas 1888 e 9550) usando as informações de

apt-cache show libssl0.9.8
apt-cache show udev
    
por arrange 10.03.2011 / 00:07
5

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

    
por gap 08.07.2011 / 13:41
5

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

    
por ordually 25.08.2011 / 18:08
3

Este foi um bug (supostamente corrigido): Bug do Launchpad 613018

Upstream: Bug da Debian 590885

Esta deve ser uma solução alternativa (backup, string de versão "fix"):

cp /var/lib/dpkg/status ~/dpkg-status.back
sudo sed -i "s/56127_Ubuntu_karmic/56127Ubuntukarmic/" /var/lib/dpkg/status
    
por htorque 12.06.2011 / 04:17
1

Filho de um ...

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

Para encontrar isso, eu recorri a um método de solução de problemas de espingarda e comecei a tentar coisas aleatoriamente. Uma das minhas tentativas mais engraçadas foi grep-status -P e descobrir que e era a letra mais comum no alfabeto. Sou burro, eu sei, mas o último registro de status impresso antes de reclamar de um cólon perdido foi para o pacote lexmark e notei a falta de um caractere . 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 no caso de alguém encontrar um problema semelhante no futuro. Obrigado.

    
por Ramón 30.09.2010 / 01:57
1

Porque o meu status era muito problemático, mesmo com apt-get update ,

Isso funcionou muito bem para mim:

(como root)

cd /var/lib/dpkg 

cp -avf status status.corrupt

tr -cd '-6' < status.corrupt > status
% bl0ck_qu0te%

CRÉDITO: link

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

diff /var/lib/dpkg/{status-old,status} |less
    
por Marcos 29.08.2014 / 11:23