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?
--now
bandera en el systemctl disable
comando para que el cambio sea efectivo de inmediato. Ese fue mi problema.
disable --now
es equivalente a stop
seguido por disable
.