Actualizaciones automáticas · 9 min read · Jan 14, 2026

Actualizaciones automáticas con unattended-upgrades en Debian y Ubuntu

Las versiones de Linux reciben actualizaciones con frecuencia, y las actualizaciones de seguridad deben instalarse de inmediato. Debian y Ubuntu utilizan el sistema APT, y aunque es relativamente fácil instalar todas las actualizaciones pendientes manualmente, el administrador puede no recordar hacerlo o preferir dormir por la noche en lugar de verificar actualizaciones. Este artículo es principalmente para instalaciones de servidor.

Actualizar e instalar paquetes manualmente usando apt upgrade sigue siendo posible al usar unattended-upgrades. Si una actualización iniciada por unattended-upgrades está en ejecución cuando se usa apt desde la línea de comandos, el sistema apt informa al usuario que ya hay una operación en progreso y el usuario debe esperar hasta que termine antes de continuar con la emisión de comandos apt.

Una forma fácil para administradores ocupados

Instala unattended-upgrades, verifica que esté habilitado y monitorea su funcionamiento desde los archivos de registro.

apt install unattended-upgrades
dpkg-reconfigure -plow unattended-upgrades

El comando dpkg-reconfigure muestra un cuadro de diálogo que pregunta sí o no para descargar e instalar automáticamente actualizaciones de seguridad estables. Verifica que se responda que sí.

unattended-upgrades verifica actualizaciones dos veces al día en momentos aleatorios e instala actualizaciones de seguridad estables.

Monitorea lo que está sucediendo leyendo los archivos de registro en el directorio /var/log/unattended-upgrades/ y el archivo /var/log/dpkg.log.

Dónde encontrar documentación

El archivo de configuración /etc/apt/apt.conf.d/50unattended-upgrades tiene documentación en los comentarios. Este documento se refiere a ese archivo de ahora en adelante como 50unattended-upgrades.

El archivo readme /usr/share/doc/unattended-upgrades/README.md.gz tiene instrucciones útiles. Se puede leer con el comando zless (disponible desde el paquete gzip). Este documento se refiere a ese archivo de ahora en adelante como README.

La wiki de Debian tiene una página https://wiki.debian.org/UnattendedUpgrades.

La página de documentación del servidor Ubuntu tiene un capítulo “Actualizaciones Automáticas” sobre unattended-upgrades.

Página de manual de unattended-upgrade, man unattended-upgrade.

Configuración avanzada

Usando la forma fácil notarás que no todas las actualizaciones se instalan automáticamente. También puedes querer más control sobre lo que está sucediendo automáticamente además de instalar actualizaciones.

El archivo de configuración /etc/apt/apt.conf.d/50unattended-upgrades tiene documentación incluida en los comentarios, así que lee el archivo para examinar qué configuraciones están disponibles. Es muy útil configurar unattended-upgrades para enviar correos electrónicos cuando algo sucede.

Es importante saber que el archivo de configuración se crea con la instalación o actualización del paquete unattended-upgrades, por lo que cuando unattended-upgrades se actualiza o al pasar a la siguiente versión del sistema operativo, las ediciones realizadas en este archivo causan conflictos que deben resolverse manualmente. El archivo de documentación README sugiere crear el archivo 52unattended-upgrades-local en lugar de modificar el archivo de configuración original.

Si lo deseas, puedes verificar el archivo /etc/apt/apt.conf.d/20auto-upgrades que contiene estas líneas:

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";

Si ejecutaste el comando dpkg-reconfigure y respondiste que sí, las líneas deberían estar ahí. Las líneas controlan la habilitación de unattended-upgrades.

Enviar correo electrónico

Para que el envío de correos electrónicos funcione, el host debe tener un sistema de correo electrónico que funcione y que pueda enviar correos electrónicos. Verifica eso primero.

Habilita el envío de correos electrónicos desde unattended-upgrades editando el archivo de configuración 52unattended-upgrades-local (crea el archivo si no existe en el directorio /etc/apt/apt.conf/). Copia la línea

//Unattended-Upgrade::Mail "";

desde 50unattended-upgrades, descoméntala y agrega la dirección de correo electrónico de destino entre las comillas.

También hay una configuración para configurar si se envía un correo electrónico siempre que unattended-upgrades realice una actualización, o solo en errores.

// Establece este valor en "true" para recibir correos electrónicos solo en errores. El valor predeterminado
// es siempre enviar un correo si Unattended-Upgrade::Mail está configurado
//Unattended-Upgrade::MailOnlyOnError "false";

Si deseas cambiar la configuración, copia las líneas a 52unattended-upgrades-local, descomenta la línea de configuración y cambia “false” a “true”.

Verificar con

unattended-upgrade --dry-run -d

es una buena idea después de modificar el archivo de configuración.

Al menos en Debian 10, 11 y Ubuntu 22.04, la instalación de unattended-upgrades crea un enlace simbólico unattended-upgrades a unattended-upgrade en el directorio /usr/bin/ y/o /bin/, por lo que ambos comandos funcionan igual.

$ ls -lhi /bin/unattended-upgrade*
11404505 -rwxr-xr-x 1 root root 98K tammi  15  2022 /bin/unattended-upgrade
11407087 lrwxrwxrwx 1 root root  18 tammi  15  2022 /bin/unattended-upgrades -> unattended-upgrade

Agregar repositorio

Agregar un repositorio del cual actualizar automáticamente se hace agregando líneas a Unattended-Upgrade::Origins-Pattern. Hay documentación sobre esto en el archivo de configuración.

El README instruye que las configuraciones en el archivo de configuración posterior 52unattended-upgrades-local anulan las configuraciones predeterminadas. Intenté y encontré que establecer Unattended-Upgfade::Origins-Pattern no anula completamente lo que se estableció en el archivo predeterminado, en su lugar, se agrega a los valores predeterminados. Por lo tanto, no es necesario copiar el patrón completo predeterminado de Unattended-Upgrade::Origins-Pattern, se puede agregar.

Por ejemplo, el paquete goaccess no se actualiza automáticamente cuando se instala desde el Repositorio Oficial de GoAccess. Se actualizaría automáticamente si se instalara desde el repositorio habitual de Debian (está disponible en ambos). Agregar el repositorio de GoAccess al Origins-Pattern hace que unattended-upgrades realice la actualización.

Examina la situación con apt list –upgradable:

root@posti:~# LANG=C apt list --upgradable 
Listing... Done
goaccess/unknown 2:1.6.3-buster amd64 [upgradable from: 2:1.6.2-buster]
php-tcpdf/buster-backports 6.5.0+dfsg1-1~bpo10+1 all [upgradable from: 6.3.5+dfsg1-1~bpo10+1]
root@posti:~#

Así que hay dos paquetes que no se actualizaron automáticamente por unattended-upgrades. Examinar goaccess muestra que proviene del Repositorio Oficial de GoAccess (y una versión anterior del repositorio habitual de Debian).

root@posti:~# LANG=C apt policy goaccess
goaccess:
  Installed: 2:1.6.2-buster
  Candidate: 2:1.6.3-buster
  Version table:
     2:1.6.3-buster 500
        500 https://deb.goaccess.io buster/main amd64 Packages
 *** 2:1.6.2-buster 100
        100 /var/lib/dpkg/status
     1:1.2-4+b10 500
        500 http://mirror.hetzner.de/debian/packages buster/main amd64 Packages
        500 http://deb.debian.org/debian buster/main amd64 Packages
    root@posti:~#

Ejecutar unattended-upgrade –dry-run -d muestra qué orígenes tienen los paquetes no instalados. Esto puede ayudar a averiguar qué necesita ser agregado al Origins-Pattern.

Examinar el registro de la última ejecución de actualizaciones no atendidas muestra qué orígenes se consideran al actualizar automáticamente:

2022-09-05 08:28:08,955 INFO Checking if system is running on battery is skipped. Please install
    powermgmt-base package to check power status and skip installing updates when the system
    is running on battery.
2022-09-05 08:28:08,960 INFO Initial blacklist : 
2022-09-05 08:28:08,960 INFO Initial whitelist: 
2022-09-05 08:28:08,960 INFO Starting unattended upgrades script
2022-09-05 08:28:08,960 INFO Allowed origins are: 
origin=Debian,codename=buster,label=Debian, 
origin=Debian,codename=buster,label=Debian-Security

El repositorio de GoAccess aún no está allí, así que ahora lo agrego a /etc/apt/apt.conf.d/52unattended-upgrades-local.

Como un apunte, si has instalado unattended-upgrades en una laptop, considera instalar powermgmt-base. Usando eso, unattended-upgrades no inicia actualizaciones cuando está funcionando con batería, como informa el mensaje de información en el registro. Si se ejecuta en un servidor que siempre está conectado a la energía, ese mensaje de información ya no se muestra con Unattended-Upgrade::OnlyOnACPower “false”; agregado a la configuración.

Unattended-Upgrade::Origins-Pattern {
// Taleman added GoAccess 2022-09-05
        "o=GoAccess Repository, n=buster, l=Official GoAccess Repository";
};
Unattended-Upgrade::OnlyOnACPower "false";

apt policy no mostró el campo a para GoAccess, así que utilicé o, n y l. Encuentra información sobre estos campos en README.

La sustitución de variables es compatible para ${distro_id} que contiene la salida de lsb_release -i y ${distro_codename} que contiene la salida de lsb_release -c. Así que en lugar de n=buster podría haber escrito n=${distro_codename}.

Hubo dos paquetes que no se actualizaron automáticamente, el otro que aún no se actualizó es php-tcpdf. Por supuesto, se puede actualizar con apt upgrade, pero se puede agregar a unattended-upgrades para que se actualice automáticamente. El procedimiento es el mismo que para goaccess.

Primero examina la situación con apt policy php-tcpdf. Eso muestra que está instalado desde la sección del repositorio de Debian buster-backports.

Desde unattended-upgrades.log se puede ver que buster-backports no está entre los orígenes permitidos. Está en el archivo 50unattended-upgrades pero comentado. Para habilitarlo, copia la línea

// "o=Debian Backports,a=${distro_codename}-backports,l=Debian Backports";

al 52unattended-upgrades-local dentro de la configuración de Origins-Pattern y descomenta.

Después de editar el archivo, verifica con unattended-upgrades –dry-run -d que el repositorio agregado ahora está entre los “Orígenes permitidos” y php-tcpd está entre los paquetes que se actualizarán.

Controlar tiempos

Unattended-upgrades se ejecuta en momentos aleatorios para aliviar la carga en los servidores de repositorio. Esto es para evitar picos de carga grandes que ocurrirían si todos los hosts comenzaran a hacer actualizaciones al mismo tiempo. Piensa cuidadosamente si decides cambiar este comportamiento. Si ejecutas tu propio repositorio o espejo de repositorio, entonces los picos de carga afectan a tu servidor de repositorio y evitas molestar a los administradores de repositorios en Internet.

Es systemd quien controla a qué horas comienza unattended-upgrades. El archivo /lib/systemd/system/apt-daily.timer tiene una sección Timer que inicia actividades de descarga de apt dos veces al día con un retraso aleatorio de 12 horas. Te sugiero que no modifiques esto, o que tengas muy buenas razones para modificarlo.

El resto de las configuraciones de tiempo se realizan en los archivos 50unattended-upgrades y 52unattended-upgrades-local.

La configuración Unattended-Upgrade::Update-Days controla los días de la semana en que se ejecuta unattended-upgrades. El valor predeterminado está vacío, lo que significa que se ejecuta todos los días. Se puede configurar para ejecutarse, por ejemplo, solo los sábados y domingos.

Reinicio automático

Unattended-upgrades se puede configurar para reiniciar cuando las actualizaciones instaladas requieren un reinicio. Esto se puede configurar para que ocurra inmediatamente o a una hora deseada. Estas configuraciones utilizan los ajustes

//Unattended-Upgrade::Automatic-Reboot "false";
//Unattended-Upgrade::Automatic-Reboot-WithUsers "true";
//Unattended-Upgrade::Automatic-Reboot-Time "02:00";

El valor predeterminado es sin reinicio automático. Si cambias la configuración a “true”, el reinicio ocurre inmediatamente después de que se instala la actualización. Automatic-Reboot-Time se puede establecer para hacer el reinicio a una hora deseada si hay actualizaciones instaladas que requieren un reinicio.

Listas negras, listas blancas

Una lista negra evita que un paquete, que de otro modo sería actualizado por unattended-upgrades, sea actualizado. La configuración Package-Blacklist contiene expresiones regulares. Si el nombre del paquete coincide, se excluye de la actualización automática.

No he utilizado esta función, creo que puede ser más útil si se ejecuta una versión de desarrollo donde tiene sentido prevenir la actualización automática de paquetes críticos. El archivo de configuración 50unattended-upgrades proporciona ejemplos de paquetes en la lista negra.

El README habla sobre la configuración Package-Whitelist. La descripción dice “Solo los paquetes que coincidan con las expresiones regulares en esta lista serán marcados para actualización.” No ofrece ejemplos para aclarar en qué casos sería deseable establecer la lista blanca. Según mis experimentos, parece que agregar paquetes a la lista blanca significa que solo esos paquetes se actualizan automáticamente, nada más.

Conclusión

Ahora sabes lo que unattended-upgrades puede hacer y cómo hacer que haga lo que deseas.

Hay casos en los que unattended-upgrades no realiza la actualización porque el comando apt upgrade mantiene un paquete en espera. Esto sucede cuando la actualización eliminaría un paquete o instalaría un paquete que anteriormente no estaba instalado. Para hacer que la actualización ocurra, hazlo tú mismo con el comando apt full-upgrade que puede eliminar paquetes o instalar nuevos paquetes que anteriormente no estaban instalados. Si unattended upgrades está configurado para enviar correos electrónicos, el correo electrónico contiene la línea

Packages with upgradable origin but kept back:

Un ejemplo final de 52unattended-upgrades-local de uno de mis hosts:

Unattended-Upgrade::Origins-Pattern {
// Taleman added 2022-09-05
        "o=GoAccess Repository, n=buster, l=Official GoAccess Repository";
        "o=Debian Backports,a=${distro_codename}-backports,l=Debian Backports";
    "origin=deb.sury.org,archive=${distro_codename}";
};

Unattended-Upgrade::Mail "[email protected]";
Unattended-Upgrade::OnlyOnACPower "false";
Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.