Perché la maggior parte delle distribuzioni concatena UEFI e grub?


31

La maggior parte delle distribuzioni installa un caricatore di avvio aggiuntivo su un sistema UEFI. Lo stesso UEFI è un caricatore di avvio, offre un menu per selezionare diversi sistemi operativi o singoli kernel. Inoltre, le impostazioni UEFI possono essere facilmente modificate con strumenti come userspace efibootmgr.

I kernel dalla 3.3 supportano EFI_STUB, il che significa che il kernel può essere caricato direttamente dall'UEFI. Qual è il motivo per cui le distribuzioni decidono di utilizzare un boot loader aggiuntivo? La maggior parte dei tutorial su Linux / UEFI si concentra principalmente su come impostare il boot loader aggiuntivo (rEFInd, grub2, ELILO, ecc.) Invece di avviare Linux con EFI_STUB.

L'unica cosa che manca nelle distribuzioni è il supporto. Poiché la maggior parte delle distribuzioni concatenano un secondo caricatore di avvio, il kernel non viene aggiunto al menu di avvio UEFI, né viene copiato nella partizione di sistema EFI.

Tre script sono sufficienti per fare tutta la magia. Uno che copia gli initramfs su ESP. Un secondo copia il kernel su ESP e crea una nuova voce nel menu di avvio UEFI. Il terzo script rimuove il vecchio kernel e initramfs dall'ESP ed elimina la voce del menu di avvio UEFI. Ciò consente aggiornamenti / eliminazioni completamente automatici del kernel / initramfs senza l'interazione dell'utente. Sto usando questo approccio da più di un anno e ha funzionato perfettamente.

Perché la maggior parte delle distribuzioni utilizza grub invece di EFI_STUB?

link:

EDIT: Non sto parlando di rimuovere completamente il supporto grub, ma di offrire una scelta a coloro che vogliono usarlo per vari motivi. Le distribuzioni potrebbero fornire un pacchetto grub-efiper coloro che vogliono concatenare UEFI e grub e un pacchetto efistub-bootche contiene gli script che ho menzionato sopra.


4
Perché dovrebbero? Hanno già stabilito metodi per gestire / generare il file di configurazione di grub. Inoltre aiuta se tutti i sistemi (non UEFI e UEFI) si comportano allo stesso modo.
Ulrich Dangel,

Sembra fantastico. Ma poiché secondo quel link puoi farlo se vuoi, forse è un potenziale pantano per le distro farlo automaticamente per te. Scommetto che alcuni alla fine ti daranno l'opzione.
Riccioli d'oro,

1
@Bakuriu Un sistema più semplice da comprendere, una sequenza di avvio più semplice, un codice meno eseguito e tempi di avvio leggermente più veloci, ad esempio.
Marco,

4
Questa domanda dovrebbe essere sospesa, poiché il motivo della sospensione indicato è errato. La domanda ha una risposta semplice e incontestabile: UEFI non fornisce un menu di avvio. Alcune implementazioni lo fanno. Alcuni no, perché per raggiungere il tempo di avvio previsto per Windows 8, il BIOS non inizializza nemmeno i dispositivi di input . Per non parlare dell'attesa per vedere se l'utente preme un tasto. Quindi dovresti passare da Windows per arrivare a Linux, o viceversa. Il primo funziona su alcuni sistemi, ma dubito che le specifiche lo garantiscano. Quest'ultimo non funziona (puoi accedere al setup UEFI da GRUB, ma non da Linux).
sourcejedi,

1
@sourcejedi Il tuo reclamo non corrisponde alle tue fonti. UEFI fornisce un menu di avvio (UI incoerente tra i fornitori). mjg59 significava che non è possibile accedere al menu di avvio senza compromessi filosofici (accettando l'EULA W8). Ma questo problema sarà lo stesso per gli installatori con bootloader grub non EFISTUB. Quindi non risponde perché preferiremmo grub piuttosto che EFISTUB.
Lingzhu Xiang,

Risposte:


10

Dato che l'UEFI è stata definita solo nel 2005, esiste un mucchio di apparecchiature legacy che non supportano le specifiche. L'aggiunta di UEFI a una distribuzione standard richiederebbe il test di due percorsi di codice anziché uno, e non solo il codice di avvio è notoriamente complicato, ma è uno dei bit di codice più fastidiosamente lunghi da testare.


5
Non solo è fastidiosamente dispendioso in termini di test, ma è anche il codice più irritante che può andare storto. Considera: quale preferisci, una sorta di problema mentre il sistema è attivo e funzionante per lo più normalmente o non è nemmeno in grado di avviare il sistema? Il boot loader è sicuramente uno dei software che sento fortemente di non toccare a meno che non sia necessario.
un CVn

Il commento sopra di @ MichaelKjörling dovrebbe essere in una risposta. Il passaggio a un nuovo boot loader è molto rischioso. I creatori di Distro vogliono che i loro utenti abbiano una buona esperienza, ma soprattutto vogliono che un singolo potenziale nuovo utente abbia un'esperienza impeccabile per la prima volta. Mi dispiace di aver definito la distribuzione una "distro", ma mi è sembrato OK in collaborazione con i creatori.
Johan

@Johan msw è libero di modificare quel punto nella risposta, non mi dispiace. (Non è abbastanza per essere una risposta da sola, IMO.) Sia Tobu che i riccioli d'oro toccano anche il problema.
un CVn del

3

Le distribuzioni hanno risorse limitate e potrebbero non esserci ragioni al di là di ciò. Può essere ragionevolmente semplice e sicuro, ma a prescindere da ciò che richiederà più interventi di manutenzione perché l'opzione grub deve essere mantenuta, anche se solo per sistemi non UEFI.

Sono sicuro che tutti hanno un elenco di funzionalità e opzioni che vorrebbero vedere adottare le distro (ti darò alcune pagine, lol), e senza dubbio molte di queste sarebbero "totalmente facili, senza problemi, onestamente. .. ". Tuttavia, non vi è una quantità infinita di ore di persona per implementarle. Di fronte a decisioni come questa ("Inseriamo il lavoro in questa funzione, rispetto ad altre?") Le domande principali dovrebbero essere:

  • È necessario? (La risposta qui è no).
  • Quante persone ne trarranno beneficio e quanto? (IMO: pochi e non molto)
  • Esiste un'alternativa ragionevole in base alla quale l'utente può adattarsi senza che noi facciamo nulla? (Apparentemente c'è.)

Il motivo per cui le persone usano le distro è perché tutti sono soggetti a vincoli di risorse (altrimenti, basta assumere una squadra, acquistare un po 'di spazio e attrezzature e far fare tutto per te esattamente come vuoi). Quindi la realtà è che le distro riflettono le esigenze generalizzate dei loro utenti.

Detto questo, penso che questo verrà adottato nel tempo come opzione e ho votato a favore della domanda.


2

Il targeting dei bootloader UEFI oltre a grub complicherebbe il controllo e il supporto della qualità. Le distro si rivolgono a grub piuttosto che alle specifiche UEFI perché grub è software libero, hackerabile, più flessibile e di alta qualità. Puoi comunque ottenere un avvio puro-UEFI seguendo un tutorial e montando la partizione UEFI /boot, perché se lo fai, la manutenzione è su di te.


la tua affermazione sulla qualità è discutibile, ma penso che la ragione per cui è stata presa di mira non ha nulla a che fare con essa. hanno già migliaia di righe di script shell scritti male per gestirlo, quindi perché ne vogliono 20 buoni?
Mikeserv,

1

Il vero problema è che le persone non capiscono come funziona. Ad esempio, nella tua domanda menzioni che tre script sono tutto ciò che è necessario e che la maggior parte delle risposte qui riguarda tutto / qualsiasi manutenzione aggiuntiva che sarebbe necessaria per farlo funzionare - ma la verità è che non hai bisogno di quegli script o qualsiasi lavoro aggiuntivo.

Tutto ciò di cui hai bisogno è di associare mount ESP - o ovunque tu voglia mantenere il kernel - finito /boot, cosa che puoi fare con una sola riga in/etc/fstab . Fallo e tutti gli attuali script di aggiornamento del kernel continueranno semplicemente a funzionare.

Il mio `/ etc / fstab 'assomiglia a:

LABEL=ESP /esp vfat defaults 0 2
#
#^ i like a separate mount point - not necessary though
#
/esp/EFI/arch_root /boot none bind,defaults 0 2
#
#^ i keep separate installations in separate directories
#

C'è un buon punto qui, tuttavia, sulle impostazioni specifiche del produttore. UEFI esplicitamente non senza specificare l'interfaccia per un menu di avvio. Questo è in palio e non sarà coerente tra le macchine. È fastidioso, ma vero.

E così, mentre un caricatore come in grubrealtà rende solo più lavoro, un'applicazione di menu - come rEFInd - uniforma le differenze e semplifica tutto.


1
Non capisco come possa funzionare. Si noti che i nomi dei file del kernel e di initramfs includono la versione. Se non ci sono script, avvierai il tuo vecchio kernel dopo averne installato uno nuovo. O espresso in modo diverso: come si modifica il kernel predefinito in modo che punti a quello nuovo? (I miei script usano efobootmgrper aggiornare l'ordine di avvio e cambiare il kernel predefinito).
Marco,

@Marco - beh, il percorso di avvio predefinito è \EFI\BOOT\BOOTX64.efie quindi potrebbe essere chiamato per questo. l'UEFI non può (in base alle specifiche) gestire gli argomenti per il kernel in primo luogo - e quindi l'immagine initramfs / kernel deve essere legata insieme in quel caso. ma non so cosa intendi per la denominazione della versione - penso che solo i debian lo facciano e lo considero comunque improduttivo. il nome convenzionale per il tuo kernel è vmlinuz. Ad ogni modo, il modo giusto per farlo è con un boot manager e non un caricatore . Utilizzare un'app EFI che trova il kernel e passa il suo nome a EFI per l'avvio, come fa rEFInd.
Mikeserv,

Uso Debian e il nome del kernel è ad esempio quello vmlinuz-4.2.0-1-amd64che lascio così com'è e quindi lo uso efibootmgrper aggiungerlo all'elenco di avvio e renderlo predefinito. Vedo che la denominazione del kernel BOOTX64.efipotrebbe essere una soluzione. Ma in ogni caso avrei bisogno di avere uno script per farlo e inoltre ciò non consente facilmente di mantenere più kernel se tutti hanno lo stesso nome.
Marco,

@Marco - non è necessario uno script completamente separato - il gestore dei pacchetti - apt, probabilmente - eseguirà comunque alcuni script quando viene installato un kernel per compilare initramfs. probabilmente sta facendo un centinaio di cose lì per capire già il nome del tuo kernel, ma solo una singola riga in più farà la ridenominazione come desideri. e puoi facilmente mantenere tutti i kernel che vuoi se mantieni un albero di avvio . rEFInd lo gestisce rendendo l'immagine di avvio predefinita l'immagine del kernel modificata più di recente nei suoi percorsi di ricerca.
Mikeserv,

Modificare gli stock script installati dal gestore pacchetti è una cattiva idea. Potrebbero essere aggiornati, il che a sua volta cancella le modifiche e, in questo caso particolare, potrebbe persino provocare un sistema non avviabile. Esistono directory per gli script utente che vengono invocate dopo un'installazione kernel / initramfs e che devono essere utilizzate esattamente per uno scopo come questo. A proposito: stai suggerendo di modificare gli script nei tuoi commenti. Tuttavia, nella tua risposta dichiari "non hai bisogno di quegli script o di qualsiasi lavoro aggiuntivo", il che non è vero (almeno per Debian).
Marco,

0

Incatenano UEFI e GRUB come soluzione di implementazione temporanea.

Man mano che il supporto UEFI e i problemi associati (ad es. Secure Boot) vengono risolti, sempre più distribuzioni lo useranno direttamente. Nel frattempo è ancora molto nuovo: Google Trends mostra un'adozione piuttosto limitata: http://www.google.com/trends/explore?q=cannot+boot+uefi#q=uefi%2C%20%20efi%2C % 20% 20bios & CMPT = q

Altri hanno citato tutte le potenziali insidie ​​di scegliere una soluzione UEFI pura e / o supportare contemporaneamente sistemi non UEFI e sistemi UEFI puri. Un kernel UEFI potrebbe funzionare su un sistema non UEFY, ma gli strumenti di aggiornamento del kernel devono aggiornare un menu GRUB O un menu di avvio UEFI OPPURE entrambi, ecc. Ecc.

Si tratta in realtà del controllo di qualità come menzionato: soprattutto i problemi con questo codice hanno un forte impatto: quando il computer non riesce ad avviare nuovi utenti, ad esempio potenziali convertitori di Linux, lo abbandonerà come spazzatura e tornerà a qualcosa di "sicuro".

Ma come ho detto quando la tecnologia ottiene più adozione diventerà lo standard.


Spero di no, ma principalmente perché ho serie preoccupazioni sulle modalità di blocco UEFI e sulla "promessa" di Microsoft di assicurarsi che ci sarà sempre un'immagine firmata da usare per Linux ...
Shadur,

0

È necessario un codice aggiuntivo per aggirare i bug del firmware

Quando non si esegue il concatenamento di grub, la distribuzione si affida maggiormente al firmware per l'avvio corretto. Poiché qualsiasi software avrà problemi, anche il firmware è incline a questo. Ora le distribuzioni Linux dovranno scrivere per aggirare anche questi bug del firmware.

Un caso di vita reale come esempio. La scheda madre Asrock H81 pro BTC P1.80 consente la creazione di voci del menu di avvio con efibootmgr. Possono essere create più voci del menu di avvio e l'ordine di avvio può essere modificato utilizzando efibootmgr --bootorder XXXX,YYYY,ZZZZoppure è possibile impostare un'opzione di avvio successiva temporanea utilizzando efibootmgr --bootnext XXXX. Entrambi questi comandi restituiscono un output che ti dà l'idea che l'ordine di avvio è cambiato o che il prossimo avvio verrà eseguito, ad esempio BootNext: XXXX. Tuttavia al riavvio il firmware testardo ignora solo l'opzione di avvio appena richiesta e si riavvia nel BootCurrent:valore precedente . Una modifica permanente dell'ordine di avvio può essere effettuata solo dall'utility di configurazione del firmware. E un cambiamento non permanente non è affatto disponibile.


-2

Penso che se l'avvio viene eseguito solo da EFI e rimuoviamo il bootloader, sarà difficile sia per i produttori di sistemi hardware che per i produttori di sistemi operativi. Il fornitore di HW avrà più kernel da testare mentre per le aziende che producono SO, sarà come se il loro kernel fosse caricato da FW diversi.

Inoltre, con l'avvio diretto del kernel da EFI, dove si adatterà l'avvio sicuro nello stack? Nello scenario attuale, una volta che il controllo passa al bootloader del sistema operativo, quindi il bootloader verifica se il kernel è firmato correttamente o meno. Nel caso in cui cariciamo il kernel direttamente da EFI, penso che creerà confusione solo quando l'intero stack verrà disturbato. Solo un'opinione da quale comprensione ho.


è sciocco. il motivo per cui il bootloader verifica la chiave è perché UEFI non lo fa. il caricamento a catena è ridondante per garantire l'avvio sicuro di un kernel firmato, basta controllare la chiave nel firmware, nel modo in cui dovrebbe funzionare.
Mikeserv,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.