EFI stub/hu
- CONFIG_PM_STD_PARTITION for hibernation
Ez a cikk az EFI stub kerneleket írja le, vagyis azokat a kerneleket, amelyek közvetlenül végrehajthatóak az UEFI-ből.
Egy EFI stub (más néven EFI boot stub)[1] olyan kernel, amely EFI végrehajtható állomány, vagyis közvetlenül indítható az UEFI firmware-ből. Ez azt jelenti, hogy nincs szükség bootloaderre az indításukhoz. (De bootloader használata is lehetséges).
Kernel beállítása
EFI stub támogatás
Engedélyezni kell a következő kernel beállítási opciókat:
Processor type and features ---> [*] EFI runtime service support Search for <code>CONFIG_EFI</code> to find this item. [*] EFI stub support Search for <code>CONFIG_EFI_STUB</code> to find this item. [ ] EFI mixed-mode support (OPTIONAL) Search for <code>CONFIG_EFI_MIXED</code> to find this item.
Az EFI vegyes üzemmód támogatása csak akkor szükséges egy 64 bites kernel indításához 32 bites firmware-ből, ha a CPU támogatja a 64 bites módot, és az EFI handover engedélyezve van.
Telepítés
Ha nem létezik EFI System Partition (ESP), akkor kérjük, hogy kövesse a lépéseket a létrehozásához először.
Automatizált
Az UEFI-megvalósítások gyártónként eltérőek, ezért az EFI Stub indítás nem működik garantáltan minden UEFI rendszer esetében. Győződjön meg róla, hogy van egy tartalék bootolási módszer, mielőtt megpróbálja az (automatizált) EFI Stub indítást.
Az automatizált EFI stub indítást a sys-kernel/installkernel-38 és az annál újabb verziók biztosítják, amikor az efistub USE jelölőzászló engedélyezve van. Ez áthelyezi a szokásos indítási elrendezést a /boot könyvtárból az EFI System Partition EFI/Gentoo könyvtárába.
Systemd kernel-install
Amikor a efistub és a systemd USE jelölőzászlók engedélyezve vannak a sys-kernel/installkernel szoftvercsomagon, a kernel-install hívja a kernel-bootcfg parancsot a app-emulation/virt-firmware szoftvercsomagból, hogy hozzáadjon vagy eltávolítson egy boot bejegyzést a telepített vagy eltávolított kernelhez. A Installkernel automatikusan elindul a kernel make install parancsának futtatásakor vagy a Distribution Kernels' utótelepítési fázisában. Ezért a kernel új telepítésekor nincs szükség különleges lépésre, bár érdemes engedélyezni az app-emulation/virt-firmware szoftvercsomagból a kernel-bootcfg-boot-successful init szolgáltatást, hogy automatikusan állandósítsa az új kernel bejegyzését, ha annak indítása sikeres volt.
A systemd init rendszerrel működő operációs rendszerek számára:
root #
systemctl enable --now kernel-bootcfg-boot-successful.service
Az OpenRC init rendszerrel működő operációs rendszerek számára:
root #
rc-update add kernel-bootcfg-boot-successful default
Amikor a regisztrálandó kernelképfájl nem egy Unified Kernel Image, az új bejegyzéshez tartozó kernel parancssort az alábbi helyekről olvassa be:
- /etc/kernel/cmdline, vagy
- /usr/lib/kernel/cmdline, vagy
- /proc/cmdline
Ebben a sorrendben. Továbbá, az initrd= kernel parancssori argumentum automatikusan hozzáadásra kerül, ha a kernel telepítése közben initramfs képfájl lett generálva. Másfelől, ha a regisztrálandó kernel egy Unified Kernel Image, akkor az új bejegyzéshez nem kerül hozzáadásra parancssor. Ehelyett a Unified Kernel Image-be beépített parancssor használatos, amelynek tartalmát általában ugyanezen fájlokból olvassák ki, amikor a UKI generálódik.
Tradicionális installkernel
Amikor az efistub USE kapcsoló engedélyezve van a sys-kernel/installkernel szoftvercsomagon, de a systemd USE jelölőzászló le van tiltva, a Installkernel a uefi-mkconfig parancsot hívja meg a sys-boot/uefi-mkconfig szoftvercsomagból, hogy dinamikusan frissítse az UEFI beállítást. Ha a shim EFI végrehajtható állomány ugyanabban a könyvtárban található, mint a kernelkép, a kernelek Shim-en keresztül lesznek láncindítva.
Manuális
Javasolt egy külön könyvtár létrehozása a /efi/EFI alatt, feltételezve, hogy az ESP a /efi útvonalhoz van csatolva. Az EFI Stub támogatással beállított kernel esetében hozzon létre egy külön könyvtárat a /efi/EFI alatt:
root #
mkdir -p /efi/EFI/example
Egyes rendszereken előfordulhat, hogy /efi/EFI vagy /efi/efi (kisbetűvel) már létezik (feltételezve, hogy az ESP a /efi útvonalhoz van csatolva). Az EFI System Partition (ESP) FAT fájlrendszere nem kis- és nagybetű érzékeny, de kis- és nagybetűt megőrző (VFAT). Az alapértelmezett VFAT csatolási opciók mellett a fenti parancs mindkét esetben működni fog. További részletekért tekintse meg a kis- és nagybetű érzékenység szakaszát a FAT cikkben.
A kernel a jelenlegi kernelkönyvtárból kerül létrehozásra, majd az új könyvtárba másolódik. Ez telepíti a kernelt a következő helyre: /efi/EFI/example/bzImage.efi.
/usr/src/linux #
make && make modules_install && cp arch/x86/boot/bzImage /efi/EFI/example/bzImage.efi
Ajánlott a kernel frissítésekor egy korábban jól működő verziót megtartani:
user $
tree -L 3 /efi
/efi └── EFI └── example ├── bzImage-6.1.67.efi └── bzImage-6.1.70.efi
A root partíció beállítása
Ahhoz, hogy közvetlenül az UEFI-ből lehessen bootolni a számítógépet, a kernelnek vagy az initramfs fájlnak tudnia kell, hogy hol található az bootolandó operációs rendszer gyökérpartíciója. Ha grub típusú bootkezelőt használunk, akkor a kernel a bootkezelőből kapja meg a gyökérpartíció helyére vonatkozó információt parancssori paraméterként. Stub kernel használatakor két lehetőség áll rendelkezésre a kernel számára, hogy megkapja ezt az információt – válasszon ezek közül az opciók közül:
1. lehetőség: Beállítása a kernelben
Processor type and features --->
[*] Built-in kernel command line
(root=PARTUUID=adf55784-15d9-4ca3-bb3f-56de0b35d88d ro)
Az adf55784-15d9-4ca3-bb3f-56de0b35d88d érték példaként szolgál, és a valós gyökérpartíció értékére kell lecserélni. Ez a blkid parancs használatával szerezhető meg:
root #
blkid | grep sda3
/dev/sda3: UUID="d1e0c1e0-3a40-42c5-8931-cfa2c7deae32" TYPE="ext4" PARTUUID="adf55784-15d9-4ca3-bb3f-56de0b35d88d"
2. lehetőség: UEFI beállítása
Egy bejegyzés hozzáadásához kernel parancssori argumentumokkal:
root #
efibootmgr --create --disk /dev/sda --label "Gentoo EFI Stub" --loader "\EFI\example\bzImage.efi" -u "root=/dev/sda3"
A gyökér helyének beállítása egy PARTUUID segítségével, vagy (fájlrendszer) UUID használatával initramfs esetén általában előnyösebb és kevésbé hibára hajlamos.
További példák találhatók a Boot bejegyzés létrehozása részben.
Opcionális: Kernel initramfs fájllal
Amikor egy kernel külső initramfs képfájlt (CPIO archívumot) használ, további lépésekre van szükség. A dist-kernel létrehozásakor vagy genkernel használatakor mindig van initramfs képfájl. Dist-kernel használata esetén ez az initramfs "initrd" néven található a következő helyen: /usr/src/linux-6.1.57-gentoo-dist/arch/x86/boot/initrd. Ezt a fájlt szintén át kell másolni az ESP-be.
root #
cp /path/to/my/initramfs/myinitrd.cpio.gz /efi/EFI/example/initrd.cpio.gz
Most már a kernelnek szüksége van az információra, hogy hol találja meg az initramfs képfájlt, és az initramfs képfájlnak is szüksége van az információra, hogy hol találja meg a gyökérpartícióját. Az UEFI-nek mindkét információt meg kell adnia:
root #
efibootmgr -c -d /dev/sda -p 1 -L "Gentoo EFI Stub" -l '\EFI\example\bzImage.efi' -u 'root=UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx initrd=\EFI\example\initrd.cpio.gz'
Egy fórumbejegyzés részletesebben kifejti ezt, és megoldott néhány felhasználói hibát is. Ha szeretné, segíthetek megtalálni a kapcsolódó információkat vagy további részleteket.
Fórum téma - UEFI indítása Grub nélkül
Amikor Early Userspace Mounting-ot használunk, a Initramfs létrehozása és a Stub Kernel használata szakaszok részletesebben elmagyarázzák ezt.
Opcionális: Beágyazott initramfs képfájl
Az initramfs bináris képfájl közvetlenül beágyazható a bináris kernelbe. Ennek előnyei közé tartozik, hogy az initramfs képfájlt a Secure Boot ellenőrzi, amikor a kernelt ellenőrzi, egyszerűsíti az indítási folyamatot és az EFI partíciót, valamint megkönnyíti a kernel kézi betöltését (mivel a hívóknak már nem kell megadniuk az initramfs képfájlt). Hátrányai közé tartozik a rugalmasság csökkenése, a hibázás lehetősége, valamint egy nem hagyományos indítási beállítás használata.
Ha az initramfs tartalmaz Microcode-ot, akkor biztonsági szempontból kritikus fontosságú, hogy frissítéseket kapjon. Ha be van ágyazva, az initramfs nem frissíthető önállóan a kerneltől, és minden initramfs frissítéskor szükséges lesz a kernel újrafordítása. Különösen ügyeljen arra, hogy:
- Ha a kernel újrafordítása előtt nem kerül végrehajtásra a , akkor a
root #
make clean
parancsot kell futtatni, hogy törölje az előző buildből visszamaradt, gyorsítótárazott initramfs CPIO archívumot.root #
rm usr/initramfs_data.cpio
- Amikor az initramfs képfájl frissül, a kernelt újra létre kell hozni és telepíteni kell azt.
- Ha az initramfs képfájlt a sys-apps/portage kezeli, akkor az initramfs a kernel előtt frissül.
A kernel támogatja mind a CPIO fájlokat (például, ahogyan Dracut létrehozza), mind a forráskönyvtárakat, amelyeket CPIO archívumba kell tömöríteni. Az alábbi példa az utóbbit mutatja a /usr/src/initramfs útvonallal, azonban a /path/to/my/initramfs/myinitrd.cpio.gz-re kell cserélni, ha az előző eset kívánatos (ez általában így van, hacsak nem Custom Initramfs-t használ).
General Setup --->
[*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
(/usr/src/initramfs) Initramfs source file(s)
EFI firmware beállítása
A megfelelő működés biztosítása érdekében a kernel indítható az initrd parancssori argumentum nélkül.
A Unified Kernel Image bejegyzés létrehozásához:
root #
efibootmgr --create --disk /dev/sda --label "Gentoo EFI Stub" --loader "\EFI\example\bzImage.efi"
Tartalék kernel
Ajánlott, hogy mindig legyen egy tartalék kernel. Ha már van telepítve egy bootkezelő, például grub, akkor azt nem szabad eltávolítani, mivel a grub képes stub kernelt indítani, mint egy normál kernelt. Egy másik lehetőség, hogy dolgozunk egy kiegészítő UEFI bejegyzéssel. Az új kernel telepítése előtt a jelenlegi kernel másolható a /efi/EFI/example/ útvonalról a /efi/EFI/backup helyre. A második UEFI bejegyzés szintén efibootmgr segítségével lett létrehozva. Ebben a példában más neveket használtak.
root #
efibootmgr
BootCurrent: 0002 Timeout: 1 seconds BootOrder: 0002,0000,0001 Boot0000* Secure HD(1,GPT,0adcbfee-21aa-42ea-9a9a-2e53bd05e6a2,0x800,0x7f800)/File(\EFI\secure\bzImage.efi) Boot0001* gentoo HD(1,GPT,0adcbfee-21aa-42ea-9a9a-2e53bd05e6a2,0x800,0x7f800)/File(\EFI\gentoo\grubx64.efi) Boot0002* Backup HD(1,GPT,0adcbfee-21aa-42ea-9a9a-2e53bd05e6a2,0x800,0x7f800)/File(\EFI\backup\bzImage.efi)
Mikrokód betöltése
Amikor initramfs képfájl nélküli kernelt használunk, ajánlott betölteni a mikrokódot, amelyet az alábbi cikkek ismertetnek:
Opcionális: Aláírás a Secure Boot számára
Ha a kernelt a Secure Booting segítségével indítjuk, akkor azt alá kell írni az sbsign használatával, amely az app-crypt/sbsigntools szoftvercsomag része.
root #
sbsign --key {db key} --cert {db cert} /efi/EFI/example/bzImage.efi
További információ érhető el a Secure Boot leírásban.
Nem lehet EFI Stub bootot végrehajtani a sys-boot/shim segítségével, mivel a vanilla EFI Stub hiányolja a szükséges .sbat sbat szekciót. Ezért az alkalmazott aláírókulcsokat közvetlenül a UEFI firmware-hez kell regisztrálni, hogy az EFI Stub boot Secure Boot engedélyezéssel működjön. Alternatív EFI Stub bootolási módszer, amely támogatja a shim-en keresztüli bootolást, a Unified Kernel Image wiki oldalon található.
Hibaelhárítás
- Régebbi kernelek, amelyeket a gcc:10-nal fordítottak, indításkor összeomlottak (bug #721734#c4).
A sys-kernel/gentoo-kernel-bin szoftvercsomagot használó felhasználók megadhatják a gyökérpartíció elérési útját a root=
paraméterrel, a efibootmgr segítségével:
root #
efibootmgr -c -L "Gentoo Linux" -l '\EFI\Gentoo\bootx64.efi' -u 'root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'
- Boot bejegyzés létrehozása az efibootmgr segítségével, hibernálás swap partíción:
root #
efibootmgr -c -L "Gentoo Linux" -l '\EFI\Gentoo\bootx64.efi' -u 'root=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX resume=PARTUUID=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'
További olvasnivaló a témában
- UEFI — a firmware standard for boot ROM designed to provide a stable API for interacting with system hardware. On x86 it replaced the legacy BIOS.
- Efibootmgr — egy eszköz az UEFI rendszerindító bejegyzések kezelésére.
- Architecture specific kernel configuration (AMD64 Handbook)
- REFInd — a boot manager for UEFI platforms.
- Unified Kernel Image — a single executable which can be booted directly from UEFI firmware, or automatically sourced by boot-loaders with little or no configuration.
Külső források
- Linux Kernel Documentation on EFI Stub
- EFI Stub - booting without a bootloader Blog posting which this article is partially based on.
- EFI bootloaders listing alternative ways to boot an (U)EFI system.
- Gentoo Forums: Suspend and Hibernate with UEFI
- http://www.kroah.com/log/blog/2013/09/02/booting-a-self-signed-linux-kernel/