UEFI e GPT

Da GolemWiki.

Introduzione a UEFI e GPT

UEFI è il nuovo standard che sostituirà il BIOS, ovvero quel programma di base che viene lanciato all'avvio del computer e ne consente la configurazione base e l'avvio dei sistemi operativi. UEFI ha destato attenzione nel mondo Linux per tre motivi:

  1. adotta nuovi metodi di avvio e di partizionamento, infatti non è più presente la scelta di avvio dal primo/secondo disco o dal CD, bensì è UEFI a rilevare i supporti avviabili. Anche i CD e le pennine di installazione devono quindi essere UEFI-compatibili, ma la maggior parte lo è (Ubuntu, Mint, Debian, ArchLinux...);
  2. il sistema di partizionamento MBR è stato soppiantato da GPT, quindi bisogna imparare a partizionare i dischi seguendo questo standard: la nuova tabella partizioni consente di creare più di 4 partizioni primarie (fino a 128, e non esiste più il concetto di partizione estesa). Inoltre è necessaria una partizione dedicata per l'avvio, detta ESP (EFI System Partition), che contiene i file di avvio dei sistemi installati. I comandi fdisk e cfdisk sono stati aggiornati e supportano anche GPT. Su distro vecchie (precedenti al 2016-2017) è necessario usare rispettivamente gdisk e cgdisk;
  3. Microsoft ha messo lo zampino nella tecnologia del secure boot: un controllo che consente di bloccare l'installazione di sistemi non autorizzati; l'opzione sulla maggior parte dei dispositivi venduti può essere disabilitata, e se non può esserlo, spesso si riesce comunque a installare Linux, anche se con qualche grattacapo in più;

In questa pagina si cerca di riassumere tutto quello che c'è da sapere su UEFI prendendo come obiettivo l'installazione della distribuzione ArchLinux.

Configurare UEFI

Il primo passo da compiere è entrare nel menù di UEFI, premendo il tasto giusto all'avvio (di solito DEL/CANC o F2, ma varia in base al modello). L'interfaccia grafica non è identica su tutti i computer: alcuni produttori usano quella simile al vecchio bios (bianca e blu/grigia), altri aggiungono a questa una versione più intuitiva e grafica dove è addirittura possibile usare il mouse, navigare un filesystem, catturare screenshot e navigare con un browser web.

Per installare sistemi diversi da Windows vanno disabilitati i parametri Fast Boot e Secure Boot, dopodiché è possibile inserire il CD di installazione, da cui fare il boot (a volte è necessario riavviare per far rilevare il disco a UEFI).

Partizionamento

Fatto il boot con il live CD, è possibile vedere tutti i dischi e le relative partizioni con il comando

fdisk -l

Eventualmente si può specificare un disco solo di cui si vogliono informazioni.

# fdisk -l /dev/sda
Found valid GPT with protective MBR; using GPT.
Disk /dev/sda: 976773168 sectors, 465.8 GiB
Logical sector size: 512 bytes
Disk identifier (GUID): XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
[...]

Individuato il disco, è possibile passare al partizionamento.

ATTENZIONE la procedura seguente eliminerà ogni dato già presente sul disco, ma in genere a nessuno importa...

Utilizzare il comando

cfdisk /dev/sda

È possibile eliminare tutte le partizioni, tenendo a mente le dimensioni della prima, contrassegnata dal codice EF00. Tale partizione va ricreata, per sicurezza della stessa dimensione e allineata allo stesso blocco, dopodiché è possibile creare le altre partizioni (root, home, windows-dedicata) seguendo la medesima procedura:

  1. Nello spazio libero (inizialmente tutto il disco) crea una nuova partizione (New);
  2. Richiesta del primo settore (First sector): premi invio per lasciare quello di default, ovvero a seguito della precedente partizione;
  3. Dimensione della partizione: questo è a scelta libera, il valore può essere inserito nelle unità comuni (Kilo, Mega, Giga), mentre dando invio usa il massimo spazio disponibile. Tieni sempre conto delle seguenti soglie minime
    • EFI - come detto prima, è bene ricrearla della dimensione originaria, nel mio caso era 300M
    • Root - senza la home, ovvero solo i file di sistema Linux, occupa al massimo una decina di Gb, quindi per lasciare un margine è bene assegnare 15G
    • /home - i dati utente hanno dimensione variabile, quindi è a propria discrezione
  4. Inserisci il tipo di partizione: EF00' per la EFI, 8300 per Linux, 8200 per la swap, 0700 per Windows;
  5. Etichetta: sempre utile per identificare a occhio una partizione, è a discrezione dell'utente (esempio LinuxHome per la home);
  6. Ripeti dal punto 1 per tutte le partizioni necessarie

Le partizioni possono essere formattate normalmente (mkfs.ext4 /dev/sdy), eccetto la partizione EFI, che va formattata in FAT con

mkfs.vfat -T32 /dev/sda1

Nel caso tu voglia installare anche Windows è preferibile installarlo dopo il partizionamento e prima di installare Linux.

Configurazione di GRUB

Installato il sistema, bisogna configurare il bootloader per funzionare con EFI. GRUB ha una versione compatibile, da installare mentre si è chrootati. Per prima cosa la partizione EFI (in questo caso /dev/sda1) deve essere montata in una qualsiasi cartella, in modo da consentirne la scrittura dei file di avvio. Successivamente si può installare GRUB e creare il file di configurazione relativo. In caso di dual-boot gli altri sistemi installati saranno rilevati automaticamente soltanto se la partizione EFI è montata.

# mkdir /boot/EFI
# mount /dev/sda1 /boot/EFI
# grub-install --target=x86_64-efi --efi-directory=$esp --bootloader-id=grub --recheck --debug
# grub-mkconfig -o /boot/grub/grub.cfg

Configurazione della BootList

Il comando grub-install inserisce automaticamente Linux all'interno dei menù di avvio di EFI. In caso di dual boot sta poi all'utente decidere se impostarlo come scelta di avvio automatica, cosa che va fatta manualmente dai menù di EFI, all'avvio.

Ci è stato riferito che a volte il metodo manuale da EFI può fallire: c'è anche il modo di modificare la lista degli avvii di EFI dall'interno di Linux.

$ efibootmgr
BootCurrent: 0000
Timeout: 0 seconds
BootOrder: 0000,0004
Boot0000* Windows Boot Manager
Boot0004* ArchLinux


L'output del comando efibootmgr è la lista dei sistemi installati (in questo caso ArchLinux e Windows), insieme alla lista di avvio (BootOrder), che in questo caso privilegia Windows.

Per modificarla basta aggiungere la relativa opzione, elencando gli ID dei sistemi operativi nell'ordine desiderato, separandoli da virgola

# efibootmgr --bootorder 0004,0000

In questo esempio si imposta Linux come primo sistema.

Problemi

Problema: avete rotto tutto, avete sovrascritto le variabili EFI, non funziona più nulla, vi rannicchiate in posizione fetale.

Soluzione: impostare il boot da CD e procurarsi un disco di rEFInd. rEFInd trova i sistemi che hanno un file di avvio nella ESP (EFI System Partition) e vi chiederà di sceglierne uno (vedi figura). rEFInd è utile anche per avviare altri utili strumentopoli che possono venire in nostro soccorso, come la EFI shell.

Procurarsi la EFI-Shell (almeno v2), da qualche parte, es github o AUR.

Attenzione: alcune schede madri ce l'hanno integrata, ma potrebbe non essere completa (es schede MSI), perciò scaricarla ugualmente.

Creare una directory ESP/efishell/ in cui mettere l'eseguibile della EFI Shell shellx64_v2.efi, e avviarlo tramite il disco di rEFInd (o con la EFI shell già integrata)

Prendere un po' di dimestichezza con l'EFI-Shell. È case-sensitive, ma fa cose "alla Windows", quindi occhio:

  • Vedere i device riconosciuti:
> map
  • fs0, fs1, ecc... indicano i filesystem delle ESP trovate; potete navigarci:
> fs0:
> ls
  • blk0, blk1, ecc... indicano le partizioni trovate ma non leggibili (NTFS, EXT)

Eliminare tutto ciò che non è necessario (file di avvio di Windows e cartelle). rm funziona sia con file che con directory:

> rm filename

Mostrare la lista della sequenza d'avvio. Ad ogni entry corrisponde un numero.

> bcfg boot dump

Prima di modificare qualunque cosa, cancellare tutto ciò che non è necessario (ma occhio a non cancellare cose preziose, tipo la EFI Shell integrata). Il numero indica l'entry desiderata. Occhio perché potrebbero riordinarsi automaticamente.

> bcfg boot rm 3

Aggiungere l'entry necessaria:

> bcfg boot add 1 fs0:/EFI/arch/grubx64.efi "Arch"

Attenzione a volte la scheda madre vuole avviare per forza Windows. Facciamoglielo credere mettendo il grubx64.efi nella ESP sotto EFI/Microsoft/Boot/bootmgfw.efi (attenzione alle maiuscole, anche se è FAT).