Multiboot USB Stick bauen

Multiboot USB Stick bauen
Photo by Sara Kurfeß / Unsplash

Wer kennt es nicht, oft benötigt man verschiedene Betriebssysteme und möchte nicht für jedes einen eigenen USB Stick bereithalten, oder den einen dauernd überschreiben.
Um das Chaos zu vermeiden, lässt sich relativ schnell ein Multi-Boot-Stick erstellen, der Betriebssysteme wie Linux, Windows und auch diverse Boot CDs bereithält.

In dieser Anleitung wird folgendes getan:

  • Partitionstabelle erstellen und Flags setzen
  • Partitionen formatieren
  • Images herunterladen und auf den Stick kopieren
  • Grub (Bootloader) konfigurieren

Folgende Betriebssysteme sind angedacht:

  • Ubuntu 22.04 Desktop
  • Archlinux
  • Windows 10

Vorab möchte ich erwähnen, dass diese Anleitung für Linux gedacht ist. Falls gerade kein Linux zur Hand ist, einfach einen Stick mit Ubuntu vorbereiten und diesen booten. Danach kanns los gehen ;)
Natürlich wie gewohnt mit root-Rechten...

Warnung

Alle Befehle sind mit Vorsicht zu verwenden, bei fehlerhafter Handhabung können Daten gelöscht werden. Man sollte also sicher sein, welche Festplatte / USB-Device man verwendet.
In diesem Beispiel ist stets von /dev/sda die Rede, weil mein Laptop eine NVME nutzt. Je nach eigener Hardware kann dies anders sein und der USB-Stick z.B. /dev/sd[b,c,d,e...] lauten.

USB-Stick ermitteln

# Ubuntu
apt-get update && apt-get install util-linux parted ntfs-3g dosfstools wget

# Archlinux
pacman -Syu util-linux parted ntfs-3g dosfstools wget

# Auflistung aller Disks
lsblk -d

# bei Unsicherheit (auch Partitionen anzeigen)
lsblk

Partitionierung

Partitionen anlegen

# -s sorgt für "script"-Modus (keine Rückfragen)

# GPT-Partionstabelle anlegen (für UEFI Boot nötig)
parted -s /dev/sda mklabel gpt
parted -s mkpart primary 1m 2m

# ESP/Boot Partition
parted -s mkpart primary 2m 100m

# EXT4 Partition für GRUB (Bootloader) und Isos
parted -s mkpart primary 100m 30g

# Windows Partition
parted -s mkpart primary 30g 40g

Formatieren

# UEFIs ESP Partition muss FAT32 formatiert sein
mkfs.vfat -F 32 /dev/sda2

# Grub liest ext4-Dateisysteme
mkfs.ext4 /dev/sda3

# -f (fast, quick) (für Windows)
mkfs.nfts -f /dev/sda4

Dateisysteme mounten

mount /dev/sda3 /mnt/
cd /mnt/

# Isos werden unter /mnt/boot/iso gelegt (Grub sucht in seinem Root-Dir)
mkdir -p /mnt/boot/{EFI,iso}

# EFI Partition
mount /dev/sda2 /mnt/boot/EFI

# temporärer Ordner für GPT-Parittion 4 (Windows)
mkdir -p /tmp/windows_part
mount /dev/sda4 /tmp/windows_part

Images laden & kopieren

Die Links können und werden nach einiger Zeit veraltet sein. Die aktuellen findet man in Suchmaschinen...

cd /mnt/boot/iso

# Die Links werden zukünftig veraltet oder nicht mehr verfügbar sein, einfach aktuelle Images suchen!
wget https://releases.ubuntu.com/22.04/ubuntu-22.04-desktop-amd64.iso
wget https://mirror.fra10.de.leaseweb.net/archlinux/iso/2022.07.01/archlinux-2022.07.01-x86_64.iso

# Windows Image runterladen (und unter /tmp/ legen)
https://www.microsoft.com/en-in/software-download/windows10

# das Windows.iso liegt nun unter /tmp/windows10.iso
mkdir -p /tmp/win_iso_mount
# ISO read-only unter /tmp/win_iso_mount mounten
mount -o loop /tmp/windows.iso /tmp/win_iso_mount

# Dateien auf die 4. Partition des USB Sticks kopieren
cp -R /tmp/win_iso_mount/* /tmp/windows_part

# danach kann die 4. Partition wieder unmounted werden
umount /tmp/windows_part

Grub installieren

Es wird davon ausgegangen, dass Grub im System installiert ist...

 grub-install --target=i386-pc --recheck --boot-directory=/mnt/boot /dev/sda
 
 grub-install --target=x86_64-efi --recheck --removable --efi-directory=/mnt/boot/EFI/ --boot-directory=/mnt/boot/

Grub-Config schreiben

Vorgefertige Templates findet man im Internet, zum Beispiel hier:
https://github.com/hackerncoder/multibootusb/blob/master/grub.cfg.example

Diese kopiert man und legt die Datei unter /mnt/boot/grub/grub.cfg:

wget https://raw.githubusercontent.com/hackerncoder/multibootusb/master/grub.cfg.example -O /mnt/boot/grub/grub.cfg

Danach werden weitere Einträge angelegt, zur Orrientierung habe ich die Stelle mit ### markiert. Darüber und darunter sind die Einstiegspunkte zu erkennen:

# Load MBUSB configuration
if [ -e "$prefix/mbusb.cfg" ]; then
  source "$prefix/mbusb.cfg"
fi

### HIER EINFUEGEN

# die UUID des aktuellen RootFS wird ermittelt und in rootuuid gespeichert
probe -u $root --set=rootuuid
# die Disk wird anhand der ermittelten UUID referenziert (für Arch relevant)
set imgdevpath="/dev/disk/by-uuid/$rootuuid"

menuentry "ubuntu-22.04-desktop-amd64.iso" {
  insmod ext2
  # Die ISO-Datei sollte im  Pfad liegen, pruefen!
  set isofile="/boot/iso/ubuntu-22.04-desktop-amd64.iso"
  loopback loop $isofile
  linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=$isofile quiet noeject noprompt splash
  initrd (loop)/casper/initrd
}

menuentry 'archlinux-2022.07.01-x86_64.iso' {
  # Die ISO-Datei sollte im  Pfad liegen, pruefen!
  set isofile='/boot/iso/archlinux-2022.07.01-x86_64.iso'
  loopback loop $isofile
  linux (loop)/arch/boot/x86_64/vmlinuz-linux img_dev=$imgdevpath img_loop=$isofile earlymodules=loop
  initrd (loop)/arch/boot/x86_64/initramfs-linux.img
}

menuentry "Windows 10 (20H2) UEFI" {
  # die 4. Partition ist fuer Windows vorgesehen!
  set root=(hd0,gpt4)
  insmod part_gpt
  insmod ntfs
  insmod chain
  chainloader /efi/boot/bootx64.efi
}

### ENDE

# Grub options
submenu "GRUB2 options ->" {

Dateisysteme umounten

Wenn alles fertig ist, sollte man die Ordnerstruktur verlassen, falls man sich noch in dieser befindet (/mnt/...).

# Wenn alles fertig ist, sollte man die Ordnerstruktur verlassen, falls man sich noch in dieser befindet (/mnt/...).

cd

umount /mnt/boot/EFI
umount /mnt/
sync

Und im Anschluss sollte der Stick genutzt werden können.

MultibootUSB Projekt für Beispielkonfigurationen
https://github.com/hackerncoder/multibootusb

Archlinux Wiki
https://wiki.archlinux.org/title/GRUB
https://wiki.archlinux.org/title/Multiboot_USB_drive

Beispielkonfigurationen für GRUB
https://www.linuxbabe.com/desktop-linux/boot-from-iso-files-using-grub2-boot-loader