Aller au contenu
Sylvain Joffraud l4w
Retour

Bootloader de 2011 incapable de charger un kernel de 2024

Je voulais utiliser un truc simple : modifier syslinux.cfg du flash interne de mon NAS pour qu’il charge directement mon kernel Debian fraîchement compilé. Le kernel et l’initrd Debian 12 (bookworm, kernel 6.1.0-45-amd64) ont été extraits proprement, copiés sur le flash via wget. Configuration syslinux à jour :

default Debian
label Debian
  kernel kernel
  append initrd=initrd.gz root=UUID=... ro console=ttyS0,9600n8

Reboot. Sur la console série je vois :

SYSLINUX 3.31 v1.07 Tue Feb 15 11:31:02 PST 2011
Debian

Puis… rien. Pas de log kernel, pas de panic, pas d’erreur. Reboot direct. Boucle infinie.

Le coupable : syslinux 3.31 date de 2011. À l’époque, les bzImage Linux étaient plus petits, dans un format légèrement différent. Le format de boot a évolué (option xloadflags, support kernel > 8 Mo, header bzImage version 2.12+, compression zstd de l’initrd, etc.).

Mon kernel Debian fait 7.8 Mo, mon initrd 30 Mo (compressé en zstd). Syslinux 3.31 ne sait pas les charger correctement et plante silencieusement.

Solutions possibles :

  1. Updater syslinux sur le flash : non trivial sur un module flash interne 122 Mo soudé
  2. Utiliser GRUB legacy à la place : nécessite réécriture du flash
  3. Faire un chainload via LOCALBOOT 0x80 : laisser syslinux 3.31 redonner la main au BIOS, qui chargera GRUB depuis le SATA. C’est ce que j’ai fait — pas besoin que syslinux comprenne les nouveaux formats puisqu’il ne charge plus le kernel directement
default sata
label sata
  localboot 0x80

GRUB 2.06 sur le SATA s’occupe du reste : kernel zstd, paramètres modernes, RAID assembly via dm-mod, tout passe sans souci.

Lessons learned


Partager cet article :

Article précédent
Shell BusyBox caché derrière un mot de passe non documenté
Article suivant
Une pile à 1€ qui sabote des heures de configuration