ArchLinux: Guida a Unified Extensible Firmware Interface (Italiano), 2a parte

Creato il 14 marzo 2014 da Linuxlandia

Supporto per le variabili UEFI.

UEFI definisce delle variabili tramite cui il sistema operativo può interagire con il firmware. Le variabili di boot UEFI sono utilizzate dal boot-loader e dal sistema operativo durante la prima fase di avvio. Le variabili di runtime UEFI permettono al sistema operativo di gestire certe impostazioni del firmware come il Boot Manager UEFI o gestire le chiavi per il Secure Boot Protocol eccetera.


Nota: I seguenti passaggio non funzioneranno se il sistema è stato avviato in modalità BIOS, e non funzioneranno nemmeno se l'architettura del firmware UEFI e quella del Kernel Linux non coincidono, ad esempio firmware UEFI x86_64 + kernel x86 32-bit o viceversa. Questo è vero per il modulo del kernel efivar e per efibootmgr. Gli altri passaggi (ad esempio configurare <UEFISYS>/EFI/arch/refind/{refindx64.efi,refind.conf} ) possono essere effettuati anche se si è avviato in modalità BIOS/Legacy.

L'accesso ai servizi di runtime UEFI è fornito dal modulo del kernel "efivars" che è abilitato dalla configurazione del kernel CONFIG_EFI_VAR=m. Questo modulo una volta caricato garantirà l'accesso alle variabili popolando la cartella /sys/firmware/efi/vars. Un modo per controllare che il sistema sia avviato in modalità UEFI consiste nel caricare in memoria il modulo "efivars" e controllare l'esistenza ed il contenuto della cartella /sys/firmware/efi/vars il cui contenuto sarà simile a questo:

Output di esempio (x86_64-UEFI 2.3.1 con kernel x86_64):

# ls -1 /sys/firmware/efi/vars/
Boot0000-8be4df61-93ca-11d2-aa0d-00e098032b8c/
BootCurrent-8be4df61-93ca-11d2-aa0d-00e098032b8c/
BootOptionSupport-8be4df61-93ca-11d2-aa0d-00e098032b8c/
BootOrder-8be4df61-93ca-11d2-aa0d-00e098032b8c/
ConIn-8be4df61-93ca-11d2-aa0d-00e098032b8c/
ConInDev-8be4df61-93ca-11d2-aa0d-00e098032b8c/
ConOut-8be4df61-93ca-11d2-aa0d-00e098032b8c/
ConOutDev-8be4df61-93ca-11d2-aa0d-00e098032b8c/
ErrOutDev-8be4df61-93ca-11d2-aa0d-00e098032b8c/
Lang-8be4df61-93ca-11d2-aa0d-00e098032b8c/
LangCodes-8be4df61-93ca-11d2-aa0d-00e098032b8c/
MTC-eb704011-1402-11d3-8e77-00a0c969723b/
MemoryTypeInformation-4c19049f-4137-4dd3-9c10-8b97a83ffdfa/
PlatformLang-8be4df61-93ca-11d2-aa0d-00e098032b8c/
PlatformLangCodes-8be4df61-93ca-11d2-aa0d-00e098032b8c/
RTC-378d7b65-8da9-4773-b6e4-a47826a833e1/
del_var
new_var

Le variabili di runtime UEFI non saranno reperibili se è stato utilizzato il parametro "noefi" nella linea del kernel dal menù del bootloader. Questo parametro comunica al kernel di ignorare i servizi di runtime UEFI.


Strumenti in ambiente Userspace.

Esistono alcuni strumenti che possono accedere/modificare le variabili UEFI, e sono:

   efibootmgr - Utilizzato per creare/modificare le voci di avvio del Boot Manager UEFI - efibootmgr oppure efibootmgr-git
   uefivars - semplicemente accede alle variabili - uefivars-git - utilizza la libreria efibootmgr
   Ubuntu's Firmware Test Suite - fwts - fwts-git - il comando uefidump - fwts uefidump

Sistemi UEFI Non-Mac
efibootmgr


Attenzione: Utilizzando efibootmgr su di un Mac Apple verrà danneggiato (briked) il firmware e potrebbe essere necessario flashare nuovamente la ROM della scheda madre. Esistono segnalazioni di bug riguardante l'argomento sul bug tracker di Ubuntu/Lanunchpad. Utilizzare solamente il comando bless in caso si abbia un Mac. Lo strumento sperimentale "bless" per Linux è sviluppato dagli sviluppatori di Fedora - mactel-boot.


Nota: Il comando efibootmgr funzionerà soltanto se si è avviato il sistema in modalità UEFI, dato che richiede l'accesso alle variabili di runtime UEFI che sono accessibili solo se si avvia in modalità UEFI (senza l'uso del parametro del kernel "noefi"). Altrimenti verrà visualizzato l'errore Fatal: Couldn't open either sysfs or procfs directories for accessing EFI variables.


Nota: Se risulta impossibile utilizzare efibootmgr, alcuni firmware UEFI permettono agli utenti di gestire direttamente le opzioni di boot uefi dalla configurazione. Ad esempio alcuni firmware ASUS hanno l'opzione "Add New Boot Option" che permette di selezionare una partizione EFI di sistema locale, e di impostare manualmente l'applicazione EFI. (ad esempio '\EFI\refind\refind_x64.efi')

Inizialmente potrebbe dover avviare il boot-loader dal firmware stesso (utilizzando la UEFI Shell) se il boot-loader è stato installato quando il sistema era avviato in modalità BIOS. Successivamente efibootmgr dovrebbe essere eseguito per rendere il boot-loader UEFI la voce di avvio di default nel Boot Manager UEFI.

Per utilizzare efibootmgr, prima sarà necessario caricare il modulo del kernel 'efivars':

# modprobe efivars

Se con questo comando si ottiene l'errore no such device found, allora significa che il sistema non è stato avviato in modalità UEFI o che per qualche motivo il kernel non riesce ad accedere alle variabili di runtime UEFI(noefi?).

Verificare l'esistenza dei file nella cartella /sys/firmware/efi/vars/. Questa cartella ed il suo contenuto sono creati dal modulo del kernel "efivars" ed esisteranno soltanto se si è avviato in modalità UEFI, senza il parametro del kernel "noefi".

Se la cartella /sys/firmware/efi/vars/ è vuota o non esiste, allora il comando efibootmgr non funzionerà. Se non si riesce ad avviare la ISO/CD/DVD/USB in modalità UEFI consultare Creare un dispositivo USB avviabile con UEFI dalla ISO .


Nota: I seguenti comandi utilizzano il boot-loader gummiboot come esempio.

Ipotizzando che il file del boot-loader da avviare sia /boot/efi/EFI/gummiboot/gummibootx64.efi. Il percorso /boot/efi/EFI/gummiboot/gummibootx64.efi può essere diviso in due parti /boot/efi and /EFI/gummiboot/gummibootx64.efi, dove /boot/efi è il punto di mount della partizione di sistema UEFI, che si presume essere /dev/sdXY (nell'esempio X e Y sono soltanto simbolici per i reali valori - ad esempio: /dev/sda1. X=a Y=1).

Per determinare l'attuale percorso per la partizione di sistema UEFI(dovrebbe essre nella forma /dev/sdXY), provare il comando:

# findmnt /boot/efi
TARGET SOURCE  FSTYPE OPTIONS
/boot/efi /dev/sdXY vfat   rw,flush,tz=UTC

Per creare la voce di avvio utilizzando efibootmgr usare il seguente comando:

# efibootmgr -c -g -d /dev/sdX -p Y -w -L "Gummiboot" -l '\EFI\gummiboot\gummibootx64.efi'

Nel comando precedente /boot/efi/EFI/gummiboot/gummibootx64.efi viene interpretato come /boot/efi e /EFI/gummiboot/gummibootx64.efi che a sua volta si interpreta come disco /dev/sdX -> partizione Y -> file /EFI/gummiboot/gummibootx64.efi.

UEFI utilizza il backslash (\) come separatore per i percorsi (come nei percorsi Windows).

L'etichetta è il nome della voce del menù visualizzata nel menù di avvio UEFI. Questo nome è scelta dell'utente e non influisce sull'avvio del sistema. Maggiori informazioni posso esse ottenute da efibootmgr GIT README .

Il filesystem FAT32 non è case-sensitive(non fa distinzione tra maiuscole e minuscole) dato che non utilizza la codifica UTF-8 come default. In questo caso il firmware utilizza lettere maiuscole 'EFI' invece di 'efi', pertanto utilizzare {{ic|\EFI\gummiboot\gummibootx64.efi} o {{ic|\efi\gummiboot\gummibootx64.efi} non fa differenza (cambierebbe invece se la codifica del filesystem fosse UTF-8).


Creare una partizione di sistema UEFI con Linux.
Nota: La partizione UEFISYS puà essere creata di qualsiasi dimensione supportata dal filesystem FAT32. In accordo con la documentazione di Microsoft, la dimensione minima per il filesystem FAT32 è di 512 MiB. Pertanto è consigliato che la partizione UEFISYS sia grande almeno 512 MiB. Partizioni più grandi vanno bene, specialmente se si utilizzano svariati bootloader, oppure se diversi sistemi operativi sono avviati tramite UEFI, quindi ci sarà abbastanza spazio per contenere tutti i file correlati. Se si utilizza l'avvio EFISTUB, allora assicurarsi che ci sia abbastanza spazio per il kernel e l'initramfs nella partizione UEFISYS.


Per dischi partizionati GPT.

Due scelte:

   Usando GNU Parted/GParted: Creare una partizione FAT32. Contrassegnala come "avviabile".
   Usando GPT fdisk (chiamato anche gdisk): Creare una partizione con gdisk con codice di tipo partizione "EF00". Successivamente formattare la partizione come FAT32 usando mkfs.vfat -F32 /dev/<PARTIZIONE>

Nota: Contrassegnando come "avviabile" una partizione in un disco partizionato MBR essa viene marcata come attiva, mentre in una partizione GPT marca la partizione come "UEFI System Partition".
Attenzione: Non utilizzare i comandi di util-linux fdisk, cfdisk o sfdisk per cambiare i tipi partizione in un disco GPT. Ugualmente non usare gptfdisk gdisk, cgdisk o sgdisk su un disco MBR, il disco verrebbe automaticamente convertito in un disco GPT (nessuna perdita di dati, ma il sistema non si avvierebbe).
Per dischi partizionati MBR

Due scelte:

   Usando GNU Parted/GParted: Creare una partizione FAT32. Cambiare il tipo partizione della partizione in 0xEF usando fdisk, cfdisk or sfdisk.
   Usando fdisk: Creare una partizione con il tipo partizione 0xEF e formattarla in FAT32 usando mkfs.vfat -F32 /dev/<PARTIZIONE>

Nota: E' raccomandato usare sempre partizioni GPT per il boot UEFI poiché alcuni firmware UEFI non accettano il boot UEFI-MBR.


UEFI Shell.

La UEFI Shell è una shell/terminale per il firmware essa avvia le applicazioni uefi che includono i boot-loader uefi. Oltre a questo la shell può anche essere utilizzata per ottenere altre informazioni riguardo al sistema o il firmware come la mappatura della memoria (memmap), modificare le variabili del boot manager (bcfg), eseguire programmi di partizionamento (diskpart), caricare driver uefi, modificare file di testo (edit), hexedit eccetera.


Collegamenti per il download di UEFI Shell

E' possibile scaricare una UEFI Shell con licenza BSD rilasciata dal progetto di Intel Tianocore UDK/EDK2 Sourceforge.net.

   x86_64 UEFI Shell 2.0 (Beta)
   x86_64 UEFI Shell 1.0 (Old)
   i386 UEFI Shell 2.0 (Beta)
   i386 UEFI Shell 1.0 (Old)

La versione 2.0 della Shell funziona solamente con le versioni di firmware UEFI maggiore di 2.3, ed è consigliato al posto della Shell 1.0 in questo tipo di sistemi. La Shell 1.0 dovrebbe funzionare su tutti i sistemi UEFI senza particolare riguardo alla versione del firmware. Maggiori informazioni in ShellPkg ed in questa mail

Se ti è piaciuto l'articolo , iscriviti al feed cliccando sull'immagine sottostante per tenerti sempre aggiornato sui nuovi contenuti del blog:


Potrebbero interessarti anche :

Possono interessarti anche questi articoli :