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 :
- Updater syslinux sur le flash : non trivial sur un module flash interne 122 Mo soudé
- Utiliser GRUB legacy à la place : nécessite réécriture du flash
- 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
- Vérifier la version du bootloader avant de tenter de booter un kernel récent. SYSLINUX > 4.0 minimum pour les kernels post-2018, GRUB 2.x recommandé.
- Quand le bootloader plante silencieusement, c’est typiquement un problème de format (header bzImage version, compression initrd non supportée, taille du noyau).
- Les NAS et appliances embedded ont souvent des bootloaders gelés depuis 5-10 ans. Anticiper la nécessité d’un chainload (
LOCALBOOTsyslinux,chainloaderGRUB).