Cuando administras un servidor Ubuntu es fácil interpretar apt upgrade con una mentalidad de SemVer:

“¿Esto solo instala versiones minor y patch? ¿Las major quedan bloqueadas?”

La respuesta corta es no.

APT no decide si una actualización es “segura” mirando si pasa de 1.4.2 a 1.5.0 o de 1.x a 2.x. Su lógica gira alrededor de versiones de paquetes, repositorios, dependencias y políticas de la distribución.

Eso cambia bastante la forma correcta de pensar estos comandos:

sudo apt update
apt list --upgradable
sudo apt upgrade
sudo apt autoremove

La parte interesante no es memorizar qué hace cada uno, sino entender dónde está realmente el riesgo de un breaking change.

El mapa rápido

ComandoQué haceInstala paquetes nuevosElimina paquetes instalados
apt updateActualiza el índice local de paquetesNoNo
apt list --upgradableMuestra paquetes con una versión actualizable disponibleNoNo
apt upgradeInstala actualizaciones disponiblesSí, si hacen falta como dependenciasNo
apt full-upgradeActualiza resolviendo cambios de dependencias más agresivamenteSíSí, si es necesario
apt autoremoveElimina dependencias automáticas que ya no son necesariasNo como objetivo principalSí

La documentación de APT es explícita sobre una diferencia importante: apt upgrade puede instalar paquetes nuevos si hacen falta para satisfacer dependencias, pero no elimina paquetes ya instalados. Si completar una actualización exige borrar algo, esa actualización no se realiza con upgrade.

full-upgrade, en cambio, sí puede eliminar paquetes para completar la actualización del sistema.

Fuente: Ubuntu manpage de apt

1. apt update: actualiza el mapa, no el sistema

sudo apt update

Este comando descarga información actualizada de los repositorios configurados.

No actualiza curl, ni nginx, ni Python, ni el kernel.

Actualiza el índice local que APT usa para saber:

  • qué paquetes existen;
  • qué versiones están disponibles;
  • desde qué repositorio vienen;
  • qué dependencias declaran.

Ubuntu lo describe como la actualización del package index.

Fuente: Ubuntu Server — Package management

Por eso tiene sentido ejecutar apt update antes de preguntar qué puede actualizarse.

2. apt list --upgradable: el paso de inspección

Después de refrescar el índice:

apt list --upgradable

APT muestra los paquetes instalados para los que conoce una versión actualizable.

Ejemplo simplificado:

curl/noble-updates 8.5.0-2ubuntu10.6 amd64 [upgradable from: 8.5.0-2ubuntu10.5]
git/noble-updates 1:2.43.0-1ubuntu7.3 amd64 [upgradable from: 1:2.43.0-1ubuntu7.2]

La idea es sencilla:

paquete   versión disponible             versión instalada
curl      8.5.0-2ubuntu10.6              8.5.0-2ubuntu10.5
git       1:2.43.0-1ubuntu7.3            1:2.43.0-1ubuntu7.2

No cambia nada en el sistema.

La manpage de APT define list --upgradable como un filtro para mostrar versiones actualizables.

Fuente: Debian apt(8)

Para un servidor de producción, este comando es una buena frontera entre descubrir y mutar.

3. apt upgrade no significa “solo minor versions”

Aquí aparece la confusión más común.

sudo apt upgrade

APT no consulta SemVer.

No existe una regla interna del tipo:

1.2.3 -> 1.2.4 = permitido
1.2.3 -> 1.3.0 = permitido
1.2.3 -> 2.0.0 = bloquear

APT trabaja con la versión candidata que ofrecen tus repositorios y con la resolución de dependencias.

La protección que normalmente percibes en Ubuntu estable viene sobre todo de Ubuntu, no de una regla de “major version” en APT.

Ubuntu es una distribución de release fija. Durante la vida de una release estable, las actualizaciones de seguridad suelen llegar como parches backportados para mantener compatibilidad, y las Stable Release Updates siguen reglas destinadas a preservar estabilidad y previsibilidad.

Fuentes:

En otras palabras:

APT instala lo que el repositorio le presenta como versión candidata; Ubuntu controla qué entra en los repositorios oficiales de esa release.

4. Entonces, ¿dónde aparecen los breaking changes?

Hay varios lugares.

Cambio de release de Ubuntu

Pasar, por ejemplo, de una LTS a la siguiente es otra operación:

sudo do-release-upgrade

Ahí cambias de conjunto de repositorios y entran muchas versiones nuevas de paquetes.

Ubuntu recomienda tratarlo como un proceso distinto de las actualizaciones normales: leer release notes, actualizar completamente el sistema actual, comprobar espacio, hacer backup y revisar repositorios de terceros.

Fuente: Ubuntu Server — Upgrade your release

Repositorios de terceros

Este es probablemente el caso más importante para servidores reales.

Puedes tener repos de:

  • Docker;
  • Microsoft;
  • NodeSource;
  • PostgreSQL;
  • GitHub CLI;
  • HashiCorp;
  • NVIDIA;
  • PPAs.

Esos repositorios no tienen por qué seguir exactamente la política de estabilidad de Ubuntu.

Si uno publica una versión nueva como candidata, APT no dice:

“Esto parece un major bump, mejor no”.

Por eso una máquina con solo repos oficiales y otra con seis repos externos pueden comportarse de manera muy distinta ante el mismo apt upgrade.

Cambios en dependencias

Una actualización puede requerir dependencias nuevas.

apt upgrade puede instalarlas.

Pero si necesita eliminar un paquete instalado para resolver el cambio, esa actualización no se completará con upgrade.

Ahí entra:

sudo apt full-upgrade

full-upgrade tiene más libertad: puede instalar y también eliminar paquetes para resolver el estado del sistema.

Eso lo hace útil, pero también merece más revisión en servidores delicados.

5. No confundas “held back” con “algo se rompió”

A veces apt upgrade muestra paquetes retenidos.

Eso puede ocurrir por dependencias, pero Ubuntu también utiliza phased updates.

Las actualizaciones por fases se despliegan primero a una fracción de máquinas y luego se amplían si no aparecen regresiones importantes.

Ubuntu señala además que las actualizaciones de seguridad no se someten a phasing.

Fuente: Ubuntu Server — apt upgrade and phased updates

Así que ver algo como:

The following packages have been kept back:
  some-package

no significa automáticamente que debas forzar la actualización.

6. Cómo inspeccionar un paquete concreto

Si algo de apt list --upgradable te llama la atención:

apt policy docker-ce

o:

apt policy nginx

puede mostrar:

Installed: 1.24.0-...
Candidate: 1.24.0-...
Version table:
   ...

Lo importante es mirar:

  • Installed: lo que tienes ahora;
  • Candidate: lo que APT quiere instalar;
  • el origen de cada versión;
  • la prioridad del repositorio.

Es una forma mucho mejor de responder “¿qué me va a instalar?” que intentar inferirlo solo por major/minor.

7. Simular antes de tocar producción

Puedes pedirle a APT que calcule la operación sin ejecutarla:

sudo apt -s upgrade

También suele verse:

sudo apt upgrade --dry-run

En servidores, la simulación ayuda a detectar:

  • paquetes que se actualizarían;
  • dependencias nuevas;
  • paquetes retenidos;
  • cambios inesperados.

Y antes de un full-upgrade, la revisión es todavía más importante.

8. apt autoremove: limpieza, pero sigue siendo una eliminación

sudo apt autoremove

APT identifica paquetes que fueron instalados automáticamente como dependencias y que ya no son necesarios.

Eso puede liberar espacio y limpiar kernels o librerías antiguas.

Pero “automático” no significa “imposible de necesitar”.

En una máquina importante conviene revisar la lista que APT propone eliminar antes de confirmar.

9. Si necesitas congelar un paquete

APT permite marcar un paquete en hold:

sudo apt-mark hold nombre-paquete

Por ejemplo:

sudo apt-mark hold docker-ce

Y quitar el hold:

sudo apt-mark unhold docker-ce

Esto puede ser útil cuando una aplicación depende de una versión concreta, aunque mantener paquetes congelados indefinidamente también puede impedir recibir correcciones de seguridad.

10. Un flujo prudente para servidores

En vez de ejecutar tres comandos mecánicamente, una rutina más observable sería:

sudo apt update
apt list --upgradable
sudo apt -s upgrade
sudo apt upgrade
sudo apt autoremove

Y para paquetes sensibles:

apt policy docker-ce
apt policy nginx
apt policy postgresql

Si el sistema propone algo inesperado, puedes detenerte antes de mutarlo.

La idea importante

El modelo mental correcto no es:

apt upgrade = minor
full-upgrade = major

Es este:

repositorios configurados
        ↓
versiones candidatas
        ↓
política de Ubuntu / proveedor
        ↓
resolución de dependencias
        ↓
apt upgrade o full-upgrade

APT no es un guardián de SemVer.

En una Ubuntu LTS con repos oficiales, la estabilidad viene en gran medida de la política de la distribución, los backports y el proceso de Stable Release Updates.

En una máquina llena de repositorios externos, el límite de confianza cambia.

Por eso apt list --upgradable, apt policy y una simulación son herramientas tan valiosas: convierten una actualización de “ejecutar y esperar” en una operación que puedes inspeccionar antes de aplicar.