Como gerenciar pacotes quebrados

Como gerenciar pacotes quebrados

De vez em quando, os usuários do Ubuntu encontram erros deaptouapt-get, da forma:

The package some-package needs to be reinstalled, but I can't find an archive for it.

Quero saber o que causa esse erro para poder reproduzi-lo e tentar encontrar formas seguras de corrigi-lo, mesmo quando o pacote quebrado é importante e tem muitas dependências.Esta partedoCódigo-fonte do APTpode dar uma pista, mas não sei como os pacotes obtêm o status que causa o erro.

Como posso produzir este erro para teste no meu sistema (Ubuntu MATE 17.10)?

Isto é motivado poresta recente pergunta do Faça ao Ubuntue meu desconforto de longa data com questões finais sobre esse erro contraApt/Synaptic precisa reinstalar o pacote, mas não consegue encontrar o arquivo para ele, cuja resposta usa dpkg --force-allpara remover o pacote incorreto.Feedback anônimosugere que esta solução funcionou para muitos usuários, mas não estou confiante de que o uso --force-allnão causará problemas posteriores, ou que seja uma boa ideia usar este método para remover pacotes importantes como o APT.

Responder1

O erro "Apt/Synaptic precisa reinstalar o pacote, mas não consegue encontrar o arquivo para ele" às ​​vezes é inespecífico.

O momento mais comum em que vejo esse erro é ao atualizar o Ubuntu de uma versão para outra.

Observação: O Ubuntu está convertendo de apt-get para apt , mas estou usando o apt-get neste post. Para informações adicionais consulte man aptehttps://www.debian.org/doc/manuals/debian-reference/ch02.en.html

A causa mais comum desse erro é quando um usuário instala um pacote e remove o .deb, normalmente comsudo apt-get clean

http://manpages.ubuntu.com/manpages/zesty/man8/apt-get.8.html

limpar

       clean clears out the local repository of retrieved package files.
       It removes everything but the lock file from
       /var/cache/apt/archives/ and /var/cache/apt/archives/partial/

Então, em algum momento, dpkg --reconfigureé chamado, seja pelo usuário, ou por atualização, ou em algum momento o usuário tenta reinstalar o pacote é reinstalado sudo apt-get --reinstall fooou alguma variação.

Se o apt não conseguir localizar o .deb no repositório, seja porque os pacotes foram removidos (raro), o repositório foi removido do sistema ou porque atualizou e o pacote não está no novo repositório, você receberá o erro "Apt/Synaptic precisa reinstalar o pacote, mas não consegue encontrar o arquivo para ele"


Mas o erro pode vir de outras causas.

Citando as seções relevantes da página man do dpkg (Vejahttp://manpages.ubuntu.com/manpages/trusty/man1/dpkg.1.htmlpara detalhes )

INFORMAÇÕES SOBRE PACOTES O dpkg mantém algumas informações úteis sobre os pacotes disponíveis. As informações são divididas em três classes: estados, estados de seleção e bandeiras. Estes valores devem ser alterados principalmente com o dselect.

Estados do pacote

   not-installed
          The package is not installed on your system.

   config-files
          Only the configuration files of the package exist on the system.

   half-installed
          The  installation  of  the  package  has  been  started, but not
          completed for some reason.

   unpacked
          The package is unpacked, but not configured.

   half-configured
          The package is unpacked and configuration has been started,  but
          not yet completed for some reason.

   triggers-awaited
          The package awaits trigger processing by another package.

   triggers-pending
          The package has been triggered.

   installed
          The package is unpacked and configured OK.

AÇÕES

   -i, --install package-file...
          Install the package. If --recursive or -R option  is  specified,
          package-file must refer to a directory instead.

          Installation consists of the following steps:

          1. Extract the control files of the new package.

          2.  If  another version of the same package was installed before
          the new installation, execute prerm script of the old package.

          3. Run preinst script, if provided by the package.

          4. Unpack the new files, and at the same time back  up  the  old
          files, so that if something goes wrong, they can be restored.

          5.  If  another version of the same package was installed before
          the new installation, execute  the  postrm  script  of  the  old
          package.  Note  that  this  script is executed after the preinst
          script of the new package, because new files are written at  the
          same time old files are removed.

          6.   Configure   the   package.  See  --configure  for  detailed
          information about how this is done.

--configure pacote...|-a|--pendente

          Configure  a  package  which  has  been  unpacked  but  not  yet
          configured.  If -a or --pending is given instead of package, all
          unpacked but unconfigured packages are configured.

          To reconfigure a package which has already been configured,  try
          the dpkg-reconfigure(8) command instead.

          Configuring consists of the following steps:

          1.  Unpack  the  conffiles, and at the same time back up the old
          conffiles, so that they can be restored if something goes wrong.

          2. Run postinst script, if provided by the package.

   /var/lib/dpkg/status

          Statuses  of  available packages. This file contains information
          about whether a package is marked for removing or  not,  whether
          it  is  installed  or  not,  etc.  See section INFORMATION ABOUT
          PACKAGES for more info.

Se as páginas de manual forem tl;dr -> Como parte da instalação, .deb/dpkg/apt executa scripts de pré/pós-instalação e outras funções. Se esses scripts de instalação/remoção falharem por qualquer motivo, um pacote será marcado como "meio instalado" (ou algum estado diferente de não instalado/instalado). Nesse estado sujo, você às vezes também pode ver o erro "Apt/Synaptic precisa reinstalar o pacote, mas não consegue encontrar o arquivo para ele" . Neste exemplo, o problema não é um arquivo ausente, mas um problema nos scripts de pré/pós-instalação que não pode ser resolvido executando-os novamente. Assim, o erro às vezes é inespecífico.


Como gerenciar pacotes quebrados

  1. Primeiro, tente corrigir as dependências primeiro, certificando-se de que os ppa/repositórios apropriados estejam habilitados, o universo, por exemplo, ou quaisquer repositórios necessários.

    Então o infame

    sudo apt-get install -f
    

    Lerquaisquer mensagens de saída e de erro e poste o comando e a saída aqui se precisar de ajuda.

  2. Tente reconfigurar

    sudo dpkg --configure -a
    

    Isso executará os scripts de configuração. Você pode especificar um pacote em vez de -a, mas -a é mais útil quando você está tendo problemas.

    Lerquaisquer mensagens de saída e de erro e poste o comando e a saída aqui se precisar de ajuda.

    Tente observar qualquer script com falha e, se possível, corrija o erro/problema no script.

  3. Tente remover o pacote ofensivo, à força, se necessário. Você deve ter muito cuidado aqui, pois pode forçar a remoção de um pacote crítico ou pior de um conjunto de pacotes críticos. Os comandos a seguir vão de educado a menos educado e a força total. Experimente-os em ordem.

    sudo dpkg --remove $broken_package
    sudo dpkg --remove --force-remove-reinstreq $broken_package
    sudo dpkg --remove --force-all $broken_package
    

    Se algum desses funcionar, execute sudo apt-get update && sudo apt-get upgrade, talvez seja necessário executar sudo apt-get -f installe/ou sudo dpkg --configure -atambém.

  4. Se isso falhar, você precisará remover manualmente os pacotes. Isso pode envolver encontrar todos os componentes do seu sistema e excluí-los manualmente.

    Use o seguinte procedimento

    Remova as informações do dpkg (veja acima)

    cd /var/lib/dpkg/info
    sudo rm -i package_name*
    

    Tenha cuidado para não remover mais do que o necessário aqui.

    Finalmente remova o pacote ofensivo

    sudo dpkg --remove --force-remove-reinstreq package_name
    

    Você deverá então ser capaz de usar o apt

    sudo apt-get update
    sudo apt-get install -f
    sudo apt-get upgrade
    
  5. Somente se necessário, localize e remova manualmente quaisquer arquivos restantes no sistema. Este é um procedimento manual e pode incluir arquivos de configuração em /etcpáginas de manual ou dados compartilhados. Use localizar ou localizar para identificar possíveis arquivos restantes.

    Obviamente você deve tomar muito cuidado ao excluir arquivos do sistema. Não exclua coisas que você não entende e não usa rm -Rfsem entender o que aquele comando fará. rm -iprovavelmente é melhor porque a -iopção pede confirmação.


Recrie este problema

Você pode reproduzir esta mensagem de erro editando manualmente o arquivo de status dpkg de qualquer pacote /var/lib/dpkg/infoe alterando o status para meio instalado

sudo nano /var/lib/dpkg/info/some_package

Edite a linha Status para que leia

Status: purge reinstreq meio instalado

Então tente correr apt-get.

Se isso não funcionar, instale um pacote de um ppa, execute apt-get clean, remova o ppa e tente reinstalar ou reconfigurar o pacote.

Desculpe pela longa postagem, mas espero que isso lhe dê uma ideia da causa e da resolução desta complexa mensagem de erro "Apt/Synaptic precisa reinstalar o pacote, mas não consegue encontrar o arquivo para ele"

informação relacionada