La imagen VM del servidor Ubuntu 16.04 aparentemente inicia el "apt-daily.service" cada 12 horas más o menos; Este servicio realiza varias tareas relacionadas con APT, como actualizar la lista de paquetes disponibles, realizar actualizaciones desatendidas si es necesario, etc.
Al comenzar desde una "instantánea" de VM, el servicio se activa de inmediato , ya que (supongo) systemd se da cuenta rápidamente de que el temporizador debería haberse apagado hace mucho tiempo.
Sin embargo, un APT en ejecución evita que otros apt
procesos se ejecuten ya que mantiene un bloqueo activado /var/lib/dpkg
. El mensaje de error que indica esto se ve así:
E: Could not get lock /var/lib/dpkg/lock-frontend - open (11: Resource temporarily unavailable)
E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?
Necesito deshabilitar esta tarea APT automatizada hasta que Ansible haya completado la configuración de la máquina (que generalmente implica la instalación de paquetes); Consulte https://github.com/gc3-uzh-ch/elasticluster/issues/304 para obtener más información y contexto.
He probado varias opciones para deshabilitar la función de "actualizaciones desatendidas" a través de un script de "datos de usuario" cloud-init
, pero todas han fallado hasta ahora.
1. Deshabilitar la tarea systemd
La tarea systemd apt-daily.service
es activada por apt-daily.timer
. He intentado deshabilitar uno u otro, o ambos, con varias combinaciones de los siguientes comandos; aún así, apt-daily.service
se inicia momentos después de que la VM esté lista para aceptar conexiones SSH ::
#!/bin/bash
systemctl stop apt-daily.timer
systemctl disable apt-daily.timer
systemctl mask apt-daily.service
systemctl daemon-reload
2. Deshabilitar la opción de configuración APT::Periodic::Enable
El script /usr/lib/apt/apt.systemd.daily
lee algunas variables de configuración APT; la configuración APT::Periodic::Enable
deshabilita la funcionalidad por completo (líneas 331--337). He intentado deshabilitarlo con el siguiente script ::
#!/bin/bash
# cannot use /etc/apt/apt.conf.d/10periodic as suggested in
# /usr/lib/apt/apt.systemd.daily, as Ubuntu distributes the
# unattended upgrades stuff with priority 20 and 50 ...
# so override everything with a 99xxx file
cat > /etc/apt/apt.conf.d/99elasticluster <<__EOF
APT::Periodic::Enable "0";
// undo what's in 20auto-upgrade
APT::Periodic::Update-Package-Lists "0";
APT::Periodic::Unattended-Upgrade "0";
__EOF
Sin embargo, a pesar de APT::Periodic::Enable
tener valor 0
desde la línea de comandos (ver más abajo), el unattended-upgrades
programa aún se ejecuta ...
ubuntu@test:~$ apt-config shell AutoAptEnable APT::Periodic::Enable
AutoAptEnable='0'
3. Eliminar por /usr/lib/apt/apt.systemd.daily
completo
El siguiente cloud-init
script elimina por completo el script de actualizaciones desatendidas:
#!/bin/bash
mv /usr/lib/apt/apt.systemd.daily /usr/lib/apt/apt.systemd.daily.DISABLED
Aún así, la tarea se ejecuta y puedo verla en la tabla de procesos. aunque el archivo no existe si se prueba desde la línea de comando ::
ubuntu@test:~$ ls /usr/lib/apt/apt.systemd.daily
ls: cannot access '/usr/lib/apt/apt.systemd.daily': No such file or directory
Parece que el cloud-init
script (junto con la línea de comandos SSH) y el proceso raíz del sistema se ejecutan en sistemas de archivos y espacios de proceso separados ...
Preguntas
¿Hay algo obvio que me estoy perdiendo? ¿O hay alguna magia de espacio de nombres que no conozco?
Lo más importante es: ¿Cómo puedo desactivar el apt-daily.service
a través de un
cloud-init
guión?
fuente
--now
bandera en elsystemctl disable
comando para que el cambio sea efectivo de inmediato. Ese fue mi problema.disable --now
es equivalente astop
seguido pordisable
.Respuestas:
Sí, había algo obvio que me faltaba.
Systemd tiene que ver con arranque simultáneo de los servicios, por lo que el
cloud-init
script se ejecuta al mismo tiempo elapt-daily.service
se dispara. Para cuandocloud-init
llega el momento de ejecutar la carga útil especificada por el usuario,apt-get update
ya se está ejecutando. Por lo tanto, los intentos 2. y 3. fallaron no debido a alguna magia de espacio de nombres, sino porque alteraron el sistema demasiado tarde paraapt.systemd.daily
recoger los cambios.Esto también significa que básicamente no hay forma de evitar que se
apt.systemd.daily
ejecute, solo se puede matar después de que se haya iniciado.Este script de "datos de usuario" toma esta ruta ::
Todavía hay una ventana de tiempo durante la cual los inicios de sesión SSH son posibles, pero
apt-get
no se ejecutarán, pero no puedo imaginar otra solución que funcione en la imagen de la nube Ubuntu 16.04.fuente
apt-get -o Acquire::http::AllowRedirect=false update
Nota: Desafortunadamente, parte de la solución a continuación no funciona en los sistemas Ubuntu 16.04 (como el del interrogador) porque la
systemd-run
invocación sugerida solo funciona en Ubuntu 18.04 y superior (ver los comentarios para más detalles ). Dejaré la respuesta aquí porque esta pregunta sigue siendo un éxito popular, independientemente de la versión de Ubuntu que esté utilizando ...En Ubuntu 18.04 (y superior) puede haber hasta dos servicios involucrados en el tiempo de arranque para actualizar / actualizar. El primero
apt-daily.service
actualiza la lista de paquetes. Sin embargo, puede haber un segundoapt-daily-upgrade.service
que realmente instale paquetes críticos de seguridad. Una respuesta a la pregunta "Finalizar y deshabilitar / eliminar la actualización desatendida antes de que el comando regrese" ofrece un excelente ejemplo de cómo esperar a que ambos terminen (copiados aquí por conveniencia):(tenga en cuenta que esto debe ejecutarse como root). Si está intentando deshabilitar estos servicios en futuras botas, deberá enmascarar AMBOS servicios:
Alternativamente, puede
systemctl disable
ambos servicios Y sus temporizadores asociados (es decir,apt-daily.timer
yapt-daily-upgrade.timer
).Tenga en cuenta que las técnicas de enmascaramiento / desactivación en esta respuesta solo evitan la actualización / actualización en futuras botas; no las detendrán si ya se están ejecutando en el arranque actual.
fuente
systemd-run
en cuenta que en Ubuntu 16.04 es demasiado antiguo para admitir la--wait
opción, pero realmente no debería ser necesario para el propósito en cuestión. (De acuerdo con la página del manual,--wait
espera la terminación de una unidad, pero es suficiente para esperar su inicio, que es el comportamiento predeterminado desystemd-run
).systemd-run
encantamiento dado no funciona en Ubuntu 16.04 en absoluto; muere con mensaje de error Asignación desconocida Después = apt-daily.service apt-daily-upgrade.service . Parece que algunas propiedades de la unidad no estaban disponiblessystemd-run
, ver por ejemplo aquíPuede deshabilitar esto a través del módulo "bootcmd" cloud-init. Esto se ejecuta antes de que aparezca la red, lo cual es necesario antes de que apt update pueda tener la oportunidad de ejecutarse.
Una vez que ingrese a la instancia, también debe esperar a que finalicen las fases finales de cloud-init, ya que mueve las fuentes / listas aptas.
Esto también es útil para ver qué tan temprano se ejecuta bootcmd:
Puede verificar que esto funcionó de la siguiente manera:
fuente
No sería más fácil enmascarar la unidad
?
fuente
ls -al /etc/systemd/system/ | grep alsa lrwxrwxrwx 1 root root 9 Sep 1 13:17 alsa-init.service -> /dev/null
Los datos están vacíos.sudo dpkg-reconfigure -plow unattended-upgrades
Me deshago de la actualización desatendida y la pierdo. Entonces el estado de la unidad apt-daily.service está muerto.apt-daily.service
uncloud-init
script y antes de que comience después del reinicio de VM: esto significa: (1) debe hacerse de forma no interactiva, (2) debe hacerse antes de losapt-daily.service
incendios por primera vez. (Si mi comprensión de systemd es correcta, (2) en realidad no se puede lograrcloud-init
yapt-daily
ejecutar simultáneamente; vea mi propia respuesta para más información.)Esto espera 1 segundo en un ciclo y comprueba si se libera el bloqueo.
fuente