Pour migrer mon NAS Netgear (kernel RAIDiator 2.6.37) vers Debian 12, je crée un RAID 1 dégradé sur les disques SATA depuis mon laptop, formaté en ext4, et j’y déploie Debian via debootstrap. Tout se passe bien côté laptop.
Je remets le disque dans le NAS, j’arrive à booter en mode « Tech Support » (un BusyBox de récupération basé sur kernel 2.6.37). De là, je veux monter mon RAID dégradé pour copier les fichiers de boot vers le flash interne.
# mount /dev/md127 /tmp/dr
mount: mounting /dev/md127 on /tmp/dr failed: Invalid argument
# mount -t ext4 /dev/md127 /tmp/dr
mount: failed: Invalid argument
# mount -o ro /dev/md127 /tmp/dr
mount: failed: Input/output error
L’array RAID est bien assemblé (vu dans /proc/mdstat), mais le filesystem ext4 dessus est inaccessible. Sur le PC moderne, il se monte sans problème. Pourquoi pas ici ?
Vérification du filesystem côté PC avec file -s :
ext4 filesystem data ... (extents) (64bit) (large files) (huge files)
Le coupable : la feature 64bit d’ext4. Activée par défaut sur les mke2fs modernes (Debian 12 utilise 1.46.5+), elle change la structure des metadata pour permettre des filesystems > 16 To.
Le kernel 2.6.37 (2011) ne supporte pas la feature 64bit ext4 (introduite en kernel 3.7+). Il refuse de monter le filesystem entier.
Workarounds possibles :
-
Recréer le filesystem sans la feature 64bit :
mkfs.ext4 -O ^64bit -O ^huge_file /dev/md0Limite à 16 To max, mais largement suffisant pour la plupart des usages.
-
Désactiver la feature après coup (risqué) :
tune2fs -O ^64bit /dev/md0 resize2fs -s /dev/md0Ne marche que si le filesystem n’a pas atteint 16 To et n’est pas monté.
-
Utiliser ext3 ou ext2 pour des filesystems destinés à des hosts avec vieux kernels.
Dans mon cas, vu que le kernel 2.6.37 du Tech Menu était juste un environnement temporaire de récupération, j’ai contourné autrement : transfert via wget depuis un serveur HTTP local sur mon laptop.
Lessons learned
- Les features ext4 par défaut ont évolué avec le temps. Un filesystem créé avec un mke2fs récent peut être inaccessible à un kernel ancien.
mke2fs -O ^64bit -O ^huge_filepour rester compatible avec kernel < 3.7.- Toujours vérifier les features avec
file -soutune2fs -lavant de transporter un filesystem entre systèmes d’âges différents. - Pour la portabilité maximale, ext2 reste le choix le plus universel (lisible par toutes les distros depuis ~2000).