Ir al contenido

Actualizar Debian 12 a Debian 13 (trixie)

Christophe TREMBLAY-GUILLOUX
Christophe TREMBLAY-GUILLOUXIngeniero de sistemas Linux

Actualizar Debian 12 a Debian 13 no suele ser complicado si ya tienes una instalación de Debian 12 limpia y totalmente dominada. En esta nota (que yo mismo consulto) vamos a ver las principales etapas de la migración.

Si quieres maximizar un poco más la estabilidad, te aconsejo esperar a la versión 13.1, que sale poco después de la 13.0, un sábado.

Todas las órdenes se lanzan como root, a través de la consola KVM del servidor o por SSH. Nada de sudo inútil, ponte root.

Por qué migrar a Debian 13 (sin precipitarse)

Sección titulada «Por qué migrar a Debian 13 (sin precipitarse)»

Usas un servidor Debian para alojar WordPress, por ejemplo.

WordPress necesita PHP, y está pensado para la versión de PHP más usada del momento. Por eso tienes que seguir las versiones, o un día u otro te quedarás bloqueado en las actualizaciones.

Debian aporta una mejora de rendimiento (nuevo planificador, http/3, etc.).

Verás cada vez más documentación en línea que remite a Debian 13 y cada vez menos a Debian 12. Para poder fiarte de ella y estar al día, tienes que seguir. Lo mismo digo para quienes aún se resisten a usar systemd en lugar de initrd.

¡Abracadabra!

  • Desaparecen las órdenes last, lastb y lastlog. Revisa tus scripts si las usas.

  • Parada crítica de tu servidor MariaDB y rearranque imposible: comprueba que tu servidor MariaDB arranca correctamente y sin errores antes de actualizar Debian, porque la reparación es imposible si cambia la versión de MariaDB.

  • Si tienes repositorios externos (no oficiales), cuenta con que quedarán desactivados y que tus paquetes específicos pueden ser degradados o desinstalados.

Una actualización puede salir mal, destruir datos o dejar el servidor sin arrancar.

Yo respaldo los servidores con BackupPC, RCLONE y snapshot (sí, los 3 sistemas). Las bases de datos deben volcarse a SQL antes de cualquier copia de ficheros.

Comprueba que tu sistema está bien respaldado.

Que las copias están en remoto.

Haz además un snapshot si es una máquina virtual.

Reserva tiempo para reparar en caso de problema.

Ten la capacidad de reiniciar en modo rescue.

Normalmente tu servidor ya está al día, porque eres concienzudo. Si no, es imprescindible ponerlo al día antes:

bash
apt update
apt upgrade
reboot # si hace falta

Si usas Puppet, párala. Habrá que revisar las recetas para la nueva versión del sistema.

bash
systemctl stop puppet

Si has instalado paquetes no oficiales, hay que quitarlos. Los volverás a poner más tarde, si aún funcionan.

Para encontrar esos paquetes, usa estas órdenes:

bash
apt-get -s purge '?and(?installed,?not(?any-version(?origin(Debian))),?not(?name(puppet-agent)))'

Si la lista de paquetes a purgar parece correcta, se aplica:

bash
apt-get purge -y '?and(?installed,?not(?any-version(?origin(Debian))),?not(?name(puppet-agent)))'

Se borra el paquete puppet sin purgarlo:

bash
apt remove puppet-agent

Un paquete obsoleto sigue instalado pero ya no existe en los repositorios. Debian deja de darle soporte de seguridad alrededor de un año después de la salida de trixie.

Primero se mira la lista:

bash
apt list '?obsolete'

Léela antes de purgar: un paquete que instalaste tú mismo desde una fuente externa también aparece aquí.

bash
apt purge '?obsolete'

6. Elimina los restos de ficheros de configuración

Sección titulada «6. Elimina los restos de ficheros de configuración»

Se comprueba qué ficheros de ejemplo de configuración hay que borrar.

bash
find /etc -name '*.dpkg-*' -o -name '*.ucf-*' -o -name '*.merge-error'

Luego se borran de verdad si todo está bien:

bash
find /etc \( -name '*.dpkg-*' -o -name '*.ucf-*' -o -name '*.merge-error' \) -type f -delete

Comprueba el fichero o el directorio /etc/apt/preferences o /etc/apt/preferences.d

Sirven para anclar versiones de paquetes. Comprueba qué hay que hacer, pero lo más probable es que haya que desactivar esos ficheros.

No debe quedar ningún paquete en un estado de instalación sin terminar ni en ningún otro:

bash
dpkg --audit

Un paquete retenido (hold) se mantiene en su versión actual y se niega a subir. La lista debe estar vacía antes de la migración; si no, la actualización se detiene en un conflicto de dependencias difícil de leer.

bash
apt-mark showhold

Quita la retención de lo que aparezca, salvo que tengas una razón concreta para conservarla:

bash
apt-mark unhold <paquete>

En /etc/apt/sources.list o /etc/apt/sources.list.d/*, sustituye bookworm por trixie y normalmente obtienes:

deb http://deb.debian.org/debian trixie main contrib non-free non-free-firmware
deb http://deb.debian.org/debian trixie-updates main contrib non-free non-free-firmware
deb http://security.debian.org trixie-security main contrib non-free non-free-firmware

IMPORTANTE: el nombre que hay que poner es deb.debian.org, que apunta automáticamente al repositorio más cercano.

O situarse en el directorio y sustituir bookworm por trixie en una sola orden:

bash
sed -i 's/bookworm/trixie/g' *.list

Debian 13 espera sus fuentes en /etc/apt/sources.list.d/debian.sources, en formato deb822: una estrofa por repositorio, un campo por línea. El formato histórico de una sola línea sigue funcionando, pero un fichero .sources no tiene extensión .list, así que la orden sed de arriba no lo toca. Comprueba que el directorio no contenga ninguno antes de dar tus fuentes por actualizadas.

Los mismos repositorios que arriba, en deb822:

/etc/apt/sources.list.d/debian.sources:

Types: deb
URIs: https://deb.debian.org/debian
Suites: trixie trixie-updates
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
Types: deb
URIs: https://security.debian.org/debian-security
Suites: trixie-security
Components: main contrib non-free non-free-firmware
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg

Un mismo repositorio solo debe declararse una vez. Si creas este fichero, vacía o borra el antiguo /etc/apt/sources.list.

11. Actualizar la lista de paquetes disponibles

Sección titulada «11. Actualizar la lista de paquetes disponibles»
bash
apt update

12. Control del espacio en disco antes de actualizar

Sección titulada «12. Control del espacio en disco antes de actualizar»
bash
apt -o APT::Get::Trivial-Only=true full-upgrade
[ ... ]
XXX upgraded, XXX newly installed, XXX to remove and XXX not upgraded.
Need to get xx.xMB of archives.
After this operation, AAAMB of additional disk space will be used.

Si no hay sitio suficiente, aparece este mensaje:

E: You don't have enough free space in /var/cache/apt/archives/.
bash
apt clean
apt --purge autoremove

El metapaquete del núcleo (linux-image-amd64 en un servidor de 64 bits clásico) sigue automáticamente las versiones del núcleo. Sin él, la actualización deja el núcleo antiguo en su sitio y el servidor rearranca con ese.

bash
dpkg -l 'linux-image*' | grep ^ii | grep -i meta

Si la orden no devuelve nada, instala el metapaquete correspondiente a tu arquitectura antes de la actualización:

bash
apt install linux-image-amd64

Las dos órdenes que siguen duran mucho. Lanzadas directamente en una sesión SSH, un corte de red las interrumpe en plena faena y deja el sistema migrado a medias. Una sesión screen o tmux sigue corriendo en el servidor aunque tu conexión se caiga.

bash
apt install tmux
tmux new -s upgrade

Tras un corte, vuelve a conectarte por SSH y recupera el control:

bash
tmux attach -t upgrade

Desde la consola KVM no hace falta.

Este proceso actualiza los paquetes del sistema que no añaden nuevas dependencias sobre paquetes nuevos ni las quitan:

bash
DEBIAN_FRONTEND=noninteractive UCF_FORCE_CONFFOLD=1 NEEDRESTART_MODE=a apt -o Apt::Get::Assume-Yes=true -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" upgrade --without-new-pkgs
bash
DEBIAN_FRONTEND=noninteractive UCF_FORCE_CONFFOLD=1 NEEDRESTART_MODE=a apt -o Apt::Get::Assume-Yes=true -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" full-upgrade
apt --purge autoremove

Si todo ha ido bien, hay que reiniciar el sistema.

En caso de problema, analiza la situación antes de reiniciar.