Linux Multiboot USB

Da Andreabont's Wiki.

Spesso si hanno a disposizione delle immagini ISO che si vuole avviare attraverso una chiavetta di memoria USB. E' possibile far si che la chiavetta permetta di scegliere una delle molteplici immagini ISO salvate su di essa attraverso l'uso di GRUB.

Configurazione delle partizioni

Data la nostra chiavetta /dev/sdX, dobbiamo creare 2 partizioni di tipo GPT:

  1. La partizione EFI, con codice EF00 e formattata in FAT32. (Dovrà essere per forza la prima partizione)
  2. La partizione dati, con codice 8300 e formattata in EXT4.

La creazione della tabella delle partizioni e delle partizioni può essere fatta attraverso:

gdisk /dev/sdX

Una configurazione di esempio può essere:

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048          104447   50.0 MiB    EF00  EFI System
   2          104448        30529502   14.5 GiB    8300  Linux filesystem

Ora è possibile procedere alla formattazione:

mkfs.msdos -F 32 /dev/sdX1
mkfs.ext4 /dev/sdX2

E assegnare una etichetta alla partizione dati (ISO):

e2label /dev/sdX2 ISO

Installazione di GRUB

Per prima cosa va montata la partizione EFI:

mount /dev/sdX1 /mnt

Successivamente possiamo installare GRUB in modalità EFI:

grub-install --target x86_64-efi --efi-directory /mnt --boot-directory=/mnt/boot --removable

Configurazione di GRUB

Il file di configurazione da creare è /mnt/boot/grub/grub.cfg, e deve contenere le informazioni di avvio.

Come prima cosa va trovato l'UUID della partizione dati:

lsblk -f | grep ISO

Una volta trovato l'UUID, inseriamolo come variabile globale:

set isouuid="<UUID>"

Successivamente possiamo specificare la configurazione per reperire le ISO da caricare:

insmod search_fs_uuid
search --no-floppy --set=isopart --fs-uuid ${isouuid}

Per ogni ISO è poi necessario aggiungere una voce di menù, che indica il file immagine da usare e il suo entry-point. Ogni distribuzione linux ha il suo, è quindi necessario eseguire la configurazione relativa alla ISO che si vuole caricare. Ad esempio per Ubuntu 17.04:

menuentry "Ubuntu 17.04" {
  set isofile="/ubuntu-17.04-desktop-amd64.iso"
  loopback loop ($isopart)$isofile
  linux (loop)/casper/vmlinuz.efi boot=casper iso-scan/filename=${isofile} quiet splash only-ubiquity
  initrd (loop)/casper/initrd.lz
}