rss feed articles all_comments

indeedgeek.de

Florian Eitel

Multiboot EFI USB Stick

Vielleicht hat jemand den letzten Beitrag über EFI gelesen. Und vielleicht ist jemanden der Fehler aufgefallen: Wie booted man von USB in EFI, wenn das EFI Binary nicht über efibootmgr in der Firmware registriert ist? Schließlich kann man nicht jeden USB Stick erst in der EFI Firmware registrieren, damit man auch davon booten kann.

Als erstes muss man den USB Stick partitionieren. Aber möchte man dies mit EFI tun, müsste man eine Partition mit den EFI Binaries und eine für die eigentlichen Daten erstellen.

Um das etwas einfacher zu gestalten gibt es in EFI Konventionen um mit removable devices umzugehen. Wenn der USB Stick mit FAT formatiert ist, dann schaut die EFI Firmware automatisch im Ordner /EFI/BOOT/ nach einer Datei abhängig von der Architektur (i386 = BOOTIA32.EFI, x86_64 = BOOTX64.EFI, ia64 = BOOTIA64.EFI).

Somit ist es relativ einfach ein USB Stick zu erstellen, der mit EFI bootet:

GPT erstellen und mit FAT formatieren


$ cgdisk /dev/sdh
#-> neue Partition mit Type 0x0700 Microsoft basic data

$ mkfs.vfat /dev/sdh1

Grub installieren

Anschließend die Partition mounten (in meinem Beispiel unter /media/950A-B6EC) und die Ordner efi und boot erstellen. Dann kann man auch schon Grub installieren:


grub2-install --target x86_64-efi --efi-directory /media/950A-B6EC/efi/ --removable --boot-directory=/media/950A-B6EC/boot

Wichtig ist dabei das removable Flag. Das sorgt dafür, dass das Image unter /EFI/BOOT/ und dann der entsprechenden Datei je nach Architektur gespeichert wird.

Deshalb kann man sich auch die bootloader-id sparen da das nur den Namen des Ordners unter /EFI/$bootloader-id angibt.

Grub konfigurieren

Nun kann man auch schon damit beginnen Grub zu konfigurieren. Ich möchte zwei Boot Entries haben. Einmal soll von der Festplatte ganz normal gestartet werden und ein zweiter Eintrag soll eine GRML Live-CD gestartet werden.

Für GRML habe ich einfach das ISO in das Verzeichnis isos im root des USB-Sticks kopiert und folgendermaßen in der /boot/grub2/grub.cfg eingetragen:


menuentry "Grml Rescue System (grml64-full_2012.05.iso)" {
  insmod part_msdos
  insmod ext2
  insmod part_gpt
  insmod fat
  search --no-floppy --fs-uuid --set=root 950A-B6EC
  iso_path="/isos/grml64-full_2012.05.iso"
  export iso_path
  loopback loop "/isos/grml64-full_2012.05.iso"
  set root=(loop)
  configfile /boot/grub/loopback.cfg
}

search sucht nach dem USB-Stick und iso_path gibt den Pfad an in dem das ISO gespeichert ist. Anschließend wird der root von Grub in das ISO gesetzt und die Config des Grub2 von dort geladen. Somit bekommt man ein Untermenü präsentiert, mit den auf der ISO definierten Boot Einträgen, als würde man die ISO ganz normal booten.

Ebenso funktioniert das Eintragen von gentoo:


menuentry 'Boot from HDD' {
  insmod gzio
  insmod part_gpt
  insmod ext2
  set root='hd0,gpt2'
  search --no-floppy --fs-uuid --set=root 5c3c2438-4bfa-4747-a33a-86646e3d5292
  set prefix=($root)/boot/grub2
  configfile /boot/grub2/grub.cfg
}

Hier können wir uns den iso_path sparen, dafür geben wir nur die gpt uuid der /boot Partition an und laden die grub.cfg-config von dort.

Alternativ können wir auch das Submenü überspringen und direkt den neusten Kernel laden. Dazu müssen wir aber wissen wie er heißt. Gentoos genkernel legt automatisch einen Symlink von /boot/initramfs bzw. /boot/kernel auf den aktuellsten Kernel an. Das machen wir uns zu nutze und booten so direkt den Symlink-Namen.


menuentry 'Latest gentoo kernel from HDD' {
  insmod gzio
  insmod part_gpt
  insmod ext2
  search --no-floppy --fs-uuid --set=root 5c3c2438-4bfa-4747-a33a-86646e3d5292
  echo  'Loading Linux gentoo latest ...'
  linux  /kernel root=/dev/mapper/root ro crypt_root=UUID=12c13dd9-7e8e-4ce2-a91e-50bafcf9be06 root_trim=yes root_keydev=/dev/disk/by-uuid/386E-BA32 root_key=key
  echo  'Loading initial ramdisk ...'
  initrd  /initramfs
}

Dabei muss man die Kernel Parameter entsprechend mit übernehmen. Deshalb steht unter linux meine Einstellung für Disk encryption und SSD.

Zuletzt noch ein Eintrag für memtest:


menuentry "memtest86+ 4.20" {
    linux /boot/memtest86plus/memtest
}

Vorher muss das memtest Binary in den korrekten Ordner auf dem USB-Stick kopiert werden.

Wenn man mal verstanden hat, wie Grub2 und EFI funktioniert eigentlich keine Magic. Auch wenn es sich etwas kompliziert anhört. Ich hoffe das hat jemanden weiter geholfen.

Comments:

(howto comment?)