2010-02-16 11 views
8

¿Hay alguna forma de obtener dpkg, apt-get o aptitude para generar una lista de los paquetes que deben instalarse en una segunda máquina para duplicar los paquetes instalados en una primera?¿Cómo puedo enumerar el conjunto mínimo de paquetes Debian necesarios para recrear un conjunto de paquetes instalados?

es decir, si he instalado un servidor de Ubuntu llano, eligió la opción sshd durante la instalación, a continuación, instalado build-essential que se puede esperar la salida de mirar algo como:

#ubuntu 9.10 server 
openssh-sshd 
build-essential 

Por lo que puede 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 otros paquetes que sshd y build-essential incorporaron, 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.

¿Esto es posible?

Respuesta

11

deborphan, tipo de. Construye una lista de cada paquete en su sistema, calcula qué depende de qué, e imprime los paquetes que no tienen dependencias. De forma predeterminada, solo imprime las bibliotecas (para facilitar la búsqueda de las bibliotecas instaladas por otros paquetes y que ya no son necesarias, de ahí el nombre). Tiene opciones para hacer lo que quieras, principalmente. Lo ejecuto como:

deborphan -anp required --no-show-section

-a especifica todos los paquetes (no sólo bibliotecas)
-n ignora "Sugiere" o "Recomendación" dependencia de control (es decir, justo "depende")
-p required listas de todos los paquetes a pesar prioridad
--no-show-section no indica en qué parte de Debian está, solo una buena función de formato que puede serle útil para compilar una lista.

Ahora, perderá paquetes, porque algunos paquetes tienen dependencias circulares. Pero esos tienden a ser bastante poco comunes, por lo que debe acercarse lo suficiente.

+0

¿Por qué 'deborphan -anp requerido --no-show-section' incluye 'gcc' en su salida, cuando 'apt-rdepends build-essential' muestra que 'build-essential' depende de 'gcc'? – fadedbee

+0

¿Está mostrando una versión específica de gcc, como gcc-4.3, o el paquete gcc en sí? Si es el paquete 'gcc', ¿quizás build-essential realmente no está instalado? ... no hay buenas suposiciones, lo siento. En mi salida, veo build-essential pero no gcc. –

1

Entonces, ¿desea la lista de paquetes que se instalaron explícitamente (como, por ejemplo, ubuntu-desktop y openssh), y no las autodependencias? No estoy seguro, pero creo que eso es lo que hace dpkg --get-selections. Por lo tanto, se puede hacer

dpkg --get-selections > file 

Y luego, en el otro equipo, utilice el mismo "archivo" y ejecutar

dpkg --set-selections < file 
apt-get dselect-upgrade 

No estoy totalmente seguro de que esos comandos Eso sí, seleccionados manualmente paquetes, sin embargo, y actualmente estoy lejos de cualquier sistema basado en Debian para verificar. :)

+0

No, parece que enumera los paquetes que se extrajeron como dependencias. En mi máquina, la lista incluye paquetes como g ++, g ++ - 4.4, gcc ... que sé que fueron instalados por build-essential. – fadedbee

2

El código que publicó dannysauer es un comienzo. Una vez que tenga una lista de paquetes que incluye dependencias, puede usar apt-rdepends para encontrar las dependencias para un paquete en particular (consulte this page, por ejemplo, uso y resultados).

esquema Procedimiento

  1. iterar a través de la lista de paquetes devuelto por el código del dannysauer
  2. llamada apt-rdepends en cada
  3. Eliminar todos los paquetes de la lista que aparece en la salida del apt-rdepends
+0

Creo que esto también es un enfoque viable, pero parece más lento y más trabajo que deborphan. ¿Hay algún problema con el uso de deborphan que apt-rdepends resuelva? – fadedbee

+0

IIRC, 'deborphan' solo hace una lista de paquetes instalados que no tienen nada que dependa de ellos. Puede que esto no sea lo que quieres (mira el comentario de Eric anterior sobre 'deborphan' posiblemente paquetes faltantes). En caso de que tengas problemas, mencioné 'apt-rdepends' porque siempre puedes obtener una lista completa de todos los paquetes instalados fuera de ambas máquinas, eliminar paquetes comunes a ambas listas y examinar los paquetes restantes con' apt-rdepends' para generar la lista más corta posible de paquetes que recrearán su conjunto de paquetes actual en la segunda máquina. Esto también debería ser fácilmente programable. – bta

0

Qué tal 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?

Cuestiones relacionadas