Table des matières

Réaliser une clé USB bootable sur plusieurs images ISO

Dans ce qui suit, la clé usb est désignée par /dev/sdx ; pour trouver le device correspondant à votre clé, utiliser la commande :
fdisk -l

.

Introduction

En terme de mobilité, j'aime bien avoir sur moi une ou deux clés bootables pour jouer au geek devant un parterre de noobs ébahis. :-P
L'inconvénient est que ce n'est pas forcément pratique d'avoir une distro par clé, surtout pour partager les données persistantes.
D'où l'idée d'avoir une seule clé contenant plusieurs images ISO.

Vue d'ensemble

Si la mise en œuvre peut parfois se révéler délicate, le principe est relativement simple :

Procédure

Pour éviter certains problèmes, le mieux est d’utiliser une clé vierge, ou reformatée.
Si ce n'est pas le cas, il est possible de la réinitialiser rapidement : voir Effacement rapide d'un stick usb

Création de la partition amorçable

Créons tout d'abord une partition primaire amorçable, à l'aide, par exemple, de la commande fdisk :

fdisk /dev/sdx

Entrer les commandes suivantes :
d ↵ Entrée (autant de fois que nécessaire pour détruire les partitions éventuellement présentes)
n ↵ Entrée (pour créer une nouvelle partition)
p ↵ Entrée (pour qu'elle soit de type primaire)
↵ Entrée (numéro de partition mais, par défaut, c'est 1)
↵ Entrée (premier secteur, par défaut 2048
2000000 ↵ Entrée (dernier secteur, par défaut le maximum disponible ; prendre suffisamment pour contenir les ISO et laisser de la place pour une partion contenant les données persistantes)
a ↵ Entrée (pour définir la partition amorçable)
1 ↵ Entrée (pour indiquer que ce sera la première partition et que son flag de boot sera levé)
t ↵ Entrée (pour définir le type de partition)
1 ↵ Entrée (dans le cas où il y aurait plusieurs partitions définies)
c ↵ Entrée (pour définir une partition FAT32)
w ↵ Entrée (pour valider et écrire la table de partitions sur la clé)

Il reste maintenant à démonter la(les) partition(s) :

umount /dev/sdx1

formater la(les) partition(s) :

mkfs.vfat -F 32 -n multilive /dev/sdx1

remonter la première partition :

mkdir /mnt/usb && mount /dev/sdx1 /mnt/usb

et enfin installer GRUB :

grub-install --force --no-floppy --boot-directory=/mnt/usb/boot /dev/sdx

Téléchargement des images

J'ai choisi de placer les images ISO dans le dossier /iso de la première partition.

cd /mnt/usb/iso
wget -c http://cdimage.debian.org/cdimage/release/current-live/i386/iso-hybrid/debian-live-8.3.0-i386-lxde-desktop.iso

Cette commande est à réitérer pour les différentes images souhaitées.

Si vous souhaitez ce que votre image a dans le ventre, installez udevil pour la monter facilement dans le gestionnaire de fichiers.

Configuration de GRUB

On peut trouver sur la toile plusieurs exemples de fichier grub.cg.
Voici le mien (il est destiné à lancer les ISO de Tails, Kali Linux et SystemRescueCD, ainsi que le MemTest compris dans SystemRescueCD) :

/boot/grub/grub.cfg
# fichier de configuration grub.cfg
 
set timeout=10
set default=0
 
 
menuentry "Tails i386 2.0.1" {
   set isofile='/iso/tails.iso'
   loopback loop $isofile
   linux (loop)/live/vmlinuz2 boot=live config findiso=${isofile} live-media=removable apparmor=1 security=apparmor nopersistent noprompt timezone=Etc/UTC block.events_dfl_poll_msecs=1000 noautologin module=Tails
   initrd (loop)/live/initrd2.img
}
# Warning: Emergency memory erasure does not seem to work when booting this way.
# Remove the live-media=removable option if the iso file is not on removable media. 
 
 
menuentry "Kali Linux 386 2016.1" {
   set isofile='/iso/kali.iso'
   loopback loop $isofile
   linux (loop)/live/vmlinuz boot=live findiso=$isofile noconfig=sudo username=root hostname=kali
   initrd (loop)/live/initrd.img
}
 
 
set isofilename="systemrescuecd.iso"
# Because System Rescue CD's boot loader adds a / when searching as it really likes it in the root of the drive
# set isorelativepath="boot/iso/$isofilename"
set isorelativepath="iso/$isofilename"
set isofullpathname="/$isorelativepath"
 
menuentry "System Rescue Cd x86 4.7.1" {
   loopback loop $isofullpathname
   linux (loop)/isolinux/rescue32 isoloop=$isorelativepath
   initrd (loop)/isolinux/initram.igz
}
 
 
menuentry "System Rescue CD MemTest86+" {
    loopback loop $isofullpathname
    linux16  (loop)/bootdisk/memtestp
}

Conclusion

Pas de doute : il faut rebooter … ;-)

Références