Loopback-Modul für Grub mit sicherem Boot

Loopback-Modul für Grub mit sicherem Boot

Ich baue einen Multi-Boot-USB-Stick mit Ubuntu-Derivaten. Ich habe mehrere Tutorials aus dem Internet befolgt: Im Wesentlichen speichert man die ISOs auf einem USB-Stick und bootet sie dann mit Grub, das auf dem Stick installiert ist.

Ich habe jedoch folgendes Problem: Mein Stick sollte auch mit aktiviertem Secure Boot funktionieren. Ich brauche jedoch das Loopback-Grub-Modul, um die ISOs zu booten, und wenn ich mit aktiviertem Secure Boot boote, verbietet Secure Boot Grub, das Loopback-Modul zu laden. Ich kann also nicht booten

Konnte irgendjemand ein ISO von Grub mit aktiviertem Secure Boot booten?

Danke

valerio

Antwort1

Ich versuche im Moment, dies zu umgehen.

Es sieht so aus, als ob Ubuntus Grub explizit gepatcht wurde, um das Laden von Modulen während des sicheren Bootens zu verhindern. Die Fehlermeldung ist nicht sehr hilfreich: Sie verweist verwirrenderweise auf den Dateinamen, wenn der Fehler auftritt, unabhängig davon, welches Modul geladen wird:

apt-get source grub-common
   ...
grep -C 10 "Secure Boot forbids" -r .
   ...
#ifdef GRUB_MACHINE_EFI
  if (grub_efi_secure_boot ())
    {
      grub_error (GRUB_ERR_ACCESS_DENIED,
                  "Secure Boot forbids loading module from %s", filename);
      return 0;
    }
#endif
...

Der Patch, der dies hinzufügt, ist ./debian/patches/no_insmod_on_sb.patch

Am besten bauen Sie Grub wahrscheinlich neu auf, indem Sie entweder die Loopback-Unterstützung fest codieren oder das Laden von Modulen zulassen. Vielleicht können Sie aber auch einfach den sicheren Start deaktivieren, wenn Sie vom USB-Stick booten (da dies eher selten vorkommt).

Wenn man Grub das Laden von Modulen erlaubt, hat das ziemlich komplizierte Auswirkungen auf die Sicherheit. Deshalb werde ich es vermeiden, dazu Kommentare abzugeben, da mir jemand sofort sagen würde, dass ich Unrecht habe, und wir dann streiten müssten.

Antwort2

Es scheint, dass aktuelle Versionen des signierten Grub-Images (zumindest die, die ich getestet habe und die mit Ubuntu 20.04 geliefert wird) das loopbackModul enthalten, sodass es nicht nötig ist, es zu laden/einzufügen. Tatsächlich ist dies nicht möglich, wie bereits in der obigen Antwort erwähnt. Ich veröffentliche die Konfiguration, die ich verwendet habe, um ein externes Laufwerk zu erstellen, das eine Ubuntu-Installations-/Live-Umgebung und eine Windows 10-Installation booten kann.

Ich habe am Ende mehrere Partitionen verwendet – eine 512 MB große EFI-Partition, eine 20 GB große NTFS-Partition für die entpackten Windows-Dateien und eine große FAT32-Partition für alles andere, einschließlich der Ubuntu-ISO. Die NTFS-Partition ist erforderlich, da Windows jetzt Installationsdateien mit mehr als 4 GB enthält. Ich glaube nicht, dass das signierte Grub-Image derzeit das Exfat-Modul enthält, daher ist NTFS hier die einzige Option. Nebenbemerkung: Die entpackten Windows-Dateien müssen sich im Stammverzeichnis der Partition befinden. Sie in einem Unterverzeichnis zu haben, hat bei mir nicht funktioniert.

Unten ist die Konfiguration, die ich für die Installation von Grub auf der EFI-Partition verwendet habe:

sudo grub-install \
--boot-directory=[EFI mount point]/boot \
--efi-directory=[EFI mount point] \
--uefi-secure-boot \
--removable \
--target=x86_64-efi \
--no-bootsector \
/dev/sdaX

Und hier ist die grub.cfgDatei (ich denke, die Zeilen über dem ersten Menüeintrag sind überflüssig, aber das ist die tatsächliche Konfiguration, die ich verwendet habe):

search --no-floppy --set=root --fs-uuid [UUID of EFI partition]
set prefix=($root)'/boot/grub'
configfile $root/EFI/BOOT/grub.cfg

set menu_color_normal=white/black
set menu_color_highlight=black/light-gray

menuentry 'Ubuntu 20.04.1' --class ubuntu --class gnu-linux --class gnu --class os {        
    set isodir='/images/ubuntu'
    set isoname='ubuntu-20.04.1-desktop-amd64.iso'
    set isofile=$isodir/$isoname
    
    search --no-floppy --set=isodev --fs-uuid [UUID of FAT32 partition]

    loopback loop0 ($isodev)/$isofile
    linux (loop0)/casper/vmlinuz boot=casper iso-scan/filename=$isofile quiet splash
    initrd (loop0)/casper/initrd
}

menuentry 'Windows 20H2' {
    set efi_path=/efi/boot/bootx64.efi
    
    search --no-floppy --set=windev --fs-uuid [UUID of NTFS partition]
    chainloader ($windev)/$efi_path
}

menuentry 'UEFI Firmware Settings' {
    fwsetup
}

Und das ist alles, ich hoffe, jemand findet es nützlich.

verwandte Informationen