UEFI Loader entsperrt GELI Partition nicht

Rosendoktor

Well-Known Member
Hallo zusammen,

bei meinen Versuchen, FreeBSD über GRUB2 im UEFI Modus zu booten, hab' ich einen Teilerfolg errungen, leider mit Hilfe eines Workarounds mit dem ich zwar leben kann, der aber unschön ist.

Wie im anderen Thread beschrieben, will ich eigentlich den Kernel direkt von Grub starten, unter Umgehung des üblichen Loaders bzw. Bootmenüs. Das funktioniert im Legacy Modus einwandfrei, aber nicht oder nicht sauber im UEFI Modus, je nach Maschine...

Also wollte ich es anders versuchen, und das klappt so leidlich.

Der GRUB2 kann auch andere UEFI Loader starten, der Code dazu ist recht einfach:
Code:
menuentry "FreeBSD 12.1-RELEASE" --unrestricted {
    insmod zfs
    insmod bsd
    set root='(hd0,gpt2)'
    search --no-floppy --file --set=root /EFI/FREEBSD/BOOTX64.EFI
    chainloader /EFI/FREEBSD/BOOTX64.EFI
}
Der Loader BOOTX64.EFI (=loader.efi aus /boot) muss natürlich auf die EFI Partition.

Nun heisst es in den Manual Pages zu GELI:
Code:
                    -g                    Enable booting from this encrypted
                                          root filesystem.  The boot loader
                                          prompts for the passphrase and loads
                                          loader(8) from the encrypted
                                          partition.
Ich verstehe das so (und hab' es auch so im Netz gefunden) dass der Bootloader, wenn er eine mit dem -g Flag versehene Partition findet nach dem Passwort fragt, diese entsperrt und den Bootprozess fortsetzt. Also habe ich bei der verschlüsselten Bootpartition das -g und auch das -b Flag gesetzt.

Der UEFI Loader fragt aber nicht nach dem Passwort. Man sieht schön wie er alle Partitionen durchgeht und sich am Ende beschwert, dass er keine bootbare Partition findet (den genauen Wortlaut weiß ich nicht mehr).

Warum nicht? Kann das nur der Legacy Bootloader, oder ist das noch gar nicht implementiert, oder mache ich was falsch?

Der Workaround, welcher FreeBSD im UEFI Mode letztendlich bootfähig macht, war schlicht, eine unverschlüsselte Kopie der Bootpartition am Ende der SSD anzulegen. Die wird gefunden, und dann bootet der Kernel auch und es geht weiter...

Wäre schön wenn auch das Entsperren der verschlüsselten Bootpartition durch den UEFI Bootloader funktionieren würde. Weiß da jemand genaueres?

Grüße,

Robert
 
Nachtrag: Hier noch ein Auszug aus dem Wiki:

FreeBSD can boot using UEFI on the amd64 and arm64 platforms since FreeBSD 10.1 (r264095). More information is available in uefi(8). Like loader(8), the UEFI loader loader.efi supports booting from GPT UFS and ZFS filesystems and supports GELI in the loader.
Im weiteren Text ist aber von GELI keine Rede mehr...

Also eigentlich sollte das doch funktionieren, oder verstehe ich da irgendwas total falsch... :confused:
 
Der UEFI-Loader kann erst seit 12.0 von GELI-Partitionen booten. In älteren Versionen konnte es nur der BIOS-Loader. Damit es funktioniert, braucht man eine natürlich unverschlüsselte EFI-Partition und eine verschlüsselte Partition für das Root-Dateisystem. Die Partition für das Root-Dateisystem muss den Partitionstyp korrekt gesetzt haben, also freebsd-ufs für UFS oder freebsd-zfs für ZFS. Das GELI auf der verschlüsselten Partition braucht die Flags -g, damit der Loader nach dem Passwort fragt und -b, damit der Kernel den Schlüssel vom Loader übernimmt. Und es muss per geom_eli_load="YES" das GELI-Modul in der loader.conf, geladen werden. Meist wird man auch noch aesni_load="YES" wollen.

Bei mir sieht das zum Beispiel so aus:
Code:
=>        40  1000215136  ada1  GPT  (477G)
          40      262144     1  efi  (128M)
      262184    16777216     2  freebsd-swap  (8.0G)
    17039400   983175776     3  freebsd-zfs  (469G)

Code:
Geom name: ada1p3.eli
State: ACTIVE
EncryptionAlgorithm: AES-XTS
KeyLength: 256
Crypto: hardware
Version: 7
UsedKey: 0
Flags: BOOT, GELIBOOT, GELIDISPLAYPASS
KeysAllocated: 938
KeysTotal: 938
Providers:
1. Name: ada1p3.eli
   Mediasize: 503385996800 (469G)
   Sectorsize: 512
   Mode: r1w1e1
Consumers:
1. Name: ada1p3
   Mediasize: 503385997312 (469G)
   Sectorsize: 512
   Stripesize: 4096
   Stripeoffset: 0
   Mode: r1w1e1

Wenn er nicht nach dem Passwort fragt, kann es verschiedene Ursachen haben. Die beiden Klassiker sind:
  • Die EFI-Partition liegt auf einem anderem Device als die Root-Partition und die Firmware listet nur die Partitionen auf dem Bootdevice auf. Das ist bei UEFI zum Glück selten geworden, ich hatte bisher nur ein Board (irgendein Supermicro X9) in den Händen, was sich so verhielt. Beim BIOS war es Gang und Gäbe, dass alles, was auf einem anderem Device lag, für die Loader unsichtbar war. Wird es bei dir wahrscheinlich nicht sein, sonst könnte der Loader die Partitionen nicht auflisten.
  • Es ist der falsche Loader. Entweder aus einer älteren FreeBSD-Version, man muss sie ja manuell aktualisieren, oder einer der bis ich meine 11.3 noch standardmäßig zwischengeschalteten boot1-Chainloader. Der einzig wahre Loader ist /boot/loader.efi, alles andere unterstützt nur einen Teil der Features.
 
Danke, Problem gelöst! :D Tatsächlich dachte ich beim Durchlesen von Yamagis Post, okay, das passt ja alles, Partitionstyp freebsd-zfs, die Flags -g und -b gesetzt, alles auf der gleichen SSD, der Loader aus 12.1-RELEASE (gecheckt mit md5).

WhyTF geht das nicht?

Okay, die Lösung war dann: Ich hatte
Code:
geli configure -gb /dev/ada0p10
gemacht. Das wurde mir bem Abfragen aber gar nicht angezeigt...
Dann mit
Code:
geli configure -gb gpt/alkione_boot
probiert und Tadaaaa! Es funzt.
Mann, sowas kannte ich noch aus Zeiten, in denen ich ufs und glabel benutzt habe. Dachte, /dev/ada0p10 und /dev/gpt/alkione_boot würden auf dasselbe zeigen...
Danke nochmal! Damit wäre die Migration von Legacy zu UEFI abgeschlossen. Na ja, nicht ganz, auf dem PC ist die Bootpartition ein zfs mirror auf zwei geli partitionen, aber gut, das wird schon gehen...
 
Zurück
Oben