Une clé USB pour les booter tous

dim. 18 oct. 2015 by Marmotte

Lorsqu'on bidouille des machines, il arrive que le système ne démarre plus. Que seul le boot loader soit cassé, ou que ce soit le système complet, il est donc important d'avoir à disposition un moyen de démarrer la machine, pour réparer les dégâts.

J'explique ici la manière dont j'ai configuré ma clé USB de boot, qui me permet de démarrer toutes les machines que j'utilise, en utilisant grub, depuis un système Debian. La configuration d'un boot loader étant parfois capricieuse, la méthode expliquée ici n'est peut être pas universelle, mais elle fonctionne pour moi sur des machines très différentes.

Préparation de la clé USB

La clé que j'utilise pour cette tâche est la toute première que j'ai eue. Elle n'a qu'une capacité de 128 Mo, mais c'est largement suffisant pour ce que j'en fais.

J'ai créé deux partitions sur cette clé :

  • Une de 3 Mo, formatée en ext2, pour le grub permettant de démarrer la machine en mode BIOS.
  • L'autre occupant le reste de l'espace, en vfat, pour le grub permettant de démarrer la machine en mode UEFI, et éventuellement des systèmes à démarrer.

Pour les créer, puis les partitionner, j'ai utilisé ces outils :

$ sudo cfdisk /dev/sdX
$ sudo mkfs.ext2 /dev/sdX1
$ sudo mkfs.vfat /dev/sdX2

/dev/sdX correspond à la clé USB.

Note : Les deux partitions contiennent chacune un boot loader, elles doivent donc avoir le flag boot activé toutes les deux. Le fonctionnement différent des deux types de démarrage permet que ce paramétrage fonctionne sans problème.

Note : La première est formatée en ext2 parce que, sur certaines machines, le grub ne trouvait pas sa partition lorsqu'elle était formatée en vfat.

Installation de grub

Il faut tout d'abord installer les paquets binaires nécessaires. Ceux-ci contiennent les fichiers qui seront copiés sur la clé USB lors de l'installation de grub.

$ sudo apt-get install grub-pc-bin grub-efi-amd64-bin

Si ce n'est pas déjà le cas, les partitions de la clé USB doivent être montées, pour permettre à l'installeur de grub d'y copier les fichiers nécessaires.

$ # Création des répertoires de montage
$ sudo mkdir /mnt/usb{1,2}
$ sudo mount /dev/sdX1 /mnt/usb1
$ sudo mount /dev/sdX2 /mnt/usb2

Enfin, il ne reste plus qu'à mettre les targets grub en place sur la clé USB.

$ sudo grub-install -v --no-floppy --boot-directory=/mnt/usb1 --removable --locales= --fonts= --target=i386-pc /dev/sdX
$ sudo grub-install -v --no-floppy --boot-directory=/mnt/usb2 --removable --locales= --fonts= --target=x86_64-efi --efi-directory=/mnt/usb2 --no-uefi-secure-boot

Note : Les paramètres --locales= et --fonts= permettent de n'inclure aucune locale, et aucune police, lors de l'installation. Cela permet de réduire la place occupée par grub sur la clé USB.

Note : Je n'ai pas encore réussi à permettre le démarrage sur un système avec secure boot activé. Mais comme je n'ai aucun système Windows nécessitant ce paramètre, ça ne me dérange pas.

Configuration de grub

Le boot loader installé n'a actuellement pas de fichier de configuration. Il affichera donc juste une invite de commande lors du démarrage, ce qui n'est pas vraiment pratique à utiliser.

Il est possible de définir un menu, dans un fichier de configuration nommé grub.cfg, qui sera placé dans le répertoire grub de chaque partition de la clé USB. Pour éviter d'activer l'affichage semi-graphique de grub, je commence toujours ce fichier par une ligne contenant set gfxpayload=text. Cela m'assure que le menu peut s'afficher sans problème sur n'importe quelle machine.

La structure des entrées de menu que je mets dans le fichier de configuration de grub est de cette forme :

menuentry 'Displayed label' {
    set rootdir="/boot/distro_name"
    search --no-floppy --set -f $rootdir/bzImage
    linux  $rootdir/bzImage nomodeset
    initrd $rootdir/rootfs.gz
}

Note : L'utilisation de la fonction search permet de ne pas définir de nom de périphérique en dur dans la configuration. De cette manière, quel que soit l'ordre des disques, et quel que soit le disque qui contient le fichier à démarrer, grub le trouvera. Il est donc possible de démarrer des systèmes se trouvant sur la clé USB de boot, sur une autre clé USB ou sur un disque dur de la machine, pourvu que le chemin d'accès aux fichiers de boot, défini depuis la racine d'une partition, soit le bon.

Note : La liste des paramètres passés au noyau Linux est bien évidemment modifiable. Pour le démarrage des systèmes installés sur mes machines, je copie généralement les paramètres tels qu'ils sont dans le fichier grub.cfg du système.

Note : Pour les systèmes installés sur mes machines, je préfère définir la partition de boot par son UUID, plutôt que par le chemin d'un fichier présent dessus.

Il est aussi possible de définir des sous menus, pour classer les entrées des différents systèmes.

Exemple de configuration

A titre d'exemple, voici le fichier de configuration actuel de ma clé USB.