Ormai sappiamo bene che il buon vecchio BIOS è stato "rimpiazzato", sui più moderni sistemi, dall'UEFI. Questo è molto più evoluto del precedente e consente un avvio più veloce (delegando l'inizializzazione delle periferiche direttamente al sistema operativo) e più sicuro (avviando solo i sistemi digitalmente firmati) ma... come funziona di preciso?

cosa è EFI Shell?

Anzitutto dobbiamo chiarire che il BIOS (formalmente il firmware della scheda madre) non è stato sostituito ma è inglobato in UEFI, solo che non appare più all'utente. Malgrado quello che alcuni potrebbero pensare, questo è un bene: i BIOS sono propri dei produttori di hardware mentre l'UEFI segue determinati standard che sono (è meglio dire... dovrebbero essere!) rispettati da tutti i produttori. UEFI infatti sta per Unified Extensible Firmware Interface ovvero interfaccia firmware estensibile unificata e, in una rappresentazione estremamente semplificata, lo potremo inserire proprio tra il firmware e il sistema operativo.

cosa è EFI Shell?

Il fatto che l'UEFI sia standardizzato, permette di interagire con esso anche senza "entrarci", (cosa impossibile prima con il solo BIOS), ad esempio, per aggiungere o modificare l'ordine di avvio di più sistemi operativi eventualmente installati. Attenzione: non sto parlando di bootloader (come GRUB, rEFInd, ... ) ma proprio dell'UEFI!

Per farlo possiamo utilizzare uno strumento dedicato: la EFI Shell, appunto.

Come si intuisce dal nome è un interprete di comandi (come Bash o Powershell), che deve essere utilizzata al di fuori del sistema operativo ed è quindi indipendente da questo e che serve proprio per interagire con le informazioni salvate in una RAM non volatile (NVRAM). Dato che l'UEFI è un sistema complesso, le operazioni che possiamo fare tramite questa shell sono varie e molteplici, ma in questo articolo ci limiteremo a vedere pochi e semplici comandi, un primo approccio a questo strumento che, come detto, ha ben altre potenzialità.

Prima di tutto, però, dove trovare la EFI Shell?

Molti produttori di schede madri, integrano la EFI Shell direttamente nell'UEFI ed è accessibile entrando in questo, solitamente nella tab relativa alle opzioni di Boot

cosa è EFI Shell?

Se presente, con Windows è raggiungibile anche tramite le opzioni di Avvio avanzato, scegliendo poi Utilizza un dispositivo.

cosa è EFI Shell?

Mentre non mi risulta che le distro Linux, integrino la possibilità di avviare la UEFI Shell direttamente nella schermata di avvio, ma possiamo sempre aggiungerla noi.

Se non presente, possiamo infatti installarla scaricando una versione già compilata da TianoCore, comunità che si occupa di creare una implementazione open source e rispettosa degli standard di UEFI e il cui lavoro è possibile apprezzare su molti sistemi di virtualizzazione (come, ad esempio, VirtualBox).

» Leggi: La virtualizzazione dei sistemi operativi non sarà più un problema: guida a VirtualBox

Per installarla dovremo salvarla nella partizione EFI del nostro sistema e aggiungerla al menu di boot, come vedremo in seguito, anche utilizzando direttamente questa shell!

Comunque la via più semplice per utilizzare, al bisogno, la EFI Shell è sicuramente tramite un sistema Live (per esempio, è presente nell'ISO di installazione di ArchLinux oppure può essere scaricata sempre da TianoCore e avviata tramite Ventoy).

» Leggi: Come preparare una chiavetta USB con molteplici ISO di boot: guida a Ventoy (video)

Appena avviata la UEFI Shell, questa mostrerà la "mappa" del sistema, indicando i filesystem esplorabili (identificati da FS0, FS1, FS2, ...) trovati nei dispositivi di archiviazione controllati (dischi e partizioni, identificati da BLK0, BLK1, BLK2, ... ). Questa schermata potrà sempre essere richiamata con il comando map, mentre per vedere la lista completa dei possibili comandi possiamo digitare help -b e per le istruzioni di ogni singolo comando possiamo digitare help -b nomecomando. L'opzione -b consente di interrompere l'output del comando, "impaginandolo" e potremo farlo avanzare, dopo averlo letto, premendo un tasto piuttosto che, come di normale, scorrere immediatamente fino alla fine.

ATTENZIONE: la disposizione dei tasti potrebbe seguire lo schema americano e non quello italiano a cui siamo abituati, per cui alcuni simboli potrebbero non trovarsi dove ve li aspettate! In questo caso, potete aiutarvi con questa immagine per trovare facilmente il giusto tasto da premere per il simbolo desiderato.

cosa è EFI Shell?

Se guardiamo l'immagine sopra con più attenzione, possiamo individuare alcune utili informazioni:

  • i filesystem esplorabili sono associati ai dispositivi di archiviazione dove sono stati trovati e che non sono presenti nell'elenco sotto (FS1 è BLK7, FS2 è BLK8, ... );
  • è possibile individuare i lettori CDROM (che sono identificati, in questo caso, dalla stringa Sata(0x1,0xFFFF,0x0)), i dischi (nel caso in oggetto, identificati rispettivamente dalle stringhe Sata(0x0,0xFFFF,0x0) e Sata(0x2,0xFFFF,0x0)) e le partizioni dei dischi, questi ultimi identificati dalla stessa stringa del disco (dove risiedono) e, in maniera controintuitiva, da HD seguito dal numero di partizione, dal tipo di tabella delle partizioni (GPT) e dall'UUID;
  • quando l'occhio è un po' allenato a districarsi tra queste stringhe, è facile notare che il disco BLK0 è composto da 4 partizioni (BLK1 esplorabile come FS0, BLK2, BLK3, BLK4) mentre il disco BLK9 è composto da 3 partizioni (BLK10 esplorabile come FS3, BLK11, BLK12).

Ma che cosa significa "filesystem esplorabile"? Significa che è un tipo di filesystem che la UEFI Shell sa interpretare e quindi può riuscire a leggere i file in esso contenuti. Generalmente, per impostazione predefinita, queste sono le partizioni che contengono i file di avvio dei sistemi operativi e sono formattare in FAT32 ma è anche possibile ispezionare altri filesystem (come ad esempio NTFS, ext4 o HFS+) caricando appositi driver nella EFI Shell con il comando load.

Ma controlliamo adesso il contenuto di FS0 e FS3 con i seguenti comandi; oltre all'opzione -b che abbiamo già visto, passiamo anche l'opzione -r che consente di mostrare il contenuto di tutte le cartelle

ls -r -b FS0:

ls -r -b FS3:

cosa è EFI Shell?

È facile capire che ci troviamo di fronte ad un sistema in dual boot Windows-Linux gestito da Grub2Win (l'installazione fa riferimento a quest'altro articolo).

» Leggi: Come installare Linux in dualboot direttamente da Windows (tramite WSL)

Controlliamo adesso meglio l'ordine di avvio con il comando bcfg boot dump -v

cosa è EFI Shell?

Possiamo vedere subito come la prima opzione (00) identificata dalla variabile Boot0001 sia il lettore CD/DVD, la seconda opzione (01, Boot0005) sia Grub2Win ed è possibile identificare anche la voce relativa alla UEFI Shell (04, Boot0004). Si vedono anche i due dischi (02, Boot0002 e 05, Boot0003) mentre le ultime 4 voci fanno riferimento alla capacità di avviare un sistema operativo tramite rete con protocollo HTTP o con lo standard PXE, entrambi con IPv4 o IPv6. L'opzione 03 riferita a BootOOOO, con descrizione UiApp è una voce proprio dell'UEFI di Tianocore.

È possibile avviare un sistema operativo installato, semplicemente digitando il percorso al file .efi.

I file con questa estensione sono binari compilati che contengono le istruzioni di avvio, solitamente sono i bootloader che poi si occupano di caricare il kernel del sistema operativo. Il kernel Linux può anche essere compilato per essere avviato direttamente dall'UEFI, senza necessità di bootloader, con l'opzione CONFIG_EFI_STUB

Ad esempio, per avviare Windows nel mio sistema di test, posso digitare semplicemente

FS0:\EFI\BOOT\bootx64.efi

cosa è EFI Shell?

Attenzione: ho svolto le seguenti prove in un sistema virtualizzato con UEFI e EFI Shell entrambe di Tianocore e Secure Boot disattivato; anche se i comandi dovrebbero essere corretti i risultati su un sistema fisico e con altre versioni di UEFI potrebbero essere diversi, non prendete quindi questa guida come un manuale da seguire passo-passo!

In caso volessi aggiungere una voce all'avvio, ad esempio GRUB dell'installazione di Linux, dovrei impartire il comando

bcfg boot add numero_opzione percorso_al_file_efi "Descrizione"

Inserendo un numero opzione in base alla posizione che vogliamo assegnare alla nuova voce, il percorso al file .efi riferito a GRUB e, opzionale, una descrizione racchiusa tra virgolette; un esempio pratico potrebbe essere il seguente (nota bene: avendo già 9 voci nel menù la successiva sarà una lettera, la A)

bcfg boot add A FS3:\EFI\GRUB\grubx64.efi "GRUB"

Potrebbe essere necessario aggiungere anche alcune opzioni per indicare a GRUB (o al kernel Linux) dove trovare la partizione di root e il ramdisk iniziale (initramfs). Per farlo possiamo creare un file contenente le citate istruzioni e poi passarlo alla voce di boot appena creata; per creare il file possiamo utilizzare il comando edit di cui potete vedere i principali comandi nell'immagine sotto:

edit FS3:\EFI\GRUB\option.txt

cosa è EFI Shell?

e inserire una stringa simile alla seguente (prestate attenzione ad aggiungere un spazio all'inizio!!!):

root=/dev/sdb3 rw initrd=/boot/initrd.img

Infine indichiamo di tenere conto di queste opzioni alla voce di boot creata con il comando:

bcfg boot -opt numero_opzione percorso_a_option.txt

Che nel secondo caso in esempio diventerebbe:

bcfg boot -opt A FS3:\EFI\GRUB\option.txt

cosa è EFI Shell?

Ricordate che se siamo su un sistema con Secure Boot attivo, dovremo indicare il percorso al file shimx64.efi al posto di grubx64.efi assicurandoci che siano contenuti nella stessa cartella!!

Uscendo dalla EFI shell (con l'ovvio comando exit) dovremo vedere la nuova voce appena aggiunta che potremo selezionare per avviare la nostra distro Linux

cosa è EFI Shell?

Tornando a EFI Shell, se volessi rimuovere una voce dalle opzioni di boot dovrei digitare il seguente comando, sostituendo opportunamente numero_opzione

bcfg boot rm numero_opzione