Ricerca nel sito web

LFCS: come configurare e risolvere i problemi del Grand Unified Bootloader (GRUB) - Parte 13


A causa dei recenti cambiamenti negli obiettivi dell'esame di certificazione LFCS in vigore dal 2 febbraio 2016, stiamo aggiungendo gli argomenti necessari alla serie LFCS pubblicata qui. Per prepararti a questo esame, ti consigliamo vivamente di seguire anche la serie LFCE.

In questo articolo ti presenteremo GRUB e spiegheremo perché è necessario un boot loader e come aggiunge versatilità al sistema.

Il processo di avvio di Linux dal momento in cui premi il pulsante di accensione del computer fino a quando non ottieni un sistema completamente funzionante segue questa sequenza di alto livello:

  1. 1. Un processo noto come POST (Power-On Self Test) esegue un controllo generale sui componenti hardware del tuo computer.
  2. 2. Una volta completato il POST, passa il controllo al boot loader, che a sua volta carica il kernel Linux in memoria (insieme a initramfs ) e lo esegue. Il boot loader più utilizzato in Linux è il GRand Unified Boot loader, o GRUB in breve.
  3. 3. Il kernel controlla e accede all'hardware, quindi esegue il processo iniziale (conosciuto principalmente con il nome generico "init") che a sua volta completa l'avvio del sistema avviando Servizi.

Nella Parte 7 di questa serie (“SysVinit, Upstart e Systemd”) abbiamo introdotto i sistemi e gli strumenti di gestione dei servizi utilizzati dalle moderne distribuzioni Linux. Potresti voler rivedere quell'articolo prima di procedere oltre.

Presentazione del caricatore di avvio GRUB

Due versioni principali di GRUB (v1 a volte chiamate GRUB Legacy e v2) possono essere trovate nei sistemi moderni, sebbene la maggior parte le distribuzioni utilizzano v2 per impostazione predefinita nelle loro ultime versioni. Solo Red Hat Enterprise Linux 6 e i suoi derivati utilizzano ancora v1 oggi.

Pertanto, in questa guida ci concentreremo principalmente sulle funzionalità della v2.

Indipendentemente dalla versione di GRUB, un boot loader consente all'utente di:

  1. 1). modificare il modo in cui si comporta il sistema specificando diversi kernel da utilizzare,
  2. 2). scegli tra sistemi operativi alternativi da avviare e
  3. 3). aggiungi o modifica stanze di configurazione per cambiare le opzioni di avvio, tra le altre cose.

Oggi, GRUB è mantenuto dal progetto GNU ed è ben documentato nel loro sito web. Ti invitiamo a utilizzare la documentazione ufficiale GNU durante la lettura di questa guida.

All'avvio del sistema ti viene presentata la seguente schermata GRUB nella console principale. Inizialmente, ti verrà chiesto di scegliere tra kernel alternativi (per impostazione predefinita, il sistema si avvierà utilizzando il kernel più recente) e potrai inserire una riga di comando GRUB (con c) o modificare le opzioni di avvio (premendo il tasto e).

Uno dei motivi per cui dovresti prendere in considerazione l'avvio con un kernel più vecchio è un dispositivo hardware che funzionava correttamente e ha iniziato a "agire " dopo un aggiornamento (fai riferimento a questo collegamento nella sezione AskUbuntu forum per un esempio).

La configurazione di GRUB v2 viene letta all'avvio da /boot/grub/grub.cfg o /boot/grub2/grub.cfg, mentre /boot/grub/grub.conf o /boot/grub/menu.lst sono utilizzati in v1. Questi file NON devono essere modificati manualmente, ma vengono modificati in base al contenuto di /etc/default/grub e ai file trovati all'interno di /etc/grub.d.

In CentOS 7, ecco il file di configurazione che viene creato alla prima installazione del sistema:

GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="vconsole.keymap=la-latin1 rd.lvm.lv=centos_centos7-2/swap crashkernel=auto  vconsole.font=latarcyrheb-sun16 rd.lvm.lv=centos_centos7-2/root rhgb quiet"
GRUB_DISABLE_RECOVERY="true"

Oltre alla documentazione online, puoi anche trovare il manuale GNU GRUB utilizzando le informazioni come segue:

info grub

Se sei interessato specificamente alle opzioni disponibili per /etc/default/grub, puoi richiamare direttamente la sezione di configurazione:

info -f grub -n 'Simple configuration'

Usando il comando sopra scoprirai che GRUB_TIMEOUT imposta il tempo che intercorre tra il momento in cui appare la schermata iniziale e l'avvio automatico del sistema a meno che non venga interrotto dall'utente. Quando questa variabile è impostata su -1, l'avvio non verrà avviato finché l'utente non effettua una selezione.

Quando più sistemi operativi o kernel sono installati nella stessa macchina, GRUB_DEFAULT richiede un valore intero che indichi quale sistema operativo o voce del kernel nella schermata iniziale di GRUB deve essere selezionato per l'avvio per impostazione predefinita. L'elenco delle voci può essere visualizzato non solo nella schermata iniziale mostrata sopra, ma anche utilizzando il seguente comando:

In CentOS e openSUSE:

awk -F\' '$1=="menuentry " {print $2}' /boot/grub2/grub.cfg

Nell'Ubuntu:

awk -F\' '$1=="menuentry " {print $2}' /boot/grub/grub.cfg

Nell'esempio mostrato nell'immagine seguente, se desideriamo avviare con la versione del kernel 3.10.0-123.el7.x86_64 (4a voce), dobbiamo impostare GRUB_DEFAULT a 3 (le voci sono numerate internamente iniziando con zero) come segue:

GRUB_DEFAULT=3

Un'ultima variabile di configurazione di GRUB di particolare interesse è GRUB_CMDLINE_LINUX, che viene utilizzata per passare le opzioni al kernel. Le opzioni che possono essere passate tramite GRUB al kernel sono ben documentate nel file Kernel Parametri e in man 7 bootparam.

Le opzioni attuali nel mio server CentOS 7 sono:

GRUB_CMDLINE_LINUX="vconsole.keymap=la-latin1 rd.lvm.lv=centos_centos7-2/swap crashkernel=auto  vconsole.font=latarcyrheb-sun16 rd.lvm.lv=centos_centos7-2/root rhgb quiet"

Perché vorresti modificare i parametri predefiniti del kernel o passare opzioni extra? In termini semplici, potrebbero esserci momenti in cui è necessario comunicare al kernel alcuni parametri hardware che potrebbe non essere in grado di determinare da solo o sovrascrivere i valori che rileverebbe.

Questo mi è successo non molto tempo fa quando ho provato Vector Linux, un derivato di Slackware, sul mio laptop vecchio di 10 anni. Dopo l'installazione non ha rilevato le impostazioni corrette per la mia scheda video quindi ho dovuto modificare le opzioni del kernel passate tramite GRUB per farlo funzionare.

Un altro esempio è quando è necessario portare il sistema in modalità utente singolo per eseguire attività di manutenzione. Puoi farlo aggiungendo la parola single a GRUB_CMDLINE_LINUX e riavviando:

GRUB_CMDLINE_LINUX="vconsole.keymap=la-latin1 rd.lvm.lv=centos_centos7-2/swap crashkernel=auto  vconsole.font=latarcyrheb-sun16 rd.lvm.lv=centos_centos7-2/root rhgb quiet single"

Dopo aver modificato /etc/defalt/grub, dovrai eseguire update-grub (Ubuntu) o grub2-mkconfig -o /boot/grub2/grub. cfg (CentOS e openSUSE) successivamente per aggiornare grub.cfg (altrimenti le modifiche andranno perse all'avvio).

Questo comando elaborerà i file di configurazione di avvio menzionati in precedenza per aggiornare grub.cfg. Questo metodo garantisce che le modifiche siano permanenti, mentre le opzioni passate tramite GRUB all'avvio dureranno solo durante la sessione corrente.

Risolvere i problemi di GRUB di Linux

Se installi un secondo sistema operativo o se il tuo file di configurazione GRUB viene danneggiato a causa di un errore umano, ci sono modi per rimettere in piedi il tuo sistema ed essere in grado di riavviarsi.

Nella schermata iniziale, premi c per ottenere una riga di comando di GRUB (ricorda che puoi anche premere e per modificare le opzioni di avvio predefinite) e usa l'aiuto per visualizzare le opzioni disponibili comandi nel prompt di GRUB:

Ci concentreremo su ls, che elencherà i dispositivi e i filesystem installati, ed esamineremo ciò che trova. Nell'immagine qui sotto possiamo vedere che ci sono 4 dischi rigidi (da hd0 a hd3).

Sembra che solo hd0 sia stato partizionato (come evidenziato da msdos1 e msdos2, dove 1 e 2 sono i numeri delle partizioni e msdos è lo schema di partizionamento).

Esaminiamo ora la prima partizione su hd0 (msdos1) per vedere se riusciamo a trovare GRUB lì. Questo approccio ci consentirà di avviare Linux e utilizzare altri strumenti di alto livello per riparare il file di configurazione o reinstallare GRUB del tutto se necessario:

ls (hd0,msdos1)/

Come possiamo vedere nell'area evidenziata, abbiamo trovato la directory grub2 in questa partizione:

Una volta che siamo sicuri che GRUB risieda in (hd0,msdos1), diciamo a GRUB dove trovare il suo file di configurazione e poi istruiamolo a tentare di avviare il suo menu:

set prefix=(hd0,msdos1)/grub2
set root=(hd0,msdos1)
insmod normal
normal

Quindi, nel menu di GRUB, scegli una voce e premi Invio per avviare utilizzandola. Una volta avviato il sistema puoi eseguire il comando grub2-install /dev/sdX (cambia sdX con il dispositivo su cui vuoi installare GRUB). Le informazioni di avvio verranno quindi aggiornate e tutti i file correlati verranno ripristinati.

grub2-install /dev/sdX

Altri scenari più complessi sono documentati, insieme alle soluzioni suggerite, nella guida alla risoluzione dei problemi di Ubuntu GRUB2. I concetti spiegati sono validi anche per altre distribuzioni.

Riepilogo

In questo articolo ti abbiamo presentato GRUB, indicato dove puoi trovare la documentazione sia online che offline e spiegato come affrontare uno scenario in cui un sistema ha smesso di avviarsi correttamente a causa di un problema relativo al bootloader.

Fortunatamente, GRUB è uno degli strumenti meglio documentati e puoi trovare facilmente aiuto nei documenti installati o online utilizzando le risorse che abbiamo condiviso in questo articolo.

hai domande o commenti? Non esitate a farcelo sapere utilizzando il modulo di commento qui sotto. Restiamo in attesa della vostra risposta!