¿Cómo puedo enumerar el conjunto mínimo de paquetes de Debian necesarios para recrear un conjunto de paquetes instalados?
Pregunta
¿Hay alguna forma de hacer que dpkg, apt-get o aptitude produzcan una lista de los paquetes que deben instalarse en una segunda máquina para duplicar los paquetes instalados en la primera?
es decir.Si instalé un servidor Ubuntu simple, elegí la opción sshd en el momento de la instalación y luego instalé build-essential, esperaría que el resultado se viera así:
#ubuntu 9.10 server
openssh-sshd
build-essential
Hasta donde puedo ver, todas las herramientas de empaquetado disponibles producirán una lista detallada de los paquetes en una caja.No estoy interesado en openssh libs, ld, gcc y todos los demás paquetes extraídos por sshd y build-essential, ya que se instalarán cuando instale sshd y build-essential.
Me gustaría ver solo la lista del paquete que necesito instalar para recrear mi conjunto actual de paquetes en otra máquina.
es posible?
Solución
deborphan
, de tipo. Se crea una lista de todos los paquetes en su sistema, se da cuenta de lo que depende de lo que, e imprime los paquetes que no tienen ninguna dependencia. Por defecto sólo muestra las bibliotecas (para que sea más fácil encontrar las bibliotecas que fueron instalados por otros paquetes y ya no se necesita, de ahí el nombre). Cuenta con opciones para hacer lo que quiere, en su mayoría. Lo ejecuto como:
deborphan -anp required --no-show-section
-a
especifica todos los paquetes (no sólo las bibliotecas)
-n
ignora "sugiere" o "Recomienda" comprobación de dependencia (es decir simplemente "depende")
-p required
enumera todos los paquetes a pesar prioridad
--no-show-section
no indica qué parte de Debian que se encuentra, sólo una buena característica de formato que pueda ser útil para la construcción de una lista.
Ahora, se perderá paquetes, debido a que algunos paquetes tienen dependencias circulares. Pero aquellos que tienden a ser bastante raro, por lo que debe conseguir lo suficientemente cerca.
Otros consejos
El código que ha escrito dannysauer es un comienzo. Una vez que tenga una lista de paquetes que incluye dependencias, puede utilizar apt-rdepends
para encontrar el dependencias de un paquete particular (véase esta página por ejemplo el uso y la salida).
contornos Procedimiento
- iterar a través de la lista de paquetes devuelto por el código del dannysauer
- Llamada
apt-rdepends
en cada - Eliminar todos los paquetes de la lista que aparece en la salida del
apt-rdepends
Entonces, ¿desea la lista de paquetes que se instalaron explícitamente (como, por ejemplo, ubuntu-desktop y openssh), y no las dependencias automáticas?No soy positivo, pero creo que eso es lo que dpkg --get-selections
hace.Entonces, puedes hacer
dpkg --get-selections > file
Y luego, en la otra computadora, use el mismo "archivo" y ejecute
dpkg --set-selections < file
apt-get dselect-upgrade
no soy absolutamente positivo Sin embargo, esos comandos solo seleccionan paquetes manualmente y actualmente no tengo ningún sistema basado en Debian para verificar.:)
¿Qué hay de esto:
#!/bin/bash
packages=$(dpkg --get-selections | grep '[[:space:]]install$' | awk '{print $1}')
for pkg in $packages
do
nr_lines=$(apt-cache -i rdepends $pkg | wc -l )
if [ "$nr_lines" = "2" ]
then
echo $pkg
fi
done
¿Funciona bien? Se puede mejorar de alguna manera?