23 Sep 2022, 00:00

Création manuelle d'une clé bootable USB en EFI et en BIOS avec GRUB

Share

Détruit toutes les données sur la clé !
On repère le chemin de la clé USB et on le stocke dans une variable (à adapter) :
DEVICE=/dev/sdX

Avec table GPT :

Préparation des partitions

Créer table de partition GPT. Créer 3 partitions :

  • 500M FAT32 - drapeau esp (sdX1)
  • 1M non formaté - drapeau bios_grub (sdX2)
  • le reste en fat32 (sdX3)

Puis on les monte :
pmount ${DEVICE}1 efi
pmount ${DEVICE}3 boot

Installation de GRUB pour le mode EFI

Pour l’EFI 64 bits :
sudo grub-install --removable --no-nvram --root-directory=/media/boot --boot-directory=/media/boot --efi-directory=/media/efi --target=x86_64-efi

Ceci installe les exécutables efi SHIM (BOOTX64.efi) et GRUB (grubx64.efi) dans la partition EFI, avec un fichier de configuration minimaliste (grub.cfg) qui va définir le chemin des ressources et configuration de GRUB sur la 3e partition.
Ceci installe aussi les ressources (modules, police etc) de GRUB dans le dossier /boot/grub de la partition principale.

Je n’ai pas réussi à faire fonctionner shim (écran bleu “Boot restoration)”, donc je le désactive pour l’instant, et tant pis pour le secureboot :
mv /media/efi/EFI/BOOT/BOOTX64.EFI /media/efi/EFI/BOOT/BOOTX64.EFI.SHIM && mv /media/efi/EFI/BOOT/grubx64.efi /media/efi/EFI/BOOT/BOOTX64.EFI

Installation de GRUB pour le mode BIOS

Ceci semble fonctionner sans créer une table hybrid-mbr. On installe donc simplement GRUB sur le disque :
sudo grub-install --removable --no-nvram --root-directory=/media/boot --boot-directory=/media/boot --target=i386-pc ${DEVICE}

S’il y’a une erreur liée aux listes de blocs, c’est que le drapeau bios_grub n’a pas été positionné sur la 2e partition.

Configuration

Grub devrait alors pouvoir démarrer, mais n’est pas configuré ! On va donc créer un fichier de configuration minimaliste, simplement pour vérifier que la clé est bien démarrable :

cat > /media/boot/grub/grub.cfg <<EOF
insmod efi_gop
insmod font
insmod gfxterm
insmod png
loadfont /grub/fonts/unicode.pf2
set gfxmode=auto
set gfxpayload=keep
terminal_output gfxterm

search.fs_uuid AAAA-AAAA efi
search.fs_uuid BBBB-BBBB root

menuentry "Tetrefis" {
        insmod chain
        chainloader (\$root)/grub/EFI-loaders/tetris.efi
}
EOF

On met les bonnes valeurs d’UUID :

sed "s/AAAA-AAAA/$(/usr/sbin/blkid -s UUID -o value ${DEVICE}1)/" /media/boot/grub/grub.cfg -i
sed "s/BBBB-BBBB/$(/usr/sbin/blkid -s UUID -o value ${DEVICE}3)/" /media/boot/grub/grub.cfg -i

On peut enfin démonter les 2 partitions :
pumount efi && pumount boot
et tester la clé.

GRUB devrait alors être bootable et afficher le menu (même si l’entrée est actuellement non-fonctionnelle). Pour plus de détails sur la configuration de GRUB et le démarrage de différents systèmes (exécutables EFI, noyaux linux, ISOs etc), voir un prochain article.