UEFI

Allikas: Imre kasutab arvutit
Mine navigeerimisribaleMine otsikasti

Sissejuhatus

TODO

UEFI Shell kasutamine

UEFI shell võib olla

  • integreeritud arvuti riistvaras - sel juhul tavaliselt arvuti käivitumisel UEFI setup keskkonnas saab valida efi shelli minemise
  • arvuti riistvara oskab käivitada uefi shelli kui talle vastav .efi ette näidata

Teine variant on nt kasutusel arvuti J3170M puhul, efi shell sobib kopeerida nt aadressilt https://sourceforge.net/p/tianocore/edk2/ci/master/tree/

EdkShellBinPkg -> Full Shell -> X64 -> Shell_Full.efi

ja paigutada nt arvutile külge ühendatatava USB pulge juur failisüsteemi või /boot/efi partitsioonile nimega shellx64.efi.

Kopeerimine

fs0:\EFI\debian> cp fs1:\vmlinuz-4.7.0-0.bpo.1-amd64 .

Boot valiku lisamiseks sobib öelda

TODO

OS installeri ISO tõmmise käivitamine

UEFI keskkonnasst OS installeri kasutamise eelduseks on, et see installer on nö EFI võimeline. Peale OS installeri ISO tõmmise arvutiga ühendamist (füüsiline CD seade, mingi remote virtual cd tõmmise ühendamine jms) tuleb öelda UEFI Shellis

Shell> map -r

mille väljundis peaks esinema uus plokkseade, nt fs1. Edasi tuleb käivitada boot*.efi nimeline fail (tab ei lõpeta sedasi kataloogi ja failinimesid ära)

Shell> fs1:\EFI\BOOT\BOOTX64.EFI

Tavaliselt seejärel käivitub GRUB2 bootloader, millest edasi saab jätkata tavalisel viisil. Lisaks on võimalik GRUB2'st väljuda, nt valides C ning seejärel exit

grub> exit

Tulemusena satutakse tagasi EFI shelli.

Arvuti firmware uuendamine EFI shellist

TODO

Võrk EFI shellist

TODO

Arvuti dignostika EFI shellist

Memtest86 http://www.memtest86.com/ kasutamisel paistab selline pilt

Uefi-10.gif

Kasulikud lisamaterjalid

efibootmgr

EFI kasutamiseks on vajalikud sellised paketid + grub v. 2.02 vms

grub-efi-amd64-bin
efibootmgr

Olemasolevate EFI boot valikute esitamine

# efibootmgr
BootCurrent: 0008
Timeout: 0 seconds
BootOrder: 0002,0008,0003,0005,0000,0001,0006
Boot0000  EFI Network 3
Boot0001  EFI Network 4
Boot0002* proxmox
Boot0003  EFI Network 1
Boot0005  EFI Network 2
Boot0006* Windows Boot Manager
Boot0008* debian

kus

  • BootCurrent - vaikimisi käivitatav valik
  • Timeout - viivitus
  • BootOrder - boot valikute läbiproovimise järjekord, esimene töötav käivitub
  • Boot0xxx - boot valikud
  • UEFI Boot menüü esitab ainult BootOrder nimekirjas olevaid valikuid oma sissekannetena

Kaheksanda boot valiku eemaldamiseks arvuti NVRAM seest

# efibootmgr -b 8 -B

Järgmise UEFI boot sissekande tekitamine, automaatselt pannakse see boot orderis esimesele kohale

# grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=deb2 --recheck
Installing for x86_64-efi platform.
File descriptor 4 (/dev/sda1) leaked on vgs invocation. Parent PID 3056: grub-install
File descriptor 4 (/dev/sda1) leaked on vgs invocation. Parent PID 3056: grub-install
Installation finished. No error reported

Tulemusena tekib UEFI boot menüüsse juurde uus boot valik 'deb2' ning failisüsteemi genereeritaks efi grub rakendus

/boot/efi/EFI/deb2/grubx64.efi

Seejärel võiks uuesti genereerida ka grub.cfg faili

# update-grub

Sobiva uefi valikute järjestatud nimekirja saab tekitada nt selliselt (seejärel programmi väljundis näidatakse kehtestatud uut orderit)

# efibootmgr -o 2,8,3,5,0,1

EFS partitsiooni monteerimiseks sobib kasutada sellist rida

# cat /etc/fstab
...
/dev/sda1  /boot/efi       vfat    umask=0077      0       1

kusjuures EFI failisüsteemi sobib moodustada nt selliselt

# mkfs.vfat -F32 -n EFI /dev/sdb1
mkfs.fat 3.0.27 (2014-11-12)

Tundub, et UEFI arvuti grub promptis öeldes jõuab tulemusena arvuti Setup keskkonda

grub> fwsetup

Trusted Boot ja SHIM

TODO

refind boot iso kasutamine

Tundub, et rEFInd http://www.rodsbooks.com/refind/ sobib hästi erakorraliselt muidu UEFI installiga arvuti käivitamiseks.

  • bootida .iso pealt üles
  • valida meelepärane efi sissekanne vms (nt tuum, eelduseks on, et kuhugi efi failisüsteemis on sobiv tuuma ja initrd kopeeritud; või siis efi shellis olles kopeerida)
  • pressid F2 ja näidata juur failisüsteem (tõnäeoliselt initrd on juba kirjas, st sisestada selle ette 'ro root=/dev/mapper/...')
ro root=/dev/mapper/pve-root initrd=...

refind .zip arhiivi kasutamine

Paigaldamine

Kopeerida ja pakkida lahti, nii et tulemuseks on /boot/efi failisüsteemis /boot/efi/EFI kataloogis bootvalikule 'refind' vastav kataloogi sisu sarnane (kopeerides .zip failist sellised kataloogid ja failid)

/boot/efi/EFI/refind/drivers_x64
/boot/efi/EFI/refind/icons
/boot/efi/EFI/refind/refind_x64.efi
/boot/efi/EFI/refind/tools_x64

Lisaks tuleb kopeerida efi failisüsteemi tuum ja initramfs, nt

# cp /boot/vmlinuz-4.4.0-87-generic /boot/initrd.img-4.4.0-87-generic /boot/efi/EFI/refind
# cd /boot/efi/EFI/refind

nimeteada tuuma failinimi ümber .efi lõpuga failiks (tundub, et see pole praktiliselt vajalik)

# mv vmlinuz-4.4.0-87-generic vmlinuz-4.4.0-87-generic.efi

Seadistamine

Seejärel sobib kasutada nt sellist seadistusfaili sisu

# cat /boot/efi/EFI/refind/refind.conf 
timeout 20
menuentry refind {
    icon /EFI/refind/icons/os_linux.png
    loader /EFI/refind/vmlinuz-4.4.0-87-generic
    initrd /EFI/refind/initrd.img-4.4.0-87-generic
    options "ro root=/dev/mapper/system-root"
}

kus

  • TODO

Veenduda, milline on muudatuste eelne boot järjekord

# efibootmgr -v

ning lisada efi boot valik, nb! lisatud valik muutub vaikevalikuks

# efibootmgr -c -L "refind" -l 'EFI\refind\refind_x64.efi'

ja kohendada muudatuste järgne boot järjekord, et senine default oleks edasi default

# efibootmgr -o 0,1,2

Kasutamine

Peale refind boot loaderi paigaldamist paitab uefi boot valikute nimekiri nimekiri nt selline, refind on aktiivne ja all on efi file path

Uefi-12.gif

Valides refind paistab selline pilt

Uefi-13.gif

ja liikudes refind edit režiimi selline pilt (valides Tab klahvi)

Uefi-14.gif

ning Tab abil editor sisse liikudes, siin saab muuta kerneli parameetreid

Uefi-15.gif

ELILO

Märkus: 2017 aasta alguses tundub, et see on iganenud tarkvara.

ELILO EFI rakendus abil saab arvuti käivitada EFI kaudu. Selleks tuleb kuhugi paigaldada elilo pakett

 | It is necessary to run /usr/sbin/elilo to install the new elilo binary into the EFI partition.          │  
 │                                                                                                         │  
 │ WARNING: This procedure will write data into the debian directory of the EFI disk partition, possibly   │  
 │ overwriting files installed there by hand.                                                              │  
 │                                                                                                         │  
 │ Not installing the new elilo binary on the EFI disk partition may leave the system in an unbootable     │  
 │ state.  Alternatives to automatic updating of the partition include running /usr/sbin/elilo by hand,    │  
 │ or installing the new /usr/lib/elilo/elilo.efi executable into the EFI disk partition manually.         │  
 │                                                                                                         │  
 │ Automatically run elilo?       

ning kopeerida bootitava arvuti ESP failisüsteemi sellised failid

# find /boot/efi/EFI/ELILO/ -ls
  120    4 drwx------   2 root     root         4096 May  1 01:05 /boot/efi/EFI/ELILO/
  126  236 -rwx------   1 root     root       239976 May  1 01:02 /boot/efi/EFI/ELILO/elilo.efi
  127    4 -rwx------   1 root     root          463 May  1 01:14 /boot/efi/EFI/ELILO/elilo.conf
  128 4236 -rwx------   1 root     root      4336880 May  1 01:05 /boot/efi/EFI/ELILO/vmlinuz-2.6.32-37-pve
  129 1908 -rwx------   1 root     root     20382462 May  1 01:05 /boot/efi/EFI/ELILO/initrd.img-2.6.32-37-pve

kus

  • elilo.efi - rakendus
  • elilo.conf - seadistusfail

kus nt

# cat /boot/efi/EFI/ELILO/elilo.conf

delay=20
default=pve

image=vmlinuz-2.6.32-37-pve
  label=pve
  initrd=initrd.img-2.6.32-37-pve
  description="Boot Debian Linux"
  read-only
  root=/dev/mapper/pve-root
  append="console=ttyS0,9600
  • booditava operatsioonisüsteemi tuum ja initramfs

Käivitamiseks sobib uefi shellist öelda

Shell> fs0:\efi\elilo\elilo.efi
ELILO v3.14 for EFI/x86_64n internal or external command, operable program, or batch fileram, or batch file
..
Loading kernel vmlinuz-2.6.32-37-pve...  done
Loading file initrd.img-2.6.32-37-pve...done
...

EFI Stub

EFI Stub tähistab võimalust kasutada Linux tuuma nagu efi rakendust ning otse sellega süsteem alglaadida. Käsitsi uefi shellist toimub see selliselt

fs0:\> cp vmlinuz-3.2.0-4-amd64 vmlinuz-3.2.0-4-amd64.efi
fs0:\> vmlinuz-3.2.0-4-amd64.efi initrd=initrd.img-3.16.0-4-amd64 ro root=/dev/mapper/pve-root_deb8 console=ttyS0,9600

EFI boot sissekannete nimekirja lisamiseks sobib öelda

# efibootmgr -c -g -L "Debian (EFI stub)" -l '\EFI\BOOT\vmlinuz-3.2.0-4-amd64.efi' -u 'root=/dev/mapper/pve-root 
  ro rootfstype=ext3 add_efi_memmap initrd=\\EFI\\BOOT\\initrd.img-3.2.0-4-amd64 console=ttyS0,9600'

Kasulikud lisamaterjalid

syslinux-efi

Tarkvara paigaldamiseks sobib öelda

# apt-get install syslinux-efi

EFI rakendused on

# find /usr/lib/SYSLINUX.EFI -type f
/usr/lib/SYSLINUX.EFI/efi64/syslinux.efi
/usr/lib/SYSLINUX.EFI/efi32/syslinux.efi

Seadisusfailina kasutatakse

/boot/efi/EFI/syslinux/syslinux.cfg
Getting cached packet 
My IP is 10.0.0.18
Loading vmlinuz-2.6.32-37-pve... okoking vmlinuz-2.6.32-37-pve... 
Loading initrd.img-2.6.32-37-pve...okoking initrd.img-2.6.32-37-pve...

GRUB

Kui arvutil on boot valikud on nt sellised

Uefi-11.gif

kus

  • UEFI: * - arvuti käivitatakse kui UEFI riistvara
  • mitmed muud valikud käivitavad arvuti kui BIOS riistvara

Selleks, et käivitatud arvutit saaks seadistatada UEFI'i arvutina (nt kaustada efibootmgr programmi) tuleb ta käivitada UEFI režiimis.

'UEFI: Network Card' kaardilt käivitamiseks on muus osas nagu tavalne DHCP + TFTP käivitamine, kuid seejuures peab TFTP serveril asuma spetsiifiline GRUB EFI rakendus, mis muu hulgas sisaldab kõiki kataloogis /usr/lib/grub/x86_64-efi olevaid grub mooduleid. Sellise rakenduse tekitamiseks sobib öelda (millegipärast grub.cfg'd ei kasutata ...)

# grub2-mkstandalone -d /usr/lib/grub2/x86_64-efi -O x86_64-efi --fonts="unicode" -o bootx64.efi boot/grub/grub.cfg

Peale seda kui UEFI network boot on kopeerinud rakendust ning selle käivitamise tulemusel on ees grub> prompt tuleb laadida mõned olulised moodulid, nt

grub> insmod part_gpt
grub> insmod efi_gop
grub> insmod efi_uga
grub> insmod mdraid1x
grub> insmod lvm

ja seejärel tuum, initrd ning arvuti bootida

grub> linux (lvm/pve-root)/boot/vmlinuz-2.6.32-37-pve ro root=/dev/mapper/pve-root console=ttyS0,9600
grub> initrd (lvm/pve-root)/boot/initrd.img-2.6.32-37-pve
grub> boot

Tulemusena peaks arvuti töötama.

Märkused

UEFI kasutamiseks tuleb arvuti käivitada UEFI režiimis. Võib-olla on arvuteid, mida ei saagi muul viisil käivitada, aga tundub, et 2015 aasta kevadel on nö kahe-režiimsed arvutid üsna levinud

TODO

Kui selline arvuti on käivitatud nt SystemRescueCd plaadilt BIOS alla, siis paistab efibootmgr väljund sedasi

Fatal: Couldn't open either sysfs or procfs directories for accessing EFI variables
  • Kui ühte ja sama arvutit käivitada nö UEFI ja mitte-UEFI režiimis (nt laadides sama tuumaga tftp serverilt), siis paistavad dmesg peal sarnased erinevused
# diff /var/tmp/uefita.log /var/tmp/uefiga.log
..
< Command line: initrd=initrd.img-2.6.32-37-pve root=/dev/mapper/pve-root ro console=ttyS0,9600 BOOT_IMAGE=vmlinuz-2.6.32-37-pve 
---
> Command line: BOOT_IMAGE=(lvm/pve-root)/boot/vmlinuz-2.6.32-37-pve ro root=/dev/mapper/pve-root console=ttyS0,9600
10,12c10,11
<  BIOS-e820: 0000000000000000 - 000000000009bc00 (usable)
<  BIOS-e820: 000000000009bc00 - 00000000000a0000 (reserved)
<  BIOS-e820: 00000000000e0000 - 0000000000100000 (reserved)
---
>  BIOS-e820: 0000000000000000 - 00000000000a0000 (usable)
>  BIOS-e820: 00000000000a0000 - 00000000000c0000 (reserved)
..
31a32,118
> EFI v2.31 by American Megatrends
>                              BIOS ID: S1200RP.86B.01.03.0004.201308211450
>  ACPI 2.0=0xbefeff98  SMBIOS=0xf0440 
> EFI: mem00: type=3, attr=0xf, range=[0x0000000000000000-0x0000000000008000) (0MB)
> EFI: mem01: type=7, attr=0xf, range=[0x0000000000008000-0x000000000003f000) (0MB)
> EFI: mem02: type=4, attr=0xf, range=[0x000000000003f000-0x0000000000040000) (0MB)
> EFI: mem03: type=3, attr=0xf, range=[0x0000000000040000-0x00000000000a0000) (0MB)
> EFI: mem04: type=2, attr=0xf, range=[0x0000000000100000-0x0000000001566000) (20MB)
...
> efifb: probing for efifb
> efifb: framebuffer at 0xc2000000, mapped to 0xffffc90009e00000, using 1920k, total 1920k
> efifb: mode is 800x600x32, linelength=3200, pages=1
> efifb: scrolling: redraw
> efifb: Truecolor: size=8:8:8:8, shift=24:16:8:0
> Refined TSC clocksource calibration: 3292.375 MHz.
> Console: switching to colour frame buffer device 100x37
> Switching to clocksource tsc
> fb0: EFI VGA frame buffer device
....

efivar programmiga saab uurida EFI muutujaid

# apt-get install efivar

mis paistab sedasi

# efivar -l
8be4df61-93ca-11d2-aa0d-00e098032b8c-BootCurrent
8be4df61-93ca-11d2-aa0d-00e098032b8c-QuickLookBoot
8be4df61-93ca-11d2-aa0d-00e098032b8c-ErrOutDev
8be4df61-93ca-11d2-aa0d-00e098032b8c-ConOut
8be4df61-93ca-11d2-aa0d-00e098032b8c-ConOutDev
8be4df61-93ca-11d2-aa0d-00e098032b8c-ConInDev
8be4df61-93ca-11d2-aa0d-00e098032b8c-ConIn
...
  • Tundub, et mingil juhul ei õnnestus efibootmgr -c ... abil lisada jääval boot sissekannet ja peale rebooti arvuti ise kuidagi avastab mingid /boot/efi failisüsteemi sissekanded ja kasutab valikuliselt neid (nt arvutil https://www.msi.com/Motherboard/H110M-PRO-VD/Overview).
  • vahel ütleb efibootmgr nii
# efibootmgr -b 0 -B
Could not delete variable: Read-only file system

Aitab öelda

# mount -o remount,rw /sys/firmware/efi/efivars

startup.nsh

Tavaliselt püütakse nö efi shelli boot valiku tegemisel käivitada vaikimisi efi failisüsteemi juurikas asuvat skripti startup.nsh, mille sisu võiks olla nt

fs0:
\EFI\debian\grubx64.efi

UEFI kasutamise iseärasusest erineval riistvaral

Kuigi ootus võiks olla, et UEFI on standard, mis realiseerib nö ühetaolise kasutuskogemuse, on erinevate põlvkondade ja erinevate tootjate arvutid selles mõttes üsna erinevad.

HP ProBook 6450b 68CDE laptop

TODO

Partitsioonide ettevalmistamine

# parted /dev/sda
(parted) unit s
(parted) mklabel gpt
(parted) mkpart esp 2048 411647
(parted) mkpart boot 411648 1435647
# fdisk /dev/sda
...

Tulemusena

% parted /dev/sda p
Model: DELL PERC H310 (scsi)
Disk /dev/sda: 299GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags: 

Number  Start   End    Size   File system  Name  Flags
 1      1049kB  211MB  210MB               esp   boot, esp
 2      211MB   735MB  524MB               boot
 3      735MB   299GB  299GB                     lvm

Xen käivitamine UEFI keskkonnas xen-4.8-amd64.efi rakendusega

Tundub, et 2016 novembris on Debian v. 9 Stretch paketihalduses Xen v. 4.8.0 kohal ja ka seal sisaldub xen-4.8-amd64.efi rakendus. Üks viis seda käivitada peaks olema

UEFI -> XEN.EFI -> TUUM -> INITRAMDISK
  • moodustada efi failisüsteemi kataloog xen
# mkdir /boot/efi/EFI/xen
  • kopeerida sinna xen efi rakendus, tuum ja initrd
# cp xen-4.8-amd64.efi vmlinuz* initrd* /boot/efi/EFI/xen
  • moodustada xen efi rakenduse seadistusfail, midagi sellist
# cat xen-4.8-amd64.cfg
[global]
default=debian9

[debian9]
options=console=vga,com1 com1=9600 loglvl=all noreboot
kernel=vmlinuz-4.8.0-1-amd64 ignore_loglevel root=/dev/mapper/system-root ro nosetmode
ramdisk=initrd.img-4.8.0-1-amd64
  • lisada efibootmgr abil boot valik arvuti nvram'i (alternatiiv on arvuti käivitumisel käsitsi jõuda kõnealuse efi rakenduse käivitamiseni)
# efibootmgr -L Xen -l "\EFI\xen\xen-4.8-amd64.efi" -c

Tulemusena käivitatakse Xen ja dom0 keskkond.

Kasulikud lisamaterjalid

Xen käivitamine UEFI keskkonnas grubx64.efi rakendusega

Osutub, et Xen saab UEFI keskkonnas käivitada ka nö läbi grubx64.efi rakenduse

UEFI -> GRUB.EFI -> XEN.EFI -> TUUM -> INITRAMDISK

Selleks sobib kasutada nt sellist grub seadistust

# cat /etc/grub.d/40_custom 
#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.

menuentry "Xen EFI" {
    insmod part_gpt
    insmod search_fs_uuid
    insmod chain
    insmod fat
    set root=(hd0,gpt1)
    chainloader /efi/xen/xen-4.8-amd64.efi
}

Selleks, et 'Xen EFI' oleks vaikevalik alglaaduril sobib

  • kasutada /etc/default/grub.d/xen.cfg failis rida
XEN_OVERRIDE_GRUB_DEFAULT=0
  • kasutada failis /etc/default/grub rida
GRUB_DEFAULT="Xen EFI"
  • öelda
# update-grub

Osutub, et Xen ei saa UEFI keskkonnas käivitada käivitada läbi grubx64.efi rakenduse hüperviisorit /boot/xen-4.8-amd64.gz.

Multiboot

Töötava UEFI multiboot süsteemi käivitamisel on muu hulgas kolm sellist UEFI Boot valikut, nad kõik jagavad ühte ja sama ESP failisüsteemi

  • debian
  • ubuntu_1404
  • ubuntu_1604

Sellisse UEFI multiboot süsteemi efi kataloogis asuvad grub efi rakendused paistavad nii

# ls -ld /boot/efi/EFI/*/*
-rwx------ 1 root root 143360 Apr  2  2015 /boot/efi/EFI/debian/grubx64.efi
-rwx------ 1 root root 143360 Mar 30  2015 /boot/efi/EFI/ubuntu_1404/grubx64.efi
-rwx------ 1 root root 143360 Apr  2  2015 /boot/efi/EFI/ubuntu_1604/grubx64.efi

kusjuures Debian ja Ubuntu operatsioonisüsteemid juurfailisüsteemid asuvad LVM peal (kus asub ka nö klassikaline /boot kataloog) on

  • /dev/system/debian
  • /dev/system/ubuntu_1404
  • /dev/system/ubuntu_1604

Järgmise multiboot keskkonna tekitamiseks tuleb nt

  • moodustada /dev/system/debian_test ja kopeerida sinna töötava debiani juurfailisüsteem
  • bootida käsitsi mingi olemasoleva grub abil uus keskkond (kopeerides vastavasse /boot kataloogi uue süsteemi initrd ja vmlinuz)
  • ühendada külge /dev/sda -> /boot/efi
  • keskkonna enda sees öelda, tulemusena genereeritakse /boot/efi/EFI/debian_test/grubx64.efi
# grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=debian_test --recheck
  • uuendada grub.cfg (tõenäoliselt kasutatakse siis uusi uuid väärtusi jms)
# update-grub

Tulemusena on UEFI Setup boot valikute nimekirjas järgmine sissekanne lisaks. Seda näeb ka efibootmgr väljundis.

Probleem: Ebaselge selle asja juures on, et kuidas iga /boot/efi all olev grub efi rakendus teab minna just edasi tegelema oma lvm köite pealt /boot/grub kataloogiga (lugeda sealt konfi). Tundub, et kui kõnealuse süsteemi alt öelda grub-install, siis nii juhtub.

20220317 - efi is not a directory anomaalia

Rutiinse kõvaketaste vahetuse tulemusena arvuti ei uefi-bootinud enam. EFI Shell peal on teade, et EFI ei ole kataloog. Abistas viidatud tekst ja eriti EFI sissekande eemaldamine, seejärel nö ilmus nähtavale õige kataloog-EFI.

Uefi-16.gif

Kasulikud lisamaterjalid

Kasulikud lisamaterjalid