Migration du SheevaPlug de Debian Wheezy vers Jessie

sam. 27 févr. 2016 by Marmotte

Après la migration du système Debian Wheezy vers Jessie sur mon SheevaPlug, j'ai eu la mauvaise surprise de me rendre compte que le système ne démarrait plus.

J'explique ici l'origine du problème qui l'empêchait de démarrer, ainsi que la solution que j'ai appliquée pour le corriger.

L'erreur

Après quelques dizaines de secondes d'attente, la connexion au serveur SSH n'étant toujours pas possible, je me suis connecté sur le SheevaPlug via sa console série.

J'ai alors vu l'erreur suivante s'afficher lors du reboot :

Uncompressing Linux... done, booting the kernel.

Error: unrecognized/unsupported machine ID (r1 = 0x00000a76).

Available machine support:

ID (hex)        NAME
0000089b        LaCie d2 Network v2
0000089e        LaCie 5Big Network v2
0000089c        LaCie 2Big Network v2
00000b44        Marvell OpenRD Ultimate Board
00000939        Marvell OpenRD Client Board
00000915        Marvell OpenRD Base Board
00000691        Marvell RD-88F6192-NAS Development Board
00000692        Marvell RD-88F6281 Reference Board
00000b1e        HP t5325 Thin Client
0000085b        QNAP TS-119/TS-219
000009c6        QNAP TS-41x
ffffffff        Marvell Kirkwood (Flattened Device Tree)

Please check your kernel config and/or bootloader.

Cette erreur apparaît après le chargement du noyau Linux, et indique qu'il ne reconnaît pas le matériel sur lequel on lui demande de démarrer.

La cause

Le Device Tree (DT) permet au noyau Linux de connaitre les caractéristiques du matériel, sans devoir les intégrer en dur dans le code. Le noyau 3.16 installé par Debian Jessie bénéficie de cette fonctionnalité, et n'inclue donc plus les informations sur le SheevaPlug.

La solution

Pour pouvoir démarrer avec ce noyau, il faut donc fournir les informations sur le matériel au noyau Linux lors de son chargement. Cela peut se faire de différentes manières, selon la version du boot loader et du noyau utilisées.

Ces informations sont disponibles dans un fichier nommé Device Tree Blob (DTB). Les fichiers dtb de certains matériels, dont mon SheevaPlug, sont disponible ici.

Avec les versions installées sur mon SheevaPlug (u-boot DENX 2014.10 et noyau Linux 3.16), je dois intégrer le Device Tree Blob (DTB) dans le noyau Linux. Cela peut être fait avec une simple commande :

$ cat /boot/vmlinuz-3.16.0-4-kirkwood kirkwood-sheevaplug-esata.dtb > /boot/vmlinuz-3.16.0-4-kirkwood-dtb

Il ne reste plus qu'à construire des images pour u-boot avec l'utilitaire mkimage :

$ sudo mkimage -A arm -O linux -T kernel -C none -a 0x00008000 -e 0x00008000 -n "Kernel Image" -d /boot/vmlinuz-3.16.0-4-kirkwood-dtb /boot/uImage
$ sudo mkimage -A arm -O linux -T ramdisk -C gzip -a 0x0 -e 0x0 -n "Initrd Image" -d /boot/initrd.img-3.16.0-4-kirkwood /boot/uInitrd

Note : Des versions plus récentes du boot loader permettent de charger le fichier dtb de manière dynamique. Il n'est donc plus nécessaire de l'intégrer dans l'image du noyau, il peut rester comme un simple fichier à coté, et être chargé par u-boot. Cette possibilité nécessite peut être un noyau Linux en version 3.17 ou supérieure.