Migration du SheevaPlug de Debian Wheezy vers Jessie
sam. 27 févr. 2016 by MarmotteAprè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.