La imagen de la máquina virtual 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.
Cuando se inicia desde una "instantánea" de VM, el servicio se activa inmediatamente , como (supongo
) systemd se da cuenta rápidamente de que el temporizador debería haberse disparado hace mucho tiempo.
Sin embargo, un APT en ejecución impide que otros apt
los procesos se ejecuten ya que tiene un bloqueo
en /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 (lo 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.
Probé varias opciones para deshabilitar la función de "actualizaciones desatendidas"
a través de un script de "datos de usuario" para cloud-init
, pero todos han fallado hasta
hasta ahora.
1. Deshabilitar la tarea systemd
tarea systemd apt-daily.service
es activado por apt-daily.timer
. He intentado
deshabilitar uno u otro, o ambos, con varias combinaciones de los siguientes comandos
; aún así, el apt-daily.service
se inicia momentos después de que la máquina virtual 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
Script /usr/lib/apt/apt.systemd.daily
lee algunas variables de configuración de APT
; la configuración APT::Periodic::Enable
desactiva 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
teniendo valor desde la línea de comando
(ver más abajo), las unattended-upgrades
el programa aún se está ejecutando...
[email protected]:~$ apt-config shell AutoAptEnable APT::Periodic::Enable
AutoAptEnable='0'
3. Eliminar /usr/lib/apt/apt.systemd.daily
en total
El siguiente cloud-init
el script elimina el script de actualizaciones desatendidas
por completo::
#!/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::
[email protected]:~$ ls /usr/lib/apt/apt.systemd.daily
ls: cannot access '/usr/lib/apt/apt.systemd.daily': No such file or directory
Parece que cloud-init
script (junto con la línea de comandos SSH)
y el proceso systemd raíz se ejecutan en sistemas de archivos y espacios de proceso
separados...
Preguntas
¿Hay algo obvio que me estoy perdiendo? ¿O hay algo mágico en el espacio de nombres
del que no estoy al tanto?
Lo más importante:¿cómo puedo desactivar el apt-daily.service
? a través de uncloud-init
guión?
Respuesta aceptada:
Sí, había algo obvio que me estaba perdiendo.
Systemd tiene que ver con el inicio simultáneo de servicios, por lo que cloud-init
el script
se ejecuta al mismo tiempo el apt-daily.service
se desencadena. Para cuando cloud-init
consigue ejecutar la carga útil especificada por el usuario, apt-get update
ya está
ejecutándose. Así que los intentos 2. y 3. fallaron no debido a algún espacio de nombres
magia, sino porque alteraron el sistema demasiado tarde para apt.systemd.daily
para
recoger los cambios.
Esto también significa que básicamente no hay forma de prevenir apt.systemd.daily
de correr:uno solo puede matarlo después de que haya comenzado.
Este script de "datos de usuario" toma esta ruta::
#!/bin/bash
systemctl stop apt-daily.service
systemctl kill --kill-who=all apt-daily.service
# wait until `apt-get updated` has been killed
while ! (systemctl list-units --all apt-daily.service | egrep -q '(dead|failed)')
do
sleep 1;
done
# now proceed with own APT tasks
apt install -y python
Todavía hay una ventana de tiempo durante la cual los inicios de sesión SSH son posibles aún apt-get
no se ejecutará, pero no puedo imaginar otra solución que pueda funcionar en la imagen de nube stock
Ubuntu 16.04.