Como probablemente ya sepa, de manera predeterminada cuando instala un paquete en un sistema basado en Debian o Ubuntu, si el paquete contiene un servicio, ese servicio generalmente se habilitará y se iniciará automáticamente cuando instale el paquete.
Esto es un problema para mi.
Me encontré necesitando administrar plantillas para construir contenedores LXC. Hay varios contenedores, cada uno correspondiente a una versión de Debian o Ubuntu. (También hay contenedores basados en Red Hat, pero no son relevantes aquí).
/var/lib/libvirt/filesystems/debian6_template
/var/lib/libvirt/filesystems/debian7_template
/var/lib/libvirt/filesystems/ubuntu1004_template
/var/lib/libvirt/filesystems/ubuntu1204_template
Ocasionalmente, encontraré que las plantillas tienen un paquete faltante o que necesitan algún otro cambio, por lo que las utilizaré para instalar el paquete. ¡Desafortunadamente cuando hago eso, termino con varias copias del servicio del paquete ejecutándose!
A modo de ejemplo, descubrí que las plantillas no tenían un demonio syslog, así que instalé uno:
for template in /var/lib/libvirt/filesystems/{debian,ubuntu}*_template; do
chroot $template apt-get install rsyslog
done
Y rápidamente terminó con cuatro copias de rsyslog ejecutándose. Sin mencionar dos copias de exim4. ¡Uy!
Leí en alguna parte (aunque no puedo encontrarlo de nuevo ahora) que no se supone que inicie los servicios cuando se ejecuta en un chroot, pero eso claramente no está sucediendo aquí.
Un truco desagradable potencialmente viable requiere reemplazar temporalmente los diversos comandos que realmente inician servicios, como start-stop-daemon
y initctl
, aunque esto es mucho más trabajo de lo que realmente quería hacer. Si no tengo otra opción, sin embargo ...
La solución ideal aquí sería que los sistemas basados en Debian dejen de hacer esta basura, pero en su defecto, ¿tal vez una opción de línea de comando oscura o indocumentada apt-get
?
En caso de que no estuviera claro, realmente quiero mantener todo lo relacionado con la administración de las plantillas fuera de las plantillas, si es posible.
fuente
Tu puedes hacer:
No lo he probado con chroot, pero debería funcionar. Al principio, establece la variable de entorno RUNLEVEL, por lo que los procesos iniciados por apt-get no iniciarán ningún servicio, ya que "pensarán" que el sistema se está ejecutando en modo único. A medida que el entorno se modifica de la manera en que puede afectar los comandos futuros, es necesario salir del shell cuando el entorno modificado ya no es necesario, esto se logra mediante el comando de salida al final. No puede haber algunos paquetes (raro?) Que no se instalará correctamente en el modo sencillo (pero que yo sepa esto no debería ser un problema en la mayoría de los casos).
fuente
export RUNLEVEL=1
la parte importante aquí? ¿Qué hace que suceda exactamente?rsyslog
resultó ser uno de los paquetes "raros" que explotó por completo al intentar instalar de esta manera. Sin embargo, esto puede ser útil, por lo que puede mantener el voto a favor :)