En principio se puede hacer la actualización de Debian sin cambiar el núcleo y funciona correctamente. Con esto se consigue que algunas librerías de control de GPIO antiguas siguieran funcionando.
En cambio, si se quiere tener la última versión del kernel y de las librerías hay que aplicar el procedimiento completo. Así, Divido el procedimiento actualización en dos partes, la primera es la actualización de la distribución y la segunda la actualización del kernel.
Advertencia
La actualización aquí mostrada me ha fallado en una RaspberryPI 3B+ que tenía la versión de 32bits. En cambio en las pruebas que he hecho ha funcionado en:
- RaspberryPI 4B de 8GB y con el sistema operativo de 64bits
- RaspberryPI 3B+ con el sistema operativo de 64bits
Actualizando la distribución
Antes de empezar hay que asegurarse de tener todo Actualizado con:
apt update && apt upgrade -y
apt --purge autoremove
Las fuentes de APT de la nueva versión las he obtenido de la imagen oficial de RPI - Operating system images. Según ellas hay que cambiar las fuentes APT en /etc/apt/sources.list a:
deb http://deb.debian.org/debian bookworm main contrib non-free non-free-firmware
deb http://deb.debian.org/debian-security/ bookworm-security main contrib non-free non-free-firmware
deb http://deb.debian.org/debian bookworm-updates main contrib non-free non-free-firmware
y después en el directorio /etc/apt/sources.list.d añadir el fichero raspi.list con el siguiente contenido:
deb http://archive.raspberrypi.com/debian/ bookworm main
Para evitar problemas de dependencias lo mejor es hacer la actualización en dos pasos como se indica a continuación. No es necesario reiniciar hasta que termine la actualización.
apt update
apt upgrade --without-new-pkgs
apt full-upgrade
sudo apt purge ?config-files
Tras finalizar la actualización anterior hay que reiniciar el sistema. Aunque no esté el kernel actualizado, el sistema funcionará con el antiguo sin problema.
Actualizando el kernel
En esta nueva versión han cambiado la forma de distribuir el kernel Lo que cambia con Debian 12 es:
- Ha cambiado el punto de montaje de la partición FAT desde la que inicia el firmware (bootcode.bin). Ahora se monta en /boot/firmware en lugar de /boot.
- El núcleo de Linux se almacena en /boot de la misma manera que en las distribuciones de PC.
- Los nombres de los paquetes que contienen los nuevos núcleos de Linux han cambiado, pasan de raspberrypi-kernel a linux-image-rpi-<arquitectura>
- El paquete del firmware también se renombra de raspberrypi-bootloader a raspi-firmware
Los pasos en modo script para actualizar el kernel se pueden encontrar en Upgrade Raspberry Pi OS from Bullseye to Bookworm. Lo detallado a continuación son los mismos pasos pero comprobando que todo va bien en cada paso.
Antes de empezar hay que saber que versión del sistema se tiene instalada: de 32 o 64 bits:
dpkg --print-architecture
armhf
uname -a
Linux xxx 5.10.103-v7+ #1529 SMP Tue Mar 8 12:21:37 GMT 2022 armv7l GNU/Linux
Cualquiera de los dos comandos nos dirá si el sistema es de 32 o 64 bits, la clave está en armhf / armv7l de la versión el Kernel. El ejemplo anterior indica que es de 32 bits, en cambio el siguiente muestra que es de 64 bits:
dpkg --print-architecture
arm64
uname -a
Linux xxx 6.1.21-v8+ #1642 SMP PREEMPT Mon Apr 3 17:24:16 BST 2023 aarch64 GNU/Linux
Paso 1. Eliminar el kernel antiguo
A partir de este momento el sistema puede quedar inutilizable, es importante terminar el proceso. El comando para eliminar el kernel antiguo es:
dpkg --purge --force-depends raspberrypi-kernel raspberrypi-bootloader
Paso 2. Cambiar el punto de montaje de la partición de inicio
La partición de inicio es una partición FAT está montada en /boot y hay que cambiar el punto de montaje a /boot/firmware. Lo mejor es desmontarla y cambiar en /etc/fstab la línea correspondiente de /boot a /boot/firmware/.
Siguiendo las recomendaciones del gist anterior (Upgrade Raspberry Pi OS from Bullseye to Bookworm) los comandos son los siguientes:
umount /boot
fsck -y /boot
mkdir /boot/firmware
En /etc/fstab encontraremos lo siguiente:
proc /proc proc defaults 0 0
PARTUUID=ca0280fc-01 /boot vfat defaults 0 2
PARTUUID=ca0280fc-02 / ext4 defaults,noatime 0 1
El cambio es simple, la segunda línea debe pasar de /boot a /boot/firmware quedando:
proc /proc proc defaults 0 0
PARTUUID=ca0280fc-01 /boot/firmare vfat defaults 0 2
PARTUUID=ca0280fc-02 / ext4 defaults,noatime 0 1
Después de este cambio hay que recargar systemd, montar /boot/firmware e instalar el paquete raspi-firmware:
systemctl daemon-reload
mount /boot/firmware
apt install raspi-firmware
Todavía no está el nuevo kernel, por lo que el sistema sigue estando inutilizable.
Paso 3. Instalar el nuevo kernel.
Aquí es donde no hay que equivocarse con la arquitectura del sistema. Esando los comandos explicados al principio del documento hay que determinar la versión del sistema operativo. En la siguiente tabla se muestra el kernel a instalar según la arquitectura que se tenga:
Arquitectura | Paquete |
---|---|
arm64/aarch64 (64bits) | apt install linux-image-rpi-v8 linux-headers-rpi-v8 |
armhf/armv7l (32bits) | apt install linux-image-rpi-v7l linux-headers-rpi-v7l |
En el caso de los 64 bits es:
apt install linux-image-rpi-v8 linux-headers-rpi-v8
Por último también se debe activar la regeneración del disco RAM de inicio añadiendo al en la sección [all] del fichero /boot/firmware/config.txt el texto auto_initramfs=1.
[all]
auto_initramfs=1
Para finalizar hay que reiniciar el sistema y comprobar que todo funciona correctamente. Ejecutando el comando uname -a se debe obtener una salida parecida a la siguiente:
Linux xxx 6.6.28+rpt-rpi-v8 #1 SMP PREEMPT Debian 1:6.6.28-1+rpt1 (2024-04-22) aarch64 GNU/Linux