¿Cómo puedo determinar por qué apt-get instalará un paquete?

18

Esta pregunta es similar a ¿Cómo puedo averiguar por qué se instaló un paquete? , pero en mi caso me gustaría saber antes de instalar un paquete, por qué instalará una dependencia particular.

Entonces, por ejemplo, podría correr

sudo apt-get install superfoo

y la salida dirá algo como:

The following extra packages will be installed:
  foo bar baz ... libderp libjunk

Y esta podría ser una lista realmente enorme. En algunos casos, veré algo que se instalará que realmente no tiene sentido dado lo que estoy instalando, por lo que quiero saber por qué se instalará esa dependencia particular.

En el ejemplo anterior, digamos que me gustaría entender por qué libderpse instalaría. Sé que de alguna manera hay una cadena de dependencias entre superfooy, libderppero la enorme lista de paquetes que se instalarán hace que sea difícil ver qué es esta cadena.

Una vez que conozco la cadena de dependencias, puedo decidir si realmente quiero instalar el paquete original o no, y / o si debo ponerme en contacto con el mantenedor de ese paquete para ver si realmente necesitan tener esas dependencias allí.

pbouf77
fuente
Si la respuesta de alguien fue útil para usted, considere marcarla como la respuesta aceptada para que otros puedan encontrarla más fácilmente en el futuro. Esta es también una forma cortés de agradecer a la persona que responde su pregunta por ayudarlo.
Danatela

Respuestas:

14

Lo que realmente parece estar preguntando es "¿Cómo diagrama las dependencias?" para que pueda ver qué paquetes extraen qué dependencias.

Obtiene dependencias de texto y diagramas del apt-cachecomando (incluido en el paquete apt, parte de la instalación predeterminada).

Aquí hay un ejemplo de apt-cache para enumerar las dependencias del paquete 'hola' en formato de texto. La salida de texto siempre será de un solo nivel.

$ apt-cache depends hello
hello
  Depends: libc6
 |Depends: dpkg
  Depends: install-info

Puede leer el diagrama utilizando cualquier visor de dottyarchivos de puntos, como (incluido en el paquete graphviz, que también forma parte de la instalación predeterminada)

Aquí hay un ejemplo de cómo obtener el árbol de dependencias completo en formato gráfico y luego mostrarlo. La salida gráfica siempre será el árbol completo.

$ apt-cache dotty hello > dotfile
$ dotty dotfile

Al mirarlo, puede ver que el paquete 'hola' extrae una tonelada de paquetes de Perl ... y qué dependencia lo hace.

usuario535733
fuente
Si bien eso funcionaría, sería un trabajo serio hacerlo de esta manera para ver lo que atraía a un determinado paquete si el paquete era una dependencia de una dependencia.
tgm4883
De ningún modo. Simplemente mire la imagen del archivo de puntos.
user535733
1
apt-cache depends --recursele dará la imagen completa, pero apt-rdepends a continuación es mejor porque solo sigue dependencias reales, no recomendadas ni sugeridas.
mhsmith
Aunque apt-get en realidad instalará las dependencias recomendadas a menos que use el --no-install-recommendsindicador.
mhsmith
2
¿Qué significa esa barra? |
CMCDragonkai
9

apt-rdependshace esto, sin instalar más de 50 bibliotecas de cruft like ubuntu-dev-tools.

durr@scraper:~$ apt-rdepends mercurial
Reading package lists... Done
Building dependency tree
Reading state information... Done
mercurial
  Depends: libc6 (>= 2.14)
  Depends: mercurial-common (= 2.8.2-1ubuntu1)
  Depends: python (<< 2.8)
  Depends: ucf (>= 2.0020)
libc6
  Depends: libgcc1
libgcc1
  Depends: gcc-4.9-base (= 4.9-20140406-0ubuntu1)
  Depends: libc6 (>= 2.14)
  PreDepends: multiarch-support
gcc-4.9-base
multiarch-support
  Depends: libc6 (>= 2.3.6-2)
mercurial-common
  Depends: python (<< 2.8)
  Depends: python:any (>= 2.7.1-0ubuntu2)
python
  Depends: libpython-stdlib (= 2.7.5-5ubuntu3)
  Depends: python-minimal (= 2.7.5-5ubuntu3)
  Depends: python2.7 (>= 2.7.5-1~)
libpython-stdlib
  Depends: libpython2.7-stdlib (>= 2.7.5-1~)
libpython2.7-stdlib
  Depends: libbz2-1.0
  Depends: libc6 (>= 2.15)
  Depends: libdb5.3
  Depends: libexpat1 (>= 2.1~beta3)
  Depends: libffi6 (>= 3.0.4)
  Depends: libncursesw5 (>= 5.6+20070908)
  Depends: libpython2.7-minimal (= 2.7.6-8)
  Depends: libreadline6 (>= 6.0)
  Depends: libsqlite3-0 (>= 3.5.9)
  Depends: libssl1.0.0 (>= 1.0.0)
  Depends: libtinfo5
  Depends: mime-support
libbz2-1.0
  Depends: libc6 (>= 2.4)
  PreDepends: multiarch-support
libdb5.3
  Depends: libc6 (>= 2.17)
  PreDepends: multiarch-support
libexpat1
  Depends: libc6 (>= 2.14)
  PreDepends: multiarch-support
libffi6
  Depends: libc6 (>= 2.14)
  PreDepends: multiarch-support
libncursesw5
  Depends: libc6 (>= 2.15)
  Depends: libtinfo5 (= 5.9+20140118-1ubuntu1)
  PreDepends: multiarch-support
libtinfo5
  Depends: libc6 (>= 2.15)
  PreDepends: multiarch-support
libpython2.7-minimal
libreadline6
  Depends: libc6 (>= 2.15)
  Depends: libtinfo5
  Depends: readline-common
  PreDepends: multiarch-support
readline-common
  Depends: dpkg (>= 1.15.4)
  Depends: install-info
dpkg
  PreDepends: libbz2-1.0
  PreDepends: libc6 (>= 2.14)
  PreDepends: liblzma5 (>= 5.1.1alpha+20120614)
  PreDepends: libselinux1 (>= 2.1.0)
  PreDepends: tar (>= 1.23)
  PreDepends: zlib1g (>= 1:1.1.4)
liblzma5
  Depends: libc6 (>= 2.14)
  PreDepends: multiarch-support
libselinux1
  Depends: libc6 (>= 2.14)
  Depends: libpcre3
  PreDepends: multiarch-support
libpcre3
  Depends: libc6 (>= 2.14)
  PreDepends: multiarch-support
tar
  PreDepends: libacl1 (>= 2.2.51-8)
  PreDepends: libc6 (>= 2.17)
  PreDepends: libselinux1 (>= 1.32)
libacl1
  Depends: libattr1 (>= 1:2.4.46-8)
  Depends: libc6 (>= 2.14)
  PreDepends: multiarch-support
libattr1
  Depends: libc6 (>= 2.4)
  PreDepends: multiarch-support
zlib1g
  Depends: libc6 (>= 2.14)
  PreDepends: multiarch-support
install-info
  Depends: libc6 (>= 2.14)
  PreDepends: dpkg (>= 1.16.1)
libsqlite3-0
  Depends: libc6 (>= 2.14)
  PreDepends: multiarch-support
libssl1.0.0
  Depends: debconf (>= 0.5)
  Depends: debconf-2.0
  Depends: libc6 (>= 2.14)
  PreDepends: multiarch-support
debconf
  PreDepends: perl-base (>= 5.6.1-4)
perl-base
  PreDepends: dpkg (>= 1.14.20)
  PreDepends: libc6 (>= 2.14)
debconf-2.0
mime-support
python-minimal
  Depends: dpkg (>= 1.13.20)
  Depends: python2.7-minimal (>= 2.7.5-1~)
python2.7-minimal
  Depends: libpython2.7-minimal (= 2.7.6-8)
  Depends: zlib1g (>= 1:1.2.0)
  PreDepends: libc6 (>= 2.15)
python2.7
  Depends: libpython2.7-stdlib (= 2.7.6-8)
  Depends: mime-support
  Depends: python2.7-minimal (= 2.7.6-8)
python:any
ucf
  Depends: coreutils (>= 5.91)
  Depends: debconf (>= 1.5.19)
coreutils
  PreDepends: libacl1 (>= 2.2.51-8)
  PreDepends: libattr1 (>= 1:2.4.46-8)
  PreDepends: libc6 (>= 2.17)
  PreDepends: libselinux1 (>= 1.32)

En mi instalación limpia del servidor ubuntu, apt-rdependssolo se requiere libapt-pkg-perlpara la instalación. Es mucho más liviano entonces ubuntu-dev-tools, y aún así es recursivo, por lo que obtienes todas las dependencias, en lugar de solo las dependencias de primer orden, como los apt-cache dependsretornos.

Nombre falso
fuente
Lo siento si entendí mal, pero creo que apt-rdepends no es lo mismo que depende de la inversa. apt-rdepends enumera las dependencias recursivas de un paquete, mientras que depende de la inversa enumera los paquetes que dependen del paquete dado.
rsuarez
apt-rdepends -r enumera las dependencias inversas.
Keith
8

Puede haber una manera más fácil de hacer esto, pero se puede hacer si usa la función inversa. Necesitará instalar el paquete ubuntu-dev-tools haciendo

apt-get install ubuntu-dev-tools

O haciendo clic en este botón:

Instalar a través del centro de software

Una vez instalado, puede usar la función de inversión inversa para ver qué depende de un paquete específico. Por ejemplo, si intenta instalar algo que quiere instalar un montón de paquetes adicionales y quiere ver por qué se está instalando "libsmpeg0", ejecuta

reverse-depends libsmpeg0

Lo que daría como resultado lo siguiente.

Reverse-Recommends
==================
* sandboxgamemaker

Reverse-Depends
===============
* btanks
* fenix-plugin-mpeg [armel armhf i386 powerpc]
* fillets-ng
* gltron [amd64 armel i386 powerpc]
* libalien-sdl-perl
* libsdl-perl [i386]
* libsmpeg-dev
* libtaoframework-sdl1.2-cil
* python-pygame
* ruby-sdl
* sdlbrt
* smpeg-gtv
* smpeg-plaympeg
* tdfsb

Packages without architectures listed are reverse-dependencies in: amd64, armel, armhf, i386, powerpc

Eche un vistazo y vea si el paquete que desea instalar está en esa lista. De lo contrario, aparecerá otro de los paquetes que se está introduciendo durante esa instalación inicial en esa lista, y deberá ejecutarlo en reversa, depende de ese paquete. Eventualmente verá el paquete inicial que desea instalar en esa lista. En ese punto, debe tener una cadena que muestre exactamente por qué se instaló ese paquete.

Como nota adicional, creo que recomienda está activado de forma predeterminada, por lo que si algo se configura como recomendado, se activará. Sugiere si está desactivado, pero la dependencia inversa también puede mostrar esa información.

tgm4883
fuente
2
Si bien estoy seguro de que esta respuesta funcionaría, personifica el problema que el OP está tratando de evitar. ubuntu-dev-toolsda como resultado la instalación de los siguientes paquetes. bzr bzr-builddeb dctrl-tools debian-archive-keyring debian-keyring debootstrap devscripts diffstat distro-info distro-info-data dput genisoimage gettext hardening-includes intltool-debian libapt-pkg-perl libarchive-zip-perl libasprintf-dev libassuan0 libauthen-sasl-perl libautodie-perl libclone-perl libcommon-sense-perl libcroco3 libdigest-hmac-perl libdistro-info-perl libemail-valid-perl libencode-locale-perl liberror-perl
Nombre falso
2
[continuación] python-launchpadlib python-lazr.restfulclient python-lazr.uri python-oauth python-paramiko python-reportbug python-secretstorage python-simplejson python-soappy python-support python-wadllib python3-debian python3-magic quilt reportbug t1utils unzip wdiff xdelta (Nota: lo anterior era solo los paquetes necesarios de sudo apt-get install ubuntu-dev-toolsuna instancia de servidor ubuntu bastante limpia). Si está tratando de evitar la instalación de grandes cantidades de cruft, esta es probablemente la peor solución posible.
Nombre falso