LFCS: Come Configurare e Risolvere i Problemi del Grand Unified Bootloader (GRUB) – Parte 13

A causa delle recenti modifiche agli obiettivi del certificato LFCS entrati in vigore da il 2 febbraio 2016, stiamo aggiungendo i topic necessari alla serie LFCS pubblicata qui. Per prepararsi a questo esame, viene fortemente incoraggiato a seguire anche la serie LFCE.

LFCS: Configure and Troubleshoot Grub Boot Loader – Part 13

In questo articolo viene introdotta la GRUB e viene spiegato perché un boot loader sia necessario, nonché come aggiunge versatilità al sistema.

Il processo di avvio di Linux dall’accensione del computer fino ad ottenere un sistema funzionale segue questa sequenza di alto livello:

  1. 1. Un processo noto come POST (Power-On Self Test) esegue un’ispezione generale dei componenti hardware del computer.
  2. 2. Quando il POST è completato, passa il controllo all’loader di avvio, che a sua volta carica il nucleo di Linux in memoria (insieme a initramfs) e lo esegue. Il boot loader di Linux più utilizzato è il GRand Unified Boot loader, o GRUB per breve.
  3. 3. Il kernel controlla e accede al hardware, quindi esegue il processo iniziale (maggiormente conosciuto con il suo nome generico “init“) che a sua volta completa l’avvio del sistema avviando i servizi.

In Parte 7 di questa serie (“SysVinit, Upstart, e Systemd“) abbiamo introdotto i sistemi e gli strumenti di gestione dei servizi usati dalle moderne distribuzioni Linux. Puoi voler rivedere quell’articolo prima di proseguire.

Introduzione al Loader di Avvio GRUB

Due versioni principali di GRUB (v1 chiamata a volte GRUB Legacy e v2) si trovano nei sistemi moderni, sebbene la maggior parte delle distribuzioni utilizzi v2 come predefinito nelle loro ultime versioni. Solo Red Hat Enterprise Linux 6 e le sue derive usano ancora v1 oggi.

Quindi, ci concentriamo principalmente sulle caratteristiche di v2 in questo guide.

Indipendentemente dalla versione di GRUB, un loader di avvio permette all’utente di:

  1. 1). modificare il comportamento del sistema specificando diversi kernel da usare,
  2. 2). scegliere tra differenti sistemi operativi alternativi da avviare, e
  3. 3). aggiungere o modificare le sezioni di configurazione per cambiare le opzioni di avvio, tra le altre cose.

Oggi, GRUB è mantenuto dal progetto GNU ed è ben documentato sul loro sito web. È incoraggiato l’uso della documentazione ufficiale GNU mentre si sta seguendo questo guide.

Quando il sistema si avvia, viene presentato lo schermo GRUB seguente nella console principale. Inizialmente, viene richiesto di scegliere tra kernels alternativi (per default, il sistema si avvierà usando il kernel più recente) e viene consentito di inserire una riga di comando GRUB (con c) o modificare le opzioni di avvio (premendo la tasto e).

GRUB Boot Screen

Un motivo per cui potreste considerare l’avvio con un kernel più vecchio è un dispositivo hardware che prima funzionava correttamente e ha cominciato a “fare i conti” dopo un aggiornamento (si rivolgete al link sui forums di AskUbuntu 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 usati in v1. Questi file non devono essere modificati a mano, ma sono modificati in base ai contenuti di /etc/default/grub e ai file trovati all’interno di /etc/grub.d.

In un CentOS 7, questo è il file di configurazione creato quando il sistema è installato per la prima volta:

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, è possibile trovare il manuale GNU GRUB utilizzando il comando info come segue:

# info grub

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

# info -f grub -n 'Simple configuration'

Utilizzando il comando sopra riportato, scoprirai che GRUB_TIMEOUT imposta il tempo tra il momento in cui compare 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 viene avviato fino a quando l’utente non effettua una selezione.

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

In CentOS e openSUSE:

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

In Ubuntu:

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

Nell’esempio mostrato nell’immagine sottostante, se desideriamo avviare il kernel versione 3.10.0-123.el7.x86_64 (quarta voce), è necessario impostare GRUB_DEFAULT su 3 (le voci sono numerate internamente a partire da zero) come segue:

GRUB_DEFAULT=3
Boot System with Old Kernel Version

Una variabile di configurazione di GRUB che richiede un’attenzione speciale è GRUB_CMDLINE_LINUX, che viene usato per passare opzioni al kernel. Le opzioni che possono essere passate attraverso GRUB al kernel sono ben documentate nel file Parametri del Kernel e in man 7 bootparam.

Le opzioni correnti sul 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é modificare i parametri kernel predefiniti o passare opzioni extra? In termini semplici, ci potrebbe essere il momento in cui hai bisogno di dirigere al kernel certi parametri hardware che potrebbe non riuscire a determinare autonomamente o di sovrascrivere i valori che rileva.

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

Un altro esempio è quando hai bisogno di portare il sistema in modalità singolo utente per eseguire attività di manutenzione. Puoi fare questo 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) per aggiornare grub.cfg (altrimenti, le modifiche saranno 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 attraverso GRUB al momento dell’avvio dureranno solo durante la sessione corrente.

Risoluzione dei problemi di GRUB in Linux

Se si installa un secondo sistema operativo o se il file di configurazione di GRUB viene corrotto a causa di un errore umano, ci sono modi per far ripartire il sistema e consentire di avviarlo nuovamente.

Nella schermata iniziale, premere c per ottenere una riga di comando di GRUB (ricordarsi che si può anche premere e per modificare le opzioni di avvio predefinite) e utilizzare il comando help per visualizzare i comandi disponibili nel prompt di GRUB:

Fix Grub Configuration Issues in Linux

Ci concentreremo su ls, che elencherà i dispositivi e i filesystem installati e ne esamineremo i risultati. Nell’immagine sottostante possiamo vedere che ci sono 4 hard disk (hd0 attraverso hd3).

Sembra che solo hd0 sia stato partizionato (come si può vedere da msdos1 e msdos2, dove 1 e 2 sono i numeri di partizione e msdos è lo schema di partizionamento).

Ora esamineremo la prima partizione su hd0 (msdos1) per vedere se possiamo trovare GRUB lì. Questo approccio ci permetterà di avviare Linux e utilizzare altri strumenti di alto livello per riparare il file di configurazione o reinstallare completamente GRUB se necessario:

# ls (hd0,msdos1)/

Come si può vedere nell’area evidenziata, abbiamo trovato la directory grub2 in questa partizione.

Find Grub Configuration

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

set prefix=(hd0,msdos1)/grub2
set root=(hd0,msdos1)
insmod normal
normal
Find and Launch Grub Menu

Poi nel menu di GRUB, scegli un’opzione 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 desideri installare GRUB). Le informazioni di avvio saranno quindi aggiornate e tutti i file correlati ripristinati.

# grub2-install /dev/sdX

Altri scenari più complessi sono documentati, insieme alle relative soluzioni suggerite, nella Guida al Troubleshooting di Ubuntu GRUB2. I concetti spiegati lì sono validi anche per altre distribuzioni.

Riepilogo

In questo articolo ti abbiamo introdotto a GRUB, indicato dove trovare la documentazione sia online che offline, e spiegato come affrontare uno scenario in cui un sistema non si avvia correttamente a causa di un problema legato al bootloader.

Fortunatamente, GRUB è uno degli strumenti meglio documentati e puoi trovare facilmente aiuto sia nella documentazione installata che online utilizzando le risorse che abbiamo condiviso in questo articolo.

Hai domande o commenti? Non esitare a farcelo sapere utilizzando il modulo di commento qui sotto. Non vediamo l’ora di sentirti!

Source:
https://www.tecmint.com/configure-and-troubleshoot-grub-boot-loader-linux/