Como posso reproduzir o erro “package… precisa ser reinstalado, mas não consigo encontrar um arquivo para ele” para teste?

4

De tempos em tempos, os usuários do Ubuntu encontram erros de apt ou apt-get , da forma:

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

Eu quero saber o que causa esse erro para que eu possa reproduzi-lo e tentar encontrar maneiras seguras de corrigi-lo, mesmo quando o pacote corrompido é importante e tem muitas dependências. Este bit do O código-fonte do APT pode dar uma pista, mas eu não sei como os pacotes obtêm o status que causa o erro.

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

Isto é solicitado por esta pergunta Ask Ubuntu recente e meu desconforto de longa data com questões de fechamento sobre este erro contra O Apt / Synaptic precisa reinstalar o pacote mas não consegue encontrar o arquivo para ele , cuja resposta usa dpkg --force-all para remover o pacote ofensivo. Feedback anônimo sugere que esta solução funcionou para muitos usuários, mas não estou confiante de que usar --force-all não cause problemas posteriores, ou que seja uma boa ideia usar esse método para remover pacotes importantes como o APT.

    
por Zanna 23.10.2017 / 10:33

1 resposta

3

O erro "O Apt / Synaptic precisa reinstalar o pacote, mas não pode encontrá-lo", às vezes não é específico.

A hora mais comum que vejo este erro é quando atualizo o Ubuntu de uma versão para outra.

Nota : O Ubuntu está convertendo do apt-get para o apt, mas estou usando o apt-get neste post. Para obter informações adicionais, consulte man apt e link

A causa mais comum desse erro é quando um usuário instalou um pacote e, em seguida, removeu o .deb, normalmente com sudo apt-get clean

link

  

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 upgrade, ou em algum momento o usuário tenta reinstalar o pacote é reinstalado sudo apt-get --reinstall foo ou alguma variação.

Se o apt não puder localizar o .deb no repositório, seja porque os pacotes foram removidos (raros), o repositório foi removido do sistema ou o upgrade e o pacote não estão no novo repositório, você receberá o erro " O 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 de manual do dpkg (Veja link para detalhes)

  

INFORMAÇÕES SOBRE PACOTES          O dpkg mantém algumas informações úteis sobre os pacotes disponíveis. o          A informação é dividida 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 o pacote ... | -a | --pending

          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 do manual forem tl; dr - & gt; Como parte da instalação, o .deb / dpkg / apt executa scripts pré / pós-instalação e outras funções. Se esses scripts de instalação / remoção falharem por vários motivos, um pacote será marcado como "meio-instalado" (ou algum outro estado que não seja instalado / instalado). Nesse estado impuro, você também pode ver o erro "O 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 podem ser resolvidos executando-os novamente. Assim, o erro é às vezes não específico.

Como gerenciar pacotes quebrados

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

    Então o infame

    sudo apt-get install -f
    

    Leia qualquer mensagem de saída e erro e poste o comando e a saída aqui se precisar de ajuda.

  2. Tente reconfigurar

    sudo dpkg --configure -a
    

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

    Leia qualquer mensagem de saída e erro e poste o comando e a saída aqui se precisar de ajuda.

    Tente ver 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ê tem que ter muito cuidado aqui você pode forçar a remoção de um pacote crítico ou pior conjunto de pacotes críticos. Os comandos a seguir vão de educado a menos polido a força direta. 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 trabalhos executar sudo apt-get update && sudo apt-get upgrade , talvez seja necessário executar sudo apt-get -f install e / ou sudo dpkg --configure -a .

  4. Se isso falhar, você precisará remover manualmente os pacotes. Isso pode envolver encontrar todos os componentes em 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.

    Por fim, remova o pacote ofensivo

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

    Você deve então poder 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 todos os arquivos restantes no sistema. Este é um procedimento manual e pode incluir arquivos de configuração em /etc ou páginas de manual ou dados compartilhados. Use localizar ou localizar para identificar os arquivos restantes possíveis.

    Obviamente, você deve tomar muito cuidado ao excluir arquivos do sistema. Não exclua coisas que você não entende e não use rm -Rf sem entender o que esse comando fará. rm -i é provavelmente melhor, pois a opção -i pede confirmação.

Recrie este problema

Você pode reproduzir essa mensagem de erro editando manualmente o arquivo de status do dpkg de qualquer pacote em /var/lib/dpkg/info e alterando o status para metade da instalação

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

Edite a linha Status para que ela seja lida

  

Status: Reinstreq de eliminação parcialmente instalado

Em seguida, tente executar 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 idéia da causa e resolução desta mensagem de erro complexa "O Apt / Synaptic precisa reinstalar o pacote, mas não consegue encontrar o arquivo para ele"

    
por Panther 24.10.2017 / 22:43