<!-- title: Construire sa clef USB multiboot -->
<!-- category: GNU/Linux -->
<!-- tag: planet -->

J'ai essayé quantité d'utilitaires pour créer facilement une clef USB multiboot
et aucun ne fonctionne correctement sur des serveurs racks<!-- more --> (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](https://wiki.archlinux.org/index.php/Multiboot_USB_drive).

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"
