¿Puedo ver por qué está instalado un paquete?

112

Para un paquete específico, ¿puedo averiguar por qué está instalado?

Entonces, ¿puedo ver o está instalado manualmente, o que está instalado como una dependencia de otro paquete? ¿O que está instalado como parte de la distribución?

Peter Smit
fuente
Esto está relacionado con (una parte de) esta pregunta, vea esta respuesta para más detalles.
koushik
Respuesta mucho mejor para 2017 aquí: askubuntu.com/questions/128524/…
Lambart

Respuestas:

107

Una solución rápida es ingresar el siguiente comando en una terminal:

aptitude why $package

o, si solo le interesa la causa última:

aptitude why $package --show-summary

Reemplace $ package con el nombre del paquete, y es posible que aptitudeprimero necesite instalar el paquete.

Aquí está la salida que puede obtener para aptitude why aspell --show-summary

Packages requiring aspell:
  inkscape

Para más detalles correrás aptitude why aspell. Puede leer el resultado de ejemplo, a continuación, de la siguiente manera: "Usted instaló manualmente inkscape, lo que requiere libgtkspell, lo que requiere libenchantic2a, lo que requiere aspell". (los imarcadores indican paquetes instalados; los Amarcadores indican paquetes instalados automáticamente).

i   inkscape       Depends libgtkspell0 (>= 2.0.10)                                                                    
i A libgtkspell0   Depends libenchant1c2a (>= 1.6.0)                                                                   
i A libenchant1c2a Depends aspell-en | myspell-dictionary | aspell-dictionary | ispell-dictionary | hunspell-dictionary
i A aspell-en      Depends aspell (>= 0.60.3-2)

Finalmente, el siguiente comando

apt-cache rdepends --installed $package

enumera los otros paquetes instalados en su computadora que dependen directamente de $ package . Puede agregar la --recurseopción para enumerar todos los paquetes que dependen directa o indirectamente de él.

enzotib
fuente
La aptitud de lástima no está incluida por defecto :(
badp
1
@badp gracias a señalar. Esta es la mala noticia con Maverick, solo para ahorrar espacio en la imagen iso de livecd. Pero es una herramienta invaluable, y no me iré sin ella.
enzotib
15
apt-cache rdepends --recurse $packageProbablemente da demasiados paquetes. Agregaría la --installedopción de restringir a los paquetes instalados. -iLa opción se restringe a la predependencia y los paquetes relacionados con la dependencia. Pero un paquete puede instalarse porque otro paquete lo recomienda. Para incluir dichos paquetes relacionados con las recomendaciones, supongo que esto daría los correctos:apt-cache rdepends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances --installed --recurse $package
jarno
44
equivalente ligeramente más corto del encantamiento de @ jarno, suponiendo que esté en bash u otro shell con expansión de apt-cache rdepends --no-{suggests,conflicts,breaks,replaces,enhances} --installed --recurse $package
llaves
30

Puede encontrar un razonamiento rápido y breve sobre por qué se instaló cierto paquete escribiendo el siguiente comando en un terminal ( Applications -> Accessories -> Terminal):

aptitude why <package-name>

Reemplácelo con el nombre del paquete que le interesa. Por ejemplo, al escribir, se obtiene aptitude why libgoo-canvas-perllo siguiente:

i   shutter Suggests libgoo-canvas-perl

Esto básicamente significa que el paquete shutteren este caso ha sugerido que libgoo-canvas-perlse instale. Para entonces, escribiendo aptitude why shutter, puedo subir la cadena de dependencia.

Sin embargo, hay una advertencia. A menudo noto que aptitud encuentra la explicación más plausible para la situación que puede no ser el caso real, pero que sin embargo le dará una pista para buscar más.

En mi caso, shuttersugiere libgoo-canvas-perl, sin embargo, los paquetes sugeridos no se instalan automáticamente de forma predeterminada. Sin embargo, me recuerda la "experiencia" de no poder editar capturas de pantalla con las shutterque me llevó a instalar manualmenteligbgoo-canvas-perl

Finalmente, puede averiguar si un paquete se instaló automáticamente (lo que significa que el sistema de administración de paquetes decidió que es obligatorio observar las dependencias y recomendaciones de otros paquetes que le pidió que instalara) ejecutando el siguiente comando.

aptitude show <package-name>

Esto generará una línea como la siguiente (tercera línea de la salida):

Automatically installed: no

Para obtener más información, ejecute info aptitude(en una terminal) o visite la página wiki de Aptitude

Para saber cuándo se instaló un paquete en particular, hay 2 opciones:

  1. El administrador de paquetes Synaptic mantiene un registro histórico de todas las actividades. Para ver el archivo de registro del historial, elija Historial en el menú Archivo. Puede buscar Install(tenga en cuenta el caso) para enumerar todas las entradas relacionadas con la instalación. Sin embargo, esto solo mostrará los paquetes instalados usando Synaptic
  2. Ejecute el siguiente comando en una terminal. Esto buscará en los registros de dpkg las entradas del historial de instalación. Sin embargo, existe un límite máximo de la cantidad de estos registros que se conservan, por lo que si el paquete que está buscando se instaló hace mucho tiempo, es posible que no lo encuentre. Más detalles aquí

    zcat -f /var/log/dpkg.log* | grep "\ install\ " | grep -i <package-name>
    
koushik
fuente
1
Si desea saber cuándo se instaló o actualizó un paquetezcat -f /var/log/dpkg.log* | grep -i PackageName | egrep “\ install\ |\ upgrade\ “
Chris Good
@ChrisGood: ¿puede volver a ingresar su comentario sin comillas inteligentes, por lo que es copiable / pegable?
Dan Dascalescu
1
Gracias por señalar eso. Con comillas dobles correctas: zcat -f /var/log/dpkg.log* | grep -i PackageName | egrep "\ install \ | \ upgrade \"
Chris Good
12

Sí, puedes, y de hecho es un comando bastante obvio. Suponiendo que tiene aptitude instalado, puede abrir un tipo de anuncio de ventana de terminal:

aptitude why package

Eso debería dar una lista de paquetes que dependen de ese paquete específico. Si es un paquete instalado manualmente, dirá algo como "No fue posible encontrar una razón para instalar el paquete".

Daniel Rodrigues
fuente
5

Aquí hay una manera simple en la que no se basa aptitude, que 10.10 ya no se envía por defecto.

Gráficamente

Abra Synaptic e intente eliminarlo.

Si aparece un cuadro de diálogo pidiéndole que elimine otros paquetes, esos son los paquetes que (recursivamente) dependen de él.

Desde la terminal

apt-get remove package_name_goes_here -s

Nuevamente, los paquetes que serían eliminados como resultado son todos aquellos que (recursivamente) dependen de él. (El -sparámetro le indica apt-getque en realidad no elimine el paquete).

badp
fuente
2
Esta es una solución arriesgada porque en realidad podría eliminar el paquete y todas las dependencias si hacen un clic incorrecto.
ImaginaryRobots
1
@ImaginaryRobots, eso es un montón de clics erróneos. (Debe hacer clic mal en Ok en el primer cuadro de diálogo, luego en Aplicar, luego nuevamente en Aceptar en el cuadro de diálogo de confirmación). Para la versión del terminal, también hay una y/Nsolicitud de confirmación adicional si escribe -s. Sin embargo, agregué una advertencia.
badp
1
-1 ya que esta información está disponible en Synaptic en la pestaña de dependencias, al ver las propiedades de un paquete.
alexanderpas
@alex incorrecto: ese cuadro de diálogo no le dice si ese paquete se instala de forma manual o automática. PD: reinicio del contador de la bandeja de entrada, intenta más
badp
@badp no, pero esa información se puede encontrar con el filtro de estado "Instalado (manual)" en la pantalla principal, y se puede ver en el menú del paquete cuando selecciona un paquete.
alexanderpas