Estoy tratando de configurar un entorno de prueba en una máquina virtual para probar las actualizaciones antes de aplicarlas a mi sistema principal.
Para hacerlo, realicé una instalación básica de Debian Wheezy (igual que en el sistema principal) en la VM, luego ejecuté como root desde dentro de la VM:
# dpkg --clear-selections
# dpkg --add-architecture i386
# apt-get update
# ssh [email protected] 'dpkg --get-selections | grep -v deinstall' |
dpkg --set-selections
Desafortunadamente, en mi caso se necesita la arquitectura i386; el sistema es nativo amd64.
El problema es con dpkg --set-selections
ejecutar en la máquina virtual. Tengo algunos paquetes que requieren un manejo especial (esos son en realidad la razón principal por la que quiero un entorno de prueba en primer lugar), pero cuando ejecuto el último comando anterior, obtengo un montón de líneas de salida como:
dpkg: warning: package not in database at line NNN: package-name
para paquetes que realmente deberían estar disponibles en el sistema base. Los ejemplos incluyen xterm
, yelp
y zip
.
Ahora mi pregunta:
¿Cuál es el proceso específico para transferir la lista de selección de paquetes de un sistema Debian a otro? (asumiendo el mismo nivel de versión de Debian, en Wheezy) y luego aplicando esos cambios posteriormente? El objetivo es que ambos tengan la misma lista de paquetes instalados, idealmente haciendo una diff
entre las salidas de dpkg --get-selections
o dpkg --list
en los dos vuelve sin mostrar diferencias.
grep -v deinstall
la parte se toma prestada de Impedir que los paquetes se eliminen después de hacer dpkg --set-selections
en Ask Ubuntu.
Cambié la fuente en la VM para que sea la misma que en el sistema principal, también instalé apt-transport-https
:
deb https://ftp-stud.hs-esslingen.de/debian/ wheezy main non-free
deb-src https://ftp-stud.hs-esslingen.de/debian/ wheezy main non-free
deb https://ftp-stud.hs-esslingen.de/debian/ wheezy-updates main non-free
deb-src https://ftp-stud.hs-esslingen.de/debian/ wheezy-updates main non-free
deb [arch=amd64] http://archive.zfsonlinux.org/debian wheezy main
Mirando el resultado de –set-selections, estoy viendo:
dpkg: warning: package not in database at line 1: a2ps
dpkg: warning: package not in database at line 1: abiword
dpkg: warning: package not in database at line 1: abiword-common
dpkg: warning: package not in database at line 1: abiword-plugin-grammar
dpkg: warning: package not in database at line 1: abiword-plugin-mathview
dpkg: warning: package not in database at line 1: accountsservice
dpkg: warning: package not in database at line 1: acl
dpkg: warning: package not in database at line 4: aglfn
dpkg: warning: package not in database at line 4: aisleriot
dpkg: warning: package not in database at line 4: alacarte
dpkg: warning: package not in database at line 4: alien
...
Los números de línea parecían extraños y la parte correspondiente de la salida de –get-selections es:
a2ps install
abiword install
abiword-common install
abiword-plugin-grammar install
abiword-plugin-mathview install
accountsservice install
acl install
acpi-support-base install
acpid install
adduser install
aglfn install
aisleriot install
alacarte install
alien install
Observe que entre acl
y aglfn
son acpi-support-base
, acpid
y adduser
para los que no se informan errores . Parece que los paquetes para los que se informan errores son un
según dpkg -l
, o dpkg -l
no tiene ninguna idea sobre ellos (dpkg-query: no packages found matching ...
). Sé que hay algunos paquetes instalados localmente, pero no muchos. i386
no figura hasta gcc-4.7-base:i386 install
mucho más abajo en la lista (línea 342 en la salida –get-selections).
Respuesta aceptada:
Para clonar una instalación de Debian, use apt-clone
utilidad. Está disponible (como un paquete separado, no como parte de la instalación predeterminada) en Debian desde Wheezy y en Ubuntu desde 12.04. En la máquina existente, ejecute
apt-clone clone foo
Esto crea un archivo foo.apt-clone.tar.gz
. Cópielo en la máquina de destino y ejecútelo
apt-get install apt-clone
apt-clone restore foo.apt-clone.tar.gz
Si está trabajando con un sistema antiguo donde apt-clone
no está disponible, o si solo desea replicar la lista de paquetes instalados pero no cualquier archivo de configuración, estos son los pasos manuales.
-
En la máquina de origen:
cat /etc/apt/sources.list /etc/apt/sources.list.d >sources.list dpkg --get-selections >selections.list apt-mark showauto >auto.list
-
En la máquina de destino:
cp sources.list /etc/apt/ apt-get update /usr/lib/dpkg/methods/apt/update /var/lib/dpkg/ dpkg --set-selections <selections.list apt-get dselect-upgrade xargs apt-mark auto <auto.list
Creo que está afectado por un cambio incompatible en dpkg que primero lo convirtió en sibilante. Consulte el error n.º 703092 para conocer los antecedentes.
La historia corta es que dpkg --set-selections
ahora solo acepta nombres de paquetes que están presentes en el archivo /var/lib/dpkg/status
o /var/lib/dpkg/available
. Si solo usa APT para administrar paquetes, como la mayoría de las personas, entonces /var/lib/dpkg/available
no se mantiene actualizado.
Después de ejecutar apt-get update
y antes de ejecutar dpkg --set-selections
y apt-get -u dselect-upgrade
, ejecute el siguiente comando:
apt-cache dumpavail >/tmp/apt.avail
dpkg --merge-avail /tmp/apt.avail
Desde jessie en adelante, puedes simplificar esto a
apt-cache dumpavail | dpkg --merge-avail
Alternativamente, ejecute
/usr/lib/dpkg/methods/apt/update /var/lib/dpkg/
o incluso más simple
apt-get install dctrl-tools
sync-available
Otro método simple que no requiere la instalación de un paquete adicional pero que descargará las listas de paquetes nuevamente es
dselect update
Consulte las preguntas frecuentes de dpkg para obtener más información. (Esto se menciona en la página de manual de dpkg, pero más de una manera que le recordaría el problema si ya lo sabía, ¡no de una manera que explique cómo resolver el problema!)
Tenga en cuenta que clonar la instalación de un paquete con dpkg --set-selections
no restaura la marca automática/manual en APT. Consulte Restauración de todos los datos y dependencias de dpkg –set-selections '*' para obtener más detalles. Puede guardar las marcas en el sistema de origen con
apt-mark showauto >auto.list
y restaurarlos en el sistema de destino con
xargs apt-mark auto <auto.list