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 linuxlinux 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.