Table of Contents

Upgrade e downgrade del kernel del Raspberry Pi

La distribuzione ufficiale per il Raspberry Pi è Raspberry Pi OS, una distribuzione GNU/Linux direttamente derivata da Debian. A differenza di Debian però non esistono i pacchetti linux-image-* con i quali è possibile effettuare l'upgrade o il downgrade del kernel.

rpi-update

Per il Raspberry esiste il pacchetto raspberrypi-kernel, ma quel pacchetto deve andare di pari passo con i pacchetti raspberrypi-bootloader, libraspberrypi-{bin|dev|doc} e libraspberrypi0, che contengono le librerie per la gestione della GPU e varie utility.

Per gestire in maniera più comoda e precisa le versioni del kernel, del firmware e delle librerie correlate, è stato sviluppato il progamma rpi-update (si installa con l'omonimo pacchetto).

Eseguito senza argomenti, effettua l'aggiornamento all'ultima versione pre-release. Per effettuare un downgrade è necessario individuare il commit che interessa nella pagina GitHub rpi-firmware (fork del precedente repo di Hexxeh). Cliccando sul link commits si possono individuare i seguenti kernel bump:

May 12, 2020
kernel: Latest 4.19 (in effetti 4.19.118-v7l+)
866751bfd023e72bd96a8225cf567e03c334ecc4

Dec 14, 2020
kernel: Bump to 5.4.81 (in effetti 5.4.83-v7l+)
453e49bdd87325369b462b40e809d5f3187df21d

Dec 18, 2020
kernel: Bump to 5.10.1 (in effetti 5.10.1-v7l+)
367c84201db35a85979f1482ebd78e1eef910efc

Quindi, se si vuole tornare in un colpo solo al kernel 4.19 installando anche librerie, firmware e tool relativi, si esegue:

rpi-update 866751bfd023e72bd96a8225cf567e03c334ecc4

Cosa viene installato e dove

Il comando rpi-update scarica e installa file fuori dal controllo del gestore pacchetti deb, pertanto ci troveremo intere gerarchie di file installati, ma non collegati ad alcun pacchetto. Ad esempio tutti i file nella cartella /lib/modules/5.10.17+/ sono stati installati dal pacchetto raspberrypi-kernel, ma gli analoghi file nella cartella /lib/modules/4.19.118+/ non risultano installati da alcun pacchetto (verificare con dpkg -S).

Addirittura rpi-update sovrascrive i file installati da un pacchetto, senza particolari precauzioni. Nel mio caso ad esempio il file /boot/kernel.img (una delle immagini kernel) risulta ancora appartenere al pacchetto raspberrypi-kernel, ma in realtà è stata sovrascritta dalla procedura di downgrade.

In generale i file installati da rpi-update si trovano in:

Se si vuole evitare di perdere queste modifiche nei successivi aggiornamenti, è opportuno mettere on-hold il pacchetto raspberrypi-kernel e quelli strettamente correlati (vedi avanti).

Download pacchetti Debian invece di rpi-update

A mio avviso è preferibile installare i pacchetti Debian che contengono la versione del kernel desiderato, invece di usare rpi-udate che rompe l'integrità della gestione dei pacchetti deb. Come fare?

Per individuare quali sono le source dei pacchetti installati sul Raspberry si ispezionano i file /etc/apt/sources.list e /etc/apt/sources.list.d/raspi.list, scoprendo che vengono usati due repository:

deb http://raspbian.raspberrypi.org/raspbian/  buster   main contrib non-free rpi
deb http://archive.raspberrypi.org/debian/     buster   main

Ispezionando il contenuto dalle liste in /var/lib/apt/lists/ è possibile scoprire che il pacchetto raspberrypi-kernel proviene dal repository archive.raspberrypi.org. Sempre in quella lista si vede che l'URL base in cui si trova il pacchetto è http://archive.raspberrypi.org/debian/pool/main/r/raspberrypi-firmware/. Con un semplice script shell è possibile scaricare tutti i pacchetti necessari relativi ad una determinata versione:

#!/bin/sh -e
BASEURL='http://archive.raspberrypi.org/debian/pool/main/r/raspberrypi-firmware'
PACKAGES='libraspberrypi0 libraspberrypi-bin libraspberrypi-dev libraspberrypi-doc raspberrypi-bootloader raspberrypi-kernel'
VER='1.20200512-2'
ARCH='armhf'
for P in $PACKAGES; do
    wget -c "${BASEURL}/${P}_${VER}_${ARCH}.deb"
done

L'architettura dei pacchetti installati si vede con dpkg --list, e si scopre che è armhf. Non mi è chiaro perché invece il comando arch e il comando uname -m restituiscono il valore armv7l.

Per avitare l'aggiornamento dei pacchetti è necessario metterli on-hold, ad esempio con il comando apt-mark:

apt-mark hold raspberrypi-kernel
apt-mark hold raspberrypi-bootloader
apt-mark hold ...

Per verificare che i pacchetti siano marcati opportunamente si può utilizzare dpkg --get-selections.

Come ripristinare la versione ufficiale

Per resintallare kernel, firmware, librerie e tool forniti ufficialmente dalla distribuzione si possono reinstallare i seguenti pacchetti:

apt install --reinstall \
    libraspberrypi0
    libraspberrypi-bin
    libraspberrypi-dev
    libraspberrypi-doc
    raspberrypi-bootloader
    raspberrypi-kernel

Altri file rimasti da precedenti esecuzioi di rpi-update possono essere eventualmente cercati con find grazie al timestamp.