Come posso sapere da quale partizione avevo avviato?


12

Ho una macchina che ha partizioni multi-boot. Ho Ubuntu 14.04 su una partizione, Ubuntu 15.04 sulla seconda e Ubuntu 16.04 su una terza. C'è un modo per sapere, dalla riga di comando, da quale partizione avevo avviato, al fine di trovare su quale partizione è /boot/grub/grub.cfgstata utilizzata quella per il processo di avvio? Ho /boot/grub/grub.cfg su ciascuna delle tre partizioni.


3
Non puoi farlo con assoluta generalità e affidabilità. Per quello che sai, il /boot/grub/grub.cfgfile utilizzato per l'avvio potrebbe essere stato eliminato, quella partizione avrebbe potuto essere eliminata dalla tabella delle partizioni e quel disco rimosso fisicamente dal sistema.
Federico Poloni,

Risposte:


10

Una volta che GRUB ha passato l'avvio al kernel, il kernel non ha idea di cosa lo abbia avviato e /bootpotrebbe non essere quello utilizzato da quel GRUB. È possibile controllare i tempi di accesso boot/grub/grub.cfgin ciascuna delle partizioni per vedere quale è stata aperta più di recente. Ciò potrebbe dirti quale file di configurazione di GRUB è stato utilizzato.

stat -c %x /boot/grub/grub.cfg

Se i tempi di accesso non vengono aggiornati, dovrai cercare eventuali differenze nei parametri del kernel utilizzati dai vari file di configurazione di GRUB. Se è possibile modificarli, ad esempio, aggiungere foo=1, foo=2ecc. GRUB_CMDLINE_LINUXIn ciascuno di questi, eseguire sudo update-grub2e riavviare, è possibile verificare /proc/cmdlinequali di questi valori sono stati utilizzati.


interessante! vuol dire che la mia soluzione ha anche un tasso di precisione migliore rispetto a Ravexina e Katu?
Tatsu,

@tatsu IMO tutte le altre risposte sono errate - Ravexina sta localizzando la partizione in cui /bootsi trova, ma potrebbe non essere quello che ha usato grub, e tu e Katu state trovando la partizione montata su /è montata, ma, come ha notato Ravexina, che probabilmente ha ancor meno di una connessione
Muru,

1
sì, ma come può lo smontaggio fare qualcosa di diverso dalla rottura sulla partizione su cui si è montati: i dischi forniscono informazioni come il dispositivo l'indirizzo montato, tutte le informazioni sull'id di cui potresti aver bisogno su quale hai appena tentato di smontare. Sono il primo ad ammettere che la mia soluzione è brutta, ma ha avuto un tasso di successo del 100%, giusto?
Tatsu,

1
@tatsu tasso di successo per cosa? Trovare la partizione montata /, certo. Trovare quale configurazione di GRUB della partizione è stata utilizzata durante l'avvio? Non vedo come questo si collega.
muru,

4
Grub imposta effettivamente quel timestamp di accesso, dato che è il proprio DOS e non vincolato dalle convenzioni del driver del filesystem linux?
rackandboneman,

4

Come sai, il file che stai cercando si trova nella /bootdirectory del tuo sistema in esecuzione. o /bootè una partizione separata o non lo è; Se la tua /bootè una partizione separata, dovresti cercarla:

$ lsblk -r | grep '/boot'
sda2 8:1 0 400M 0 part /boot

Significa grub.cfgche è stato utilizzato in sda2.

Altrimenti dovresti cercare root:

$ lsblk -r | grep '/$'
sda1 8:1 0 121.2G 0 part /

questa volta si trova in sda1.

O anche per divertimento possiamo controllare i parametri del tempo di avvio:

$ cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinuz-3.16.0-4-686-pae root=UUID=938495-1fe2-3302 ro quiet

quindi usa UUIDper scoprire quale partizione è la tua radice.

$ sudo blkid | grep 938495-1fe2-3302
/dev/sda1: UUID="938495-1fe2-3302"

Che significa da sda1.

Puoi anche controllare questi parametri di avvio per vedere quale dei tuoi grub.cfgfile li contiene, questo funziona solo quando i tuoi parametri di avvio grub.cfgsono diversi l'uno dall'altro.


2
Un modo più semplice (che non richiede privilegi di superutente) per trovare il nodo del dispositivo dietro un UUID del file system sarebbe readlink -f /dev/disk/by-uuid/<UUID>.
David Foerster,

3

Per visualizzare il dispositivo che contiene il file system radice attualmente montato:

awk '$2=="/"{print $1}' /proc/mounts

Per visualizzare la versione di Ubuntu attualmente in esecuzione:

lsb_release -rs

che in realtà fa molta riflessione sulla domanda e sembra la risposta più adatta di sempre. Scommetto che, dato che non ci sono due distro sulla sua configurazione, ha lo stesso numero di versione che userà lsb_release -rsogni volta. BACIO
Tatsu,

Purtroppo questo non funziona. Ho testato il tuo comando sulla mia macchina con più sistemi operativi, solo il mio "master`-OS ha grub installato in MBR, altri sistemi operativi hanno Grub installato in PBR, il comando sembra mostrare la posizione in cui il sistema operativo ha Grub installato, ma non mostra da quale sistema operativo Grub carica il file di configurazione.
mook765,

@ mook765: La mia risposta non ha assolutamente nulla a che fare con Grub o MBR (o qualsiasi tipo di boot loader o tabella delle partizioni). Non sono sicuro di cosa hai provato esattamente e cosa ti aspettavi di vedere.
David Foerster,

Quindi questa risposta non ha nulla a che fare con la domanda ...
mook765,

@ mook765: se lo prendi alla lettera, allora sì. Tuttavia, a me sembra che OP voglia sapere quale delle sue molteplici installazioni Ubuntu è attualmente avviata e per questo la mia risposta dovrebbe andare bene.
David Foerster,

2

Potremmo aggiungere una semplice voce di menu personalizzata in ciascun sistema operativo e vedremmo nel menu Grub da cui OS Grub ha caricato il suo file di configurazione.

Esempio:

Avviamo in 16.04 e modifichiamo il file /etc/grub.d/40_customper aggiungere una voce di menu.

#! / Bin / sh
exec tail -n +3 $ 0
# Questo file fornisce un modo semplice per aggiungere voci di menu personalizzate. Digita semplicemente il
# voci di menu che desideri aggiungere dopo questo commento. Fai attenzione a non cambiare
# la riga 'exec tail' sopra.
#

menuentry 'grub.conf caricato dal 16.04' {        
            riavvio  
    }

Ci assicuriamo che il file sia eseguibile ed eseguito sudo update-grub.

Poi facciamo le stesse modifiche della altri OS, abbiamo appena utilizzano nomi diversi per la menuentry, ig cambiamo 16.04per 15.04, e così via.

Se selezioniamo questa voce di menu nel menu Grub durante l'avvio, la macchina si riavvierà, li creeremo non per avviare alcun sistema operativo ma per vedere quale sistema operativo viene effettivamente utilizzato per il caricamento grub.conf.

Informazioni aggiuntive

Questo tipo di confusione appare quando installiamo più sistemi operativi che utilizzano tutti Grub e durante l'installazione di un sistema operativo scegliamo la stessa posizione del caricatore di avvio. Abbiamo effettivamente bisogno di un solo sistema operativo che installa Grub, Grub può avviarsi in qualsiasi distribuzione Linux, quindi se abbiamo una distribuzione installata (incluso Grub), potremmo installare sistemi operativi aggiuntivi senza installare Grub.

Nelle installazioni legacy è abbastanza facile gestire la posizione per l'installazione del caricatore di avvio, poiché possiamo scegliere il record di avvio della partizione come posizione, ma dobbiamo fare attenzione a scegliere la partizione corretta. Quindi un sistema operativo installa il caricatore di avvio sull'MBR e altri sistemi operativi installano il caricatore di avvio sul PBR della partizione del sistema operativo. Questa possibilità è disponibile solo quando si utilizza l' Something elseopzione durante l'installazione.

Nelle installazioni UEFI è un po 'più strano, il bootloader verrà installato in una cartella nella partizione di sistema EFI (ESP) e più bootloader possono facilmente coesistere. Il problema qui è che tutte le versioni di Ubuntu e anche alcune altre distribuzioni di Linux installeranno Grub nella stessa cartella nell'ESP e non abbiamo scelta. Quindi l'installazione di un'ulteriore distribuzione Linux sovrascriverebbe il nostro boot loader già esistente. L'unico modo che conosco per evitare questo è di avviare una sessione live e avviare il programma di installazione sudo ubiquity -b.

Un'altra soluzione semplice

Supponiamo che abbiamo tre distribuzioni Linux installate sulle partizioni sda1, sda2e sda3. Ora diamo un'occhiata alle voci del menu di avvio di Grub. Durante l'avvio, vedremo qualcosa del genere:

1 Ubuntu
2 Opzioni avanzate per Ubuntu
3 Test di memoria (memtest86 +)
4 Test di memoria (memtest86 +, console seriale 115200)
5 Ubuntu (su / dev / sda2)
6 Opzioni avanzate per Ubuntu (su / dev / sda2)
7 Ubuntu 17.04 (su / dev / sda3)
8 Opzioni avanzate per Ubuntu (su / dev / sda3)

Le prime due voci sono le voci per il sistema operativo che ha generato il grub.conffile effettivamente utilizzato. Le voci n. 3 e n. 4 non sono interessanti al momento. Le voci # 5, # 6, # 7 e # 8 sono le voci che sono state generate con il prober OS e vediamo su quali partizioni risiedono i SO per queste voci. Quindi, nel caso di questo piccolo esempio, possiamo concludere che il grub.configfile che effettivamente usiamo non appartiene al sistema operativo su sda2o sda3ma al sistema operativo su sda1. Nel caso in cui uno o più SO siano installati con una /bootpartizione separata, dovremmo verificare quale /bootpartizione appartiene a quale SO, ma ciò è facilmente findmnteseguibile eseguendo il comando in ciascun SO.


+1 Nonostante sia lungo, questa risposta in realtà include punti rilevanti. Per i sistemi BIOS, gli utenti che eseguono l'avvio multiplo dovrebbero preferire "Qualcos'altro" nell'installer per avere un maggiore controllo; Non c'è bisogno di forzare "non installare il boot loader GRUB" (vedi la mia risposta precedente ). Per i sistemi UEFI, l'installazione multi-boot sembra essere molto inspiegabile o non testata.
Clearkimura,

1
lsblk

E controlla su quale disco è montato /. Si prega di leggere i commenti qui sotto o la risposta di Ravexina se si dispone /bootnei punti montati.

Se non si è sicuri, controllare l'UUID

lsblk -o UUID,NAME,SIZE,MOUNTPOINT

2
Non è vero, cosa succede se la mia /bootè una partizione separata? quindi /boot/grub/grub.cfgnon si trova nella /partizione.
Ravexina,

@Ravexina Ottieni informazioni tecniche, potrebbe essere vero. Tuttavia, ai fini di questo utente, la /partizione non conta?

@MarkYisri Immagino che dovrei dire che non è sempre vero, tuttavia l'OP ci sta dicendo che ha ottenuto il file su tre diverse partizioni, quindi credo che sia meglio verificare /bootprima un separato .
Ravexina

1
Grazie per averlo sottolineato @Ravexina ho aggiornato la risposta.
Katu

0

Per sapere da quale partizione è stato avviato l'utente, consultare il menu del caricatore di avvio prima di avviare uno dei sistemi installati. È difficile dirlo senza vedere il menu del boot loader.

Dove guardare

Nei seguenti screenshot combinati, ho etichettato tre suggerimenti che si potrebbero sapere da quale partizione aveva avviato l'utente.

Menu di avvio multiplo con GNU GRUB versione PC / BIOS con annotazione

Etichetta (1): voci del menu GNU GRUB sotto la prima voce

Etichetta (2): versione GNU GRUB nella parte superiore del menu del caricatore di avvio

Etichetta (3): immagine di sfondo GNU GRUB (impostazione manuale richiesta)

Il suggerimento più evidente è label (3), che è quello di cambiare l'immagine di sfondo di GNU GRUB sul sistema che ha il controllo del menu del boot loader. È il più facile da dire, a condizione che l'utente lo abbia impostato in anticipo.

Spiegazione dell'etichetta (1)

Cerca la partizione non elencata nelle voci di menu sotto la prima voce. Nella schermata sono installati solo due sistemi operativi, ad esempio "Ubuntu" e "Ubuntu 14.04.5 LTS".

Ubuntu
Advanced options for Ubuntu
Memory test (memtest86+)
Memory test (memtest86+, serial console 115200)
Ubuntu 14.04.5 LTS (14.04) (on /dev/sda3)
Advanced options for Ubuntu 14.04.5 LTS (14.04) (on /dev/sda3)

Quest'ultimo ha menzionato (on /dev/sda3), il che significa che il primo potrebbe trovarsi su /dev/sda2o /dev/sda1. A dire il vero, dopo aver avviato il sistema, ad esempio "Ubuntu", eseguire il comando pertinente per elencare le partizioni disponibili ( lsblksembra essere il più semplice).

$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0    13G  0 disk 
├─sda1   8:1    0   976M  0 part [SWAP]
├─sda2   8:2    0     6G  0 part /
└─sda3   8:3    0     6G  0 part 
sr0     11:0    1  55.7M  0 rom 

Solo dopo aver confrontato con l'output di lsblk, allora sappiamo che il sistema cioè "Ubuntu" si trova su /dev/sda2(che non lo era elencato nelle voci di menu) da cui viene gestito il menu del caricatore di avvio.

Spiegazione dell'etichetta (2)

Cerca la versione di GRUB stampata nella parte superiore del menu del caricatore di avvio. Nota che versione e confronta con la versione di GRUB che si trova sul sistema avviato, ad esempio "Ubuntu".

Nella schermata (metà inferiore): GNU GRUB version 2.02~beta2-9

Dopo aver avviato il sistema, ad esempio "Ubuntu", eseguire il comando pertinente per verificare la versione del pacchetto GRUB ( grub-install --versionè pertinente e molto semplice).

$ grub-install --version
grub-install (GRUB) 2.02~beta2-9

Come è rilevante? Perché grub-installe i update-grubcomandi sono entrambi forniti dallo stesso pacchettogrub2-common . Dato che il menu del caricatore di avvio viene creato e aggiornato utilizzando strumenti dello stesso pacchetto, la versione stampata nella parte superiore del menu del caricatore di avvio sarà la stessa.

Spiegazione dell'etichetta (3)

Questo suggerimento deve essere impostato manualmente, poiché l'immagine di sfondo predefinita del menu del caricatore di avvio è nessuna (solo nero). L'immagine di sfondo deve avere una profondità di 8 bit.

Se il desktop-basepacchetto è installato sul tuo sistema, tali immagini di sfondo create appositamente per GRUB sono facilmente reperibili con il suffisso del nome file *grub.pngnella directory di destinazione.

$ ls /usr/share/images/desktop-base/*grub.png
/usr/share/images/desktop-base/desktop-grub.png
/usr/share/images/desktop-base/joy-grub.png
/usr/share/images/desktop-base/moreblue-orbit-grub.png
/usr/share/images/desktop-base/spacefun-grub.png

Per impostare l'immagine di sfondo:

  1. Apri il /etc/default/grubfile come superutente, quindi aggiungi la riga GRUB_BACKGROUND=con il percorso completo all'immagine scelta e citata.

    $ sudo nano /etc/default/grub 
    ...
    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
    GRUB_CMDLINE_LINUX=""
    
    # Show background in GRUB boot menu
    GRUB_BACKGROUND="/usr/share/images/desktop-base/spacefun-grub.png"
    ...
    
  2. Quindi, esegui sudo update-grubl'aggiornamento per /boot/grub/grub.cfgincludere il menu del caricatore di avvio. L'utente vedrà un output simile al seguente.

    $ sudo update-grub
    Generating grub configuration file ...
    Found background: /usr/share/images/desktop-base/spacefun-grub.png
    Found background image: /usr/share/images/desktop-base/spacefun-grub.png
    Found linux image: /boot/vmlinuz-3.13.0-24-generic
    Found initrd image: /boot/initrd.img-3.13.0-24-generic
    Found memtest86+ image: /boot/memtest86+.elf
    Found memtest86+ image: /boot/memtest86+.bin
    Found Ubuntu 14.04.5 LTS (14.04) on /dev/sda3
    done
    
  3. Riavvia il computer e verifica se nel menu del caricatore di avvio sono state apportate modifiche visibili dal comando update dal sistema.

Altrimenti, ripetere i passaggi per altri sistemi, uno alla volta. I passaggi ripetuti sarebbero stati superflui qualora l'utente fosse consapevole di quale sistema avesse il controllo sul menu del caricatore di avvio (di nuovo, questo dipende da come è stata effettuata l'installazione).

disconoscimento

Questa risposta spiega i criteri comprovati e ben testati per il sistema BIOS con configurazione multi-boot usando GNU GRUB versione PC / BIOS. Si applicano le seguenti eccezioni.

  • Per UEFI controparte sistema utilizzando la versione GNU GRUB EFI, è non è garantito o no sa se i criteri sembrano essere lo stesso come sopra descritto.

  • L'enfasi è data all'aspetto del menu del caricatore di avvio (come può apparire diverso, ad esempio la metà superiore dello screenshot) piuttosto che per dimostrare come funziona il chainloading. In quanto tale, riguardo a "come è stato impostato il multi boot come mostrato nello screenshot" non sarebbe spiegato in questa risposta.

  • Se l'installazione multi avvio è mai fatta esattamente delle stesse copie di un sistema operativo simile, ad esempio Ubuntu 14.04, Kubuntu 14.04, Xubuntu 14.04, ecc., L'unico modo affidabile per sapere da quale partizione è stato avviato l'utente è label (3).

  • Label (3) potrebbe funzionare meglio usando un'immagine di sfondo personalizzata che scrive esplicitamente da cui è stata avviata, ad esempio "Questo menu di avvio è gestito da / dev / sda1". Allo stesso modo, riguardo a "come creare un'immagine di sfondo personalizzata per GRUB" non verrebbe spiegato in questa risposta.

TL; DR Guarda il menu del boot loader prima di avviare uno dei sistemi installati. Il modo più semplice e affidabile per sapere è l'etichetta (3), che consiste nel configurare manualmente l'immagine di sfondo di GRUB.

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.