Cómo gestionar paquetes rotos

Cómo gestionar paquetes rotos

De vez en cuando, los usuarios de Ubuntu encuentran errores deaptoapt-get, de la forma:

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

Quiero saber qué causa este error para poder reproducirlo e intentar encontrar formas seguras de solucionarlo, incluso cuando el paquete roto es importante y tiene muchas dependencias.este pocodelcódigo fuente APTPodría dar una pequeña pista, pero no sé cómo los paquetes obtienen el estado que causa el error.

¿Cómo puedo producir este error al realizar pruebas en mi sistema (Ubuntu MATE 17.10)?

Esto es impulsado poresta pregunta reciente de Ask Ubuntuy mi malestar de larga data con las preguntas finales sobre este error contraApt/Synaptic necesita reinstalar el paquete pero no puede encontrar el archivo correspondiente, cuya respuesta se utiliza dpkg --force-allpara eliminar el paquete infractor.Comentarios anónimossugiere que esta solución ha funcionado para muchos usuarios, pero no estoy seguro de que su uso --force-allno cause problemas posteriores o que sea una buena idea utilizar este método para eliminar paquetes importantes como APT.

Respuesta1

El error "Apt/Synaptic necesita reinstalar el paquete pero no puede encontrar el archivo" a veces no es específico.

La vez más común que veo este error es cuando actualizo Ubuntu de una versión a otra.

Nota: Ubuntu está convirtiendo de apt-get a apt, pero estoy usando apt-get en esta publicación. Para obtener información adicional consulte man aptyhttps://www.debian.org/doc/manuals/debian-reference/ch02.en.html

La causa más común de este error es cuando un usuario instaló un paquete y luego eliminó el .deb, generalmente consudo apt-get clean

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

limpio

       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/

Luego, en algún momento, dpkg --reconfigurees llamado, ya sea por el usuario, o por actualización, o en algún momento el usuario intenta reinstalar el paquete sudo apt-get --reinstall fooo alguna variación.

Si apt no puede ubicar el .deb en el repositorio, ya sea porque los paquetes se eliminaron (poco frecuente), el repositorio se eliminó del sistema o porque actualizó y el paquete no está en el nuevo repositorio, obtendrá el error "Apt/Synaptic necesita reinstalar el paquete pero no puede encontrar el archivo"


Pero el error puede deberse a otras causas.

Citando las secciones relevantes de la página de manual de dpkg (Verhttp://manpages.ubuntu.com/manpages/trusty/man1/dpkg.1.htmlpara detalles )

INFORMACIÓN SOBRE PAQUETES dpkg mantiene información útil sobre los paquetes disponibles. La información se divide en tres clases: estados, estados de selección y banderas. Estos valores están pensados ​​para cambiarse principalmente con dselect.

Estados del paquete

   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.

COMPORTAMIENTO

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

--configurar paquete...|-a|--pendiente

          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.

Si las páginas de manual son tl;dr -> Como parte de la instalación, .deb/dpkg/apt ejecuta scripts previos y posteriores a la instalación y otras funciones. Si estos scripts de instalación/eliminación fallan por cualquier motivo, un paquete se marcará como "medio instalado" (o en algún estado distinto a no instalado/instalado). En ese estado sucio, es posible que a veces también vea el error "Apt/Synaptic necesita reinstalar el paquete pero no puede encontrar el archivo". En este ejemplo, el problema no es un archivo comprimido faltante, sino un problema en los scripts previos y posteriores a la instalación que no se puede resolver volviendo a ejecutarlos. Por tanto, el error es a veces inespecífico.


Cómo gestionar paquetes rotos

  1. Primero, intente solucionar las dependencias asegurándose de que los repositorios/ppa apropiados estén habilitados, por ejemplo, el universo, o cualquier repositorio que sea necesario.

    Entonces el infame

    sudo apt-get install -f
    

    Leercualquier mensaje de salida y error y publique el comando y la salida aquí si necesita ayuda.

  2. Intenta reconfigurar

    sudo dpkg --configure -a
    

    Esto ejecutará los scripts de configuración. Puede especificar un paquete en lugar de -a, pero -a es más útil cuando tiene problemas.

    Leercualquier mensaje de salida y error y publique el comando y la salida aquí si necesita ayuda.

    Intente observar cualquier secuencia de comandos fallida y, si es posible, solucione el error/problema en la secuencia de comandos.

  3. Intente retirar el paquete infractor, por la fuerza si es necesario. Debe tener mucho cuidado aquí, ya que puede forzar la eliminación de un paquete crítico o, peor aún, de un conjunto de paquetes críticos. Los siguientes comandos van de educados a menos educados y a fuerza absoluta. Pruébelos en orden.

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

    Si alguno de ellos funciona, ejecute sudo apt-get update && sudo apt-get upgrade, es posible que necesite ejecutar sudo apt-get -f instally/o sudo dpkg --configure -atambién.

  4. Si eso falla, deberá eliminar manualmente los paquetes. Esto puede implicar encontrar todos los componentes de su sistema y eliminarlos manualmente.

    Utilice el siguiente procedimiento

    Eliminar la información de dpkg (ver arriba)

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

    Tenga cuidado de no eliminar más de lo necesario aquí.

    Finalmente elimine el paquete infractor.

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

    Entonces deberías poder usar apt

    sudo apt-get update
    sudo apt-get install -f
    sudo apt-get upgrade
    
  5. Solo si es necesario, busque y elimine manualmente los archivos que queden en el sistema. Este es un procedimiento manual y puede incluir archivos de configuración en /etcpáginas de manual o datos compartidos. Utilice buscar o localizar para identificar posibles archivos restantes.

    Obviamente debes tener mucho cuidado al eliminar archivos del sistema. No elimine cosas que no comprenda y no utilice rm -Rfsin comprender qué hará ese comando. rm -iProbablemente sea mejor ya que la -iopción solicita confirmación.


Recrea este problema

Es posible que pueda reproducir este mensaje de error editando manualmente el archivo de estado dpkg de cualquier paquete /var/lib/dpkg/infoy cambiando el estado a medio instalado.

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

Edite la línea de Estado para que diga

Estado: purga reinstreq medio instalada

Entonces intenta correr apt-get.

Si eso no funciona, instale un paquete desde un ppa, ejecute apt-get clean, elimine el ppa y luego intente reinstalar o reconfigurar el paquete.

Perdón por la publicación tan larga, pero espero que esto le brinde información sobre la causa y la resolución de este complejo mensaje de error "Apt/Synaptic necesita reinstalar el paquete pero no puede encontrar el archivo".

información relacionada