Como recriar um arquivo de status do dpkg corrompido?

23

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
16

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
4

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
4

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
4

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
0

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
  

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

     

octal 11: guia

     

octal 12: alimentação de linha

     

octal 15: retorno de carro

     

octal 40 até octal 176: todos os "bons" caracteres do teclado

     

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

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

Tags