GRUB, Arch Linux, ABS, et patch
Dernièrement ai-je dû faire face à un problème quelque peu bloquant avec mon installation d'Arch Linux : GRUB partait dans les choux. Au menu : impossible d'installer le chargeur de démarrage (grub-install: error: cannot open '/usr/lib/grub/i386-pc/msdos.mod': No such file or directory
), symbole manquant si j'y parvenais (error: symbol 'grub_real_boot_time' not found.
), faute de frappe dans le fichier de configuration. La joie.
Plusieurs solutions pour corriger ces erreur : rétrograder la version de GRUB (pacman -U /var/cache/pacman/pkg/grub-versionquivabien.pkg.tar.xz
), ou appliquer un patch trouvé sur le bugtracker dans une version « maison » de GRUB. C'est cette solution que je documenterai ci-desous.
ABS et Makepkg
D'abord installer ABS, et le métapaquet base-devel
si ça n'était pas déjà fait. Mettre à jour l'arbre d'ABS en lançant abs
en root (ou sudo abs
). Petit plus : éditer la valeur de MAKEFLAGS
dans /etc/makepkg
avec -jX
où X est la valeur émise par la commande nproc
. Chez moi, avec mon petit netbook portant un Atom dans son ventre, ça donne (on ne rit pas) :
MAKEFLAGS="-j2"
Copier /var/abs/core/grub
dans $HOME/abs
, télécharger ce patch et le mettre dans le dossier $HOME/abs/grub
.
Patch et compilation
Il m'a fallu des plombes pour trouver comment appliquer un patch à un dossier entier et non pas à un fichier seul. Appliquer le patch avec patch -p1 <grub.patch
depuis l'invite de commande dans le dossier $HOME/abs/grub
. Le reste suit la documentation d'ABS bien sagement : makepkg -s
pour installer les dépendances à la compilation et compiler, et pacman -U grub-1:2.00.1282.g5ae5c54-2-i686.pkg.tar.xz
(en tant que root ou avec sudo) pour installer le paquet « maison » ainsi produit.
Installation et réparation
On peut maintenant réinstaller GRUB. Pour plus de propreté, déplacer le dossier /boot/grub
vers /boot/grub-backup
, et recréer le dossier (root ou sudo, vous avez compris) : mv /boot/grub /boot/grub-backup; mkdir /boot/grub
.
Recréer les images du noyau dans avec mkinitcpio -p linux
où linux
peut être subsitué par un noyau alternatif (linux-ck
chez moi). Réinstaller GRUB comme chargeur d'amorçage : grub-install --recheck /dev/sdX
où X est le disque de démarrage, et enfin grub-mkconfig -o /boot/grub/grub.cfg
pour recréer le fichier de configuration.
Précaution et nettoyage
Avant de redémarrer, s'assurer d'avoir une clef USB avec la dernière image d'Arch Linux dessus. Si ça fonctionne après redémarrage, supprimer le dossier /boot/grub-backup
.