Construire sa clef USB multiboot

J’ai essayé quantité d’utilitaires pour créer facilement une clef USB multiboot et aucun ne fonctionne correctement sur des serveurs racks (du type Dell PowerEdge). Ces utilitaires ont en commun d’utiliser syslinux et de proposer une interface graphique conviviale pour glisser-déposer des ISO sur la clef. Je ne suis pas (encore) expert en partitionnement et boot mais je m’y intéresse beaucoup en ce moment par la force des choses et on voit beaucoup de subtilités pour booter sur du GPT au lieu de MBR. A force de chercher le bon utilitaire, je suis tombé sur de la doc Archlinux (et oui encore) qui propose de créer soi-même sa clef avec GRUB au lieu de syslinux. Cela veut dire qu’on ne peut démarrer que des GNU/Linux et pas des utilitaires DOS (comme il y en a quantité pour tester les disques ou la mémoire), c’est parfait, c’est la seule chose que je fais. Cette documentation ArchLinux est accessible à cette adresse.

Cet article est donc surtout un mémo pour moi même qui reprend les parties de cette doc pertinentes pour mon cas d’usage J’ai besoin d’avoir le live CD de CloneZilla et Knoppix ainsi que le DVD d’installation de CentOS 7 et Debian 8. Je suis parti d’une clef de 16 Go sur laquelle j’ai une table de partition GPT et une partition unique formatée en EXT2. J’avais commencé avec une partition en FAT32 mais on ne peut pas copier un fichier de plus de 2Go. Hors dans notre cas, on va copier les ISO sur la clef et laisser GRUB les monter pour y accéder. C’est différent des solutions basées sur syslinux où l’ISO est désarchivée sur la clef dans un répertoire Bref une ISO DVD d’installation de CentOS pèse 4 Go donc on formate en EXT.

Voici ma table de partition :

$ fdisk -l /dev/sdf

Disque /dev/sdf : 14,5 GiB, 15504900096 octets, 30283008 secteurs
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets
Type d'étiquette de disque : gpt
Identifiant de disque : 34793BF6-88B6-4325-98D8-BD79DC297619

Device     Start      End  Sectors  Size Type
/dev/sdf1   2048 30282974 30280927 14,4G Linux filesystem

Ensuite, on crée un répertoire pour accueillir GRUB et les ISO :

$ mount /dev/sdf1 /mnt
$ mkdir -p /mnt/boot/iso

Et on installe GRUB :

grub-install --force  --target=i386-pc --recheck --boot-directory=/mnt/boot /dev/sdf

Il reste à copier les ISO dans le répertoire /mnt/boot/iso et à créer un fichier mnt/boot/grub/grub.cfg. Tout le problème est de configurer correctement GRUB pour monter chaque type de distribution. Pour certaines, il n’y a pas de solution pour que ça fonctionne. Le documentation ArchLinux liste la configuration GRUB pour un certain nombre de distributions.

Voici ma configuration /mnt/boot/grub/grub.cfg pour les distributions installées sur ma clef :

# path to the partition holding ISO images (using UUID)
set imgdevpath="/dev/disk/by-uuid/53ac1278-3d48-4528-a348-2eb3b7b8dc93"

# define globally (i.e outside any menuentry)
insmod search_fs_uuid
search --no-floppy --set=isopart --fs-uuid 40c8461c-a5fd-4b3b-9a78-f8e92275ea98
# later use inside each menuentry instead
loopback loop ($isopart)$isofile

menuentry "Live clonezilla-live-2.4.2-61-amd64" {
    set isofile="/boot/iso/clonezilla-live-2.4.2-61-amd64.iso"
    loopback loop $isofile
    linux (loop)/live/vmlinuz findiso=$isofile boot=live union=overlay username=user config
    initrd (loop)/live/initrd.img
}

menuentry "Live clonezilla-live-2.2.2-32-i686-pae" {
    set isofile="/boot/iso/clonezilla-live-2.2.2-32-i686-pae.iso"
    loopback loop $isofile
    linux (loop)/live/vmlinuz boot=live live-config noswap nolocales edd=on nomodeset ocs_live_run=\"ocs-live-general\" ocs_live_extra_param=\"\" ocs_live_keymap=\"\" ocs_live_batch=\"no\" ocs_lang=\"\" GRUB_GFXMODE=1024x768 ip=frommedia nosplash toram=filesystem.squashfs findiso=$isofile
    initrd (loop)/live/initrd.img
}

menuentry "Live Knoppix_v7.6.1DVD-2016-01-16-EN" {
        set isofile="/boot/iso/KNOPPIX_V7.6.1DVD-2016-01-16-EN.iso"
        loopback loop $isofile
        linux (loop)/boot/isolinux/linux bootfrom=/mnt-iso/$isofile acpi=off keyboard=fr lang=fr
        initrd (loop)/boot/isolinux/minirt.gz
}

menuentry "Install CentOS-7-x86_64-DVD-1511" {
    set isofile="/boot/iso/CentOS-7-x86_64-DVD-1511.iso"
    loopback loop $isofile
    linux (loop)/isolinux/vmlinuz noeject inst.stage2=hd:UUID=53ac1278-3d48-4528-a348-2eb3b7b8dc93:/$isofile
    initrd (loop)/isolinux/initrd.img
}

menuentry 'Install Debian-8.3.0-amd64-firmware' {
    set isofile='/boot/iso/firmware-8.3.0-amd64-netinst.iso'
    set initrdfile='/boot/iso/debian-8.3.0-am64-initrd.gz'
    loopback loop $isofile
    linux (loop)/install.amd/vmlinuz vga=791 iso-scan/ask_second_pass=true iso-scan/filename=$isofile
    initrd $initrdfile
}

Pour trouver l’identifiant UUID de la clef qu’on claque dans la variable imgdevpath en début de config et qu’on passe à inst.stage2 dans la section CentOS ou l’identifiant de la partition fs-uuid qu’on passe à la commande search, on utilise la commande blkid :

blkid /dev/sdf1: UUID="53ac1278-3d48-4528-a348-2eb3b7b8dc93" TYPE="ext2" PARTUUID="40c8461c-a5fd-4b3b-9a78-f8e92275ea98"
Yuraï - 2016-03-07 11:48:06

Dernièrement j’ai suivi ce tutoriel http://pronflette.developpez.com/tutoriels/multiboot-redo-backup/ Mais quand même, merci beaucoup pour l’inspiration… je vais tester aussi cette solution ;-)

Votre commentaire
Le site Web est optionel
Le message peut être rédigé au format Markdown