Como recriar / var / lib / dpkg / status?


10

Eu apaguei alguns arquivos /var/lib/dpkg/, a saber:

/var/lib/dpkg/status
/var/lib/dpkg/available
/var/lib/dpkg/info/*

Eu entendo que o Debian usa esses arquivos para manter algumas informações sobre pacotes instalados. Agora, quando o faço apt-get update, recebo o seguinte erro:

Reading package lists... Error!
E: Could not open file /var/lib/dpkg/status - open 
(2: No such file or directory)
E: The package lists or status file could not be parsed or opened.

Pelo que entendi , o arquivo FHS/var não deve ser crítico para o sistema. Avalie esses arquivos temporários, logs, caches e similares.

Existe, portanto, uma maneira de recriar os arquivos excluídos?


1
A resposta de Braiam retornará o arquivo de status; mas o material que você excluiu também /var/lib/dpkg/infoé muito importante. Você entendeu mal o FHS e o AFAIK os únicos caminhos de recuperação são (a) restaurar a partir do backup ou (b) reinstalar.
Derobert # 13/14

Respostas:


13

Se você observar o objetivo de / var, conforme indicado no Padrão de Hierarquia do Sistema de Arquivos , ele diz:

/varcontém arquivos de dados variáveis. Isso inclui diretórios e arquivos em spool, dados administrativos e de log e arquivos temporários e temporários.

Observe que arquivos "temporários e temporários" são apenas uma das coisas que ele contém. Ele também contém "diretórios e arquivos de spool" e "dados administrativos e de log". Você excluiu "dados administrativos" críticos.

Continua explicando por que /varexiste:

/varé especificado aqui para possibilitar a montagem /usrsomente leitura. Tudo o que uma vez foi para /usro que está escrito para durante a operação do sistema (em oposição à instalação e manutenção de software) deve estar em /var.

Essa é a principal coisa /var: os dados nele mudam, diferentemente /usr(o que só muda quando você adiciona / remove / atualiza software).

Seções adicionais explicam os vários subdiretórios de /var; por exemplo, /var/lib(onde os arquivos que você excluiu costumava viver) mantém "informações de estado pertencentes a um aplicativo ou sistema", definidas como "dados que os programas modificam enquanto são executados e que pertencem a um host específico".

Você realmente não deve excluir arquivos sem saber para que serve o arquivo específico. Com os arquivos apagados, a menos que você tenha um backup desses arquivos, acho que a única coisa que resta a fazer é fazer um backup de /home, /etcetc. e reinstalação. Até você fazer isso, não poderá usar dpkg(e APT, etc.). Fora isso, o sistema deve continuar funcionando.


Posso copiar os arquivos de outra máquina ou eles são específicos da máquina?
Martin Vegter 13/10

1
O status do @MartinVegter lista os pacotes que estão instalados nesta máquina específica. Você pode copiá-lo de uma máquina com exatamente os mesmos estados de pacote (não apenas instalados, mas removidos, mas também não eliminados). apt-get updatevai reconstruir disponível, acredito. A informação / material vem de cada pacote instalado, mas também reflete o histórico, pelo menos para arquivos conf antigos ... mas você provavelmente pode se safar copiando exatamente dessa mesma máquina de pacotes)
derobert

A documentação atual declara " /var/libInformações do estado. Dados persistentes modificados pelos programas à medida que são executados, por exemplo, bancos de dados, metadados do sistema de empacotamento etc."
Mikko Rantalainen 01/07/19

8

Você não pode "recriar" /var/lib/dpkg/statusno sentido de apenas executar um comando e o arquivo aparece magicamente. Não. Você precisa usar um backup do arquivo e aprender a nunca excluir coisas do /var/libdiretório:

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

Isso forneceria o status do pacote do dia anterior. Comece a orar para não quebrar mais nada.


veja também /var/backups, existem várias cópias lá.
derobert

@Braiam - Não tenho status antigo, nem tenho nada em / var / backups. Posso copiar os arquivos de outra máquina ou eles são específicos da máquina?
Martin Vegter 13/10

1
@MartinVegter não, não vai funcionar. A maneira mais rápida para você é fazer backup de seus arquivos importantes e reinstalar o sistema. Aliás, nem mesmo /var/backups/dpkg.status.0?
Braiam 13/10

8

Os arquivos localizados /varsão muito críticos para o sistema. Por exemplo, /var/mailou /var/spool/mailcontém o email dos usuários; você não excluiria mais isso do que acenderia um incêndio na caixa de correio do seu vizinho. São apenas arquivos em determinados subdiretórios /varque contêm arquivos mais ou menos transitórios: arquivos de log /var/log, caches que geralmente podem ser recriados /var/cache, arquivos temporários (que você não deve excluir enquanto estiverem em uso!) /var/tmp.

Os dados /var/libpodem ser bastante críticos. Por exemplo, o MySQL geralmente é configurado para armazenar seus bancos de dados /var/lib/mysqlpor padrão: se você apagar isso, limpe seus bancos de dados. O Dpkg também coloca seus próprios bancos de dados /var/lib; /var/lib/dpkg/statusé um.

/var/lib/dpkg/statuscontém informações sobre pacotes instalados. Se você apagou isso, restaure-o a partir de um backup. Se o seu backup não estiver totalmente atualizado, verifique os logs das manipulações recentes de pacotes em /var/log/apte dentro /var/log/dpkg.log. Você precisará criar esse arquivo antes de dpkgfuncionar.

/var/lib/dpkg/availableé construído a partir de dados baixados da Internet. apt-get updatedeve reconstruí-lo.

/var/lib/dpkg/infocontém arquivos fornecidos com os pacotes Debian. Você pode restaurar esses arquivos simplesmente reinstalando os pacotes. Obviamente, você precisará de uma lista de pacotes instalados para isso. Se você restaurou /var/lib/dpkg/status, poderá extrair a lista de pacotes a partir daí.

apt-get install --reinstall $(</var/lib/dpkg/status sed -n 's/^Package://p')

Se você perdeu /var/lib/dpkg/status, poderá recriá-lo criando um arquivo vazio e executando apt-get install --reinstallna lista de pacotes. Um local em que a lista de pacotes também é salva é /var/lib/apt/extended_states, pelo menos se você já usou o APT para instalar pacotes (em vez de dpkgdiretamente) - use esse arquivo em vez de /var/lib/dpkg/statusint o comando acima. Se você também excluiu isso, poderá recriar uma lista aproximada de pacotes $(cd /usr/share/doc && ls), porque a maioria dos pacotes cria uma entrada /usr/share/doc. Provavelmente existem algumas exceções.

Não peça ajuda sobre gerenciamento de pacotes neste sistema. A recuperação da exclusão de arquivos críticos do sistema não é uma ciência exata. Se não conseguir restaurar a partir dos backups, instale um sistema novo e limpo o mais rápido possível.


Eu diria que não há problema em solicitar assistência sobre pacotes em um sistema assim, desde que você comece descrevendo o problema histórico e a maneira como o corrigiu . Às vezes, o reparo de tais sistemas pode permitir perceber, por exemplo, vulnerabilidades de segurança em algum processo de gerenciamento de pacotes e pode ser valioso, apesar do fato de ser difícil lidar com esse sistema.
Mikko Rantalainen 01/07/19

5

O /var/lib/dpkg/availablepode ser recriado a partir dos dados do apt. A maneira mais fácil que encontrei de fazer isso usando dselecte escolhendo a atualização. Espero que isso funcione apenas se você tiver escolhido o método de atualização. Parece que dselectfaz um:

/bin/bash /usr/lib/dpkg/methods/apt/update /var/lib/dpkg apt apt

Note que as coisas podem ter mudado desde o Debian sarge.

Existem truques para recriar com /var/lib/dpkg/statusbase no fato de que todos os pacotes são necessários para adicionar um diretório ao /usr/share/docdiretório. Veja a publicação em http://linuxmafia.com/faq/Debian/package-database-rebuild.html . É apresentado um script que usa uma lista filtrada de / usr / share / doc para criar uma lista de pacotes que foram instalados e depois reinstala todos eles.


1

Bem, suponho que você possa recriar o arquivo vazio e fazer uma lista longa do apt-get install, supondo que você saiba o que instalou pela primeira vez.

Eu tenho um script antigo que faz isso basicamente no menor conjunto de pacotes que podem executar o apt-get. Ao usá-lo, acabei relatando dezenas de dependências não declaradas.

Se você não souber tudo o que instalou, reinstale o sistema.


0

No Linux Mint 17, encontrei um problema semelhante. Eu estava zeloso ao excluir arquivos e me vi onde o "Administration -> Upgrade Manager" simplesmente não parecia feliz .......

A solução que funcionou para mim foi criar um diretório chamado "dpkg" conforme a mensagem de erro e criar um arquivo vazio chamado "status".

Eu executei o Update Manager.

Funcionou para mim :-)


0

Se você tiver outras contas de usuário diferentes de 'roo't', tente o apt-get dist-upgrade de uma delas. O Apt fará o download dos arquivos, mas os instalará devido a alguns diretórios ausentes em / var /. Os diretórios serão mostrados. crie-os e execute o apt-get dist-upgrade novamente. caso a criação deles falhe do log alternativo da conta de volta à raiz, crie os diretórios a partir daí e execute o apt novamente. você será solicitado sobre a configuração de rotação de log e algumas outras configurações apenas digitar Y n continuar até o final e reiniciar quando o dist-upgrade for concluído. agora tudo deve voltar ao normal.


0

Desculpe o atraso. Briam, recrie os diretórios e arquivos manualmente e, em seguida, atualize os repositórios ( mkdire touch, conforme exigido pelo erro exibido), e use dpkg --configure -a.

Seu sistema funcionaria bem, mas é importante reinstalar para garantir que ele não esteja corrompido; anterior é apenas para ganhar tempo para agendar uma reinstalação ... e cuidar de excluir /var/lib/*arquivos.


-2

Se você comprou um raspberry pi 3 e enfrentou o problema e obtendo o erro "não foi possível abrir o arquivo / var / lib / dpkg / status analisado ou aberto", esta é uma solução alternativa que funcionou para mim:

Como recriar o arquivo "/ var / lib / dpkg / status" ?, apenas porque este não é um arquivo inutilizado, é um arquivo muito importante que mantém algumas informações sobre os pacotes instalados no seu sistema operacional raspbian, então aqui está como eu fui recriado :

  1. Execute um wget dentro do seu sistema Raspbian:

    wget http://www.doglabscs.com/recover1.sh
    
  2. Conceda algumas permissões:

    chmod 777 recover1.sh
    
  3. Analise a pasta de documentação em seu sistema e gere novamente o arquivo de status:

    ./recover1.sh
    
  4. Feito isso, baixe o arquivo e leia com atenção. Siga as etapas descritas no arquivo:

    wget http://www.doglabscs.com/recover2.txt
    cat recover2.txt
    

Oi! Poste o código como parte de suas respostas e não como links.
dhag

Aviso: recover1.shdestruirá sua corrente /var/lib/dpkg/statussem testar se ela já estiver correta. Em seguida, ele executará um conjunto misto de truques para tentar reconstruir a versão um pouco funcional. Nunca execute o script acima, a menos que esteja totalmente ausente do arquivo / var / lib / dpkg / status. Caso contrário, strings /var/lib/dpkg/statuspode ser a melhor maneira de começar a reconstruir o arquivo corrompido.
Mikko Rantalainen 01/07/19
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.