C’era una volta GRUB legacy, il grande bootloader Linux unificato versione 0.97. Legacy GRUB aveva molte virtù, ma divenne vecchio e i suoi sviluppatori desideravano più funzionalità, e così GRUB 2 venne al mondo.
GRUB 2 è una riscrittura importante con diverse differenze significative. Si avvia supporti rimovibili, e può essere configurato con un’opzione per accedere al BIOS di sistema. È più complicato da configurare con tutti i tipi di script da guadare, e invece di avere un file /boot/grub/menu.lst
abbastanza semplice con tutte le configurazioni in un unico posto, il valore predefinito è /boot/grub/grub.cfg
. Che non modifichi direttamente, oh no, perché questo non è per i semplici umani da toccare, ma solo per altri script. Noi umili umani possiamo modificare /etc/default/grub
, che controlla principalmente l’aspetto del menu GRUB. Possiamo anche modificare gli script in /etc/grub.d/
. Questi sono gli script che avviano i sistemi operativi, controllano applicazioni esterne come memtest
e os_prober
e tematizzazione./boot/grub/grub.cfg
è costruito da/etc/default/grub
e/etc/grub.d/*
quando si esegue ilupdate-grub
comando, che è necessario eseguire ogni volta che si apportano modifiche.
La buona notizia è che lo script update-grub
è affidabile per trovare kernel, file di avvio e aggiungere tutti i sistemi operativi al menu di avvio di GRUB, quindi non devi farlo manualmente.
Impareremo come risolvere due dei guasti più comuni. Quando si avvia il sistema e si ferma al promptgrub>
, che è la shell di comando GRUB 2 completa. Ciò significa che GRUB 2 ha iniziato normalmente e caricato il modulonormal.mod
(e altri moduli che si trovano in/boot/grub//
), ma non ha trovato il filegrub.cfg
. Se vedigrub rescue>
significa che non è riuscito a trovarenormal.mod
, quindi probabilmente non è riuscito a trovare nessuno dei tuoi file di avvio.
Come succede? Il kernel potrebbe aver cambiato le assegnazioni delle unità o hai spostato i tuoi dischi rigidi, hai cambiato alcune partizioni o installato un nuovo sistema operativo e spostato le cose. In questi scenari i file di avvio sono ancora lì, ma GRUB non riesce a trovarli. Quindi puoi cercare i tuoi file di avvio al prompt di GRUB, impostare le loro posizioni, quindi avviare il sistema e correggere la configurazione di GRUB.
Shell di comando GRUB 2
La shell di comando GRUB 2 è potente quanto la shell di GRUB legacy. Puoi usarlo per scoprire le immagini di avvio, i kernel e i filesystem di root. In effetti, ti dà accesso completo a tutti i filesystem sul computer locale indipendentemente dalle autorizzazioni o da altre protezioni. Che alcuni potrebbero considerare un buco di sicurezza, ma conosci il vecchio detto Unix: chiunque abbia accesso fisico alla macchina lo possiede.
Quando sei al prompt grub>
, hai molte funzionalità simili a qualsiasi shell di comandi come cronologia e completamento delle schede. La modalitàgrub rescue>
è più limitata, senza cronologia e senza completamento delle schede.
Se si sta esercitando su un sistema funzionante, premere C quando viene visualizzato il menu di avvio di GRUB per aprire la shell dei comandi di GRUB. È possibile interrompere il conto alla rovescia di avvio scorrendo su e giù le voci di menu con i tasti freccia. È sicuro sperimentare sulla riga di comando di GRUB perché nulla di ciò che fai è permanente. Se stai già fissando il promptgrub>
ogrub rescue>
, allora sei pronto per il rock.
I comandi successivi funzionano sia congrub>
che congrub rescue>
. Il primo comando che dovresti eseguire richiama il cercapersone, per il paging di output di comandi lunghi:
grub> set pager=1
Non ci devono essere spazi su entrambi i lati del segno di uguale. Ora facciamo un po ‘ di esplorazione. Digitare ls
per elencare tutte le partizioni che GRUB vede:
grub> ls(hd0) (hd0,msdos2) (hd0,msdos1)
Cos’è tutto questo msdos stuff
? Ciò significa che questo sistema ha la tabella delle partizioni MS-DOS vecchio stile, piuttosto che il nuovo lucido Globally Unique Identifiers Partition table (GPT). (Vedi Usare la nuova tabella delle partizioni GUID in Linux (Addio antico MBR). Se stai usando GPT dirà (hd0,gpt1)
. Ora curiosiamo. Usa il comandols
per vedere quali file sono sul tuo sistema:
grub> ls (hd0,1)/lost+found/ bin/ boot/ cdrom/ dev/ etc/ home/ lib/lib64/ media/ mnt/ opt/ proc/ root/ run/ sbin/ srv/ sys/ tmp/ usr/ var/ vmlinuz vmlinuz.old initrd.img initrd.img.old
Evviva, abbiamo trovato il filesystem di root. È possibile omettere le etichettemsdos
egpt
. Se si lascia fuori la barra stamperà le informazioni sulla partizione. È possibile leggere qualsiasi file sul sistema con il comandocat
:
grub> cat (hd0,1)/etc/issueUbuntu 14.04 LTS n l
Leggere /etc/issue
potrebbe essere utile su un sistema multi-boot per identificare i vari Linuxes.
Avvio da grub>
Ecco come impostare i file di avvio e avviare il sistema dal prompt grub>
. Sappiamo dall’esecuzione del comandols
che c’è un filesystem root Linux su(hd0,1)
, e puoi continuare a cercare fino a verificare dove si trova/boot/grub
. Quindi esegui questi comandi, usando la tua partizione di root, il kernel e initrd image:
grub> set root=(hd0,1)grub> linux /boot/vmlinuz-3.13.0-29-generic root=/dev/sda1grub> initrd /boot/initrd.img-3.13.0-29-genericgrub> boot
La prima riga imposta la partizione su cui si trova il filesystem di root. La seconda riga indica a GRUB la posizione del kernel che si desidera utilizzare. Inizia a digitare /boot/vmli
, quindi usa tab-completion per riempire il resto. Digitareroot=/dev/sdX
per impostare la posizione del filesystem di root. Sì, questo sembra ridondante, ma se lo lasci fuori otterrai un kernel panic. Come fai a sapere la partizione corretta? hd0, 1 = / dev / sda1. hd1, 1 = / dev / sdb1. hd3,2 = / dev / sdd2. Penso che tu possa estrapolare il resto.
La terza riga imposta il file initrd
, che deve essere lo stesso numero di versione del kernel.
La quarta riga avvia il sistema.
Su alcuni sistemi Linux i kernel e gli initrd attuali sono collegati simbolicamente al livello superiore del filesystem root:
$ ls -l /vmlinuz -> boot/vmlinuz-3.13.0-29-genericinitrd.img -> boot/initrd.img-3.13.0-29-generic
In modo da poter avviare da grub>
in questo modo:
grub> set root=(hd0,1)grub> linux /vmlinuz root=/dev/sda1grub> initrd /initrd.imggrub> boot
il Boot Da grub rescue>
Se siete in GRUB rescue shell i comandi sono diversi, e si deve caricare il normal.mod
elinux.mod
moduli:
grub rescue> set prefix=(hd0,1)/boot/grubgrub rescue> set root=(hd0,1)grub rescue> insmod normalgrub rescue> normalgrub rescue> insmod linuxgrub rescue> linux /boot/vmlinuz-3.13.0-29-generic root=/dev/sda1grub rescue> initrd /boot/initrd.img-3.13.0-29-genericgrub rescue> boot
Tab dovrebbero iniziare a lavorare dopo il carico di entrambi i moduli.
Effettuare riparazioni permanenti
Dopo aver avviato correttamente il sistema, eseguire questi comandi per correggere GRUB in modo permanente:
# update-grubGenerating grub configuration file ...Found background: /usr/share/images/grub/Apollo_17_The_Last_Moon_Shot_Edit1.tgaFound background image: /usr/share/images/grub/Apollo_17_The_Last_Moon_Shot_Edit1.tgaFound linux image: /boot/vmlinuz-3.13.0-29-genericFound initrd image: /boot/initrd.img-3.13.0-29-genericFound linux image: /boot/vmlinuz-3.13.0-27-genericFound initrd image: /boot/initrd.img-3.13.0-27-genericFound linux image: /boot/vmlinuz-3.13.0-24-genericFound initrd image: /boot/initrd.img-3.13.0-24-genericFound memtest86+ image: /boot/memtest86+.elfFound memtest86+ image: /boot/memtest86+.bindone# grub-install /dev/sdaInstalling for i386-pc platform.Installation finished. No error reported.
Quando eseguigrub-install
ricorda che lo stai installando nel settore di avvio del tuo disco rigido e non in una partizione, quindi non usare un numero di partizione come/dev/sda1
.
Ma ancora non funziona
Se il tuo sistema è così incasinato che niente di tutto questo funziona, prova il Super GRUB2 live rescue disk. Anche il manuale ufficiale GNU GRUB 2.00 dovrebbe essere utile.