Server Ubuntu, tabella delle partizioni gpt, mdadm, avvio di grub fallito


9

Dettagli di base del sistema di lavoro:

Ho usato il CD del server Ubuntu 12.04 per installare un server.

Ho 4 dischi. Su tutti i dischi ho fatto quanto segue, simile a questo howto :

  • creato una partizione di swap da 2 GB
  • ha creato una partizione da 256 GB / boot
  • creato una partizione RAID10 da 64 GB (per root)
  • ha creato una grande partizione RAID10 occupando il resto dello spazio

Ho formattato l'avvio come ext3. Ho installato RAID10 su root e grandi partizioni. Ho formattato il root ext4. Ho creato un volume logico su quello grande e l'ho formattato ext4.

Il sistema risultante funziona bene e si avvia bene.

Dettagli del problema:

Quindi ho deciso di documentare una procedura di fallimento. Come primo passo, ho deciso di reinstallare grub.

# grub-install /dev/sda
warn: This GPT partition label has no BIOS Boot Partition; embedding won't be possible!.
error: Embedding is not possible. GRUB can only be installed in this setup by using blocklists. However, blocklists are UNRELIABLE and their use is discouraged..
# grub-install /dev/sdb
warn: This GPT partition label has no BIOS Boot Partition; embedding won't be possible!.
error: Embedding is not possible. GRUB can only be installed in this setup by using blocklists. However, blocklists are UNRELIABLE and their use is discouraged..

Quindi sembra che abbia fallito, ma sembra anche che abbia rinunciato e non abbia apportato modifiche. Quindi ho riavviato. L'avvio non è riuscito. Si blocca semplicemente con uno schermo nero con un cursore lampeggiante a circa 4 righe verso il basso. Se avvio tenendo premuto "Shift", visualizzo la parola "GRUB" a sinistra del cursore, ma nessun prompt interattivo.

A questo punto, ho usato boot-repair-disk per generare questo rapporto: http://paste.ubuntu.com/966531/

Nota nel rapporto sopra, dice che il bootloader non punta al settore corretto per core.img. (sda è il cd virtuale; sdb è il disco di avvio; sdc è un mirror di sdb, ma boot non è speculare, c'è solo una partizione non correlata separata e formattata ext3; sdd e sde hanno spazio per l'avvio ma non sono formattati)

Quindi ho avviato dal CD del server Ubuntu, avviato il sistema di ripristino ed eseguito i seguenti comandi, che sono stati completati senza errori (dove sda ​​è il CD virtuale e b, c, d, e sono i dischi che erano a, b, c , d nei precedenti comandi grub):

# parted /dev/sdb set 2 bios_grub on
# parted /dev/sdc set 2 bios_grub on
# grub-install /dev/sdb
# grub-install /dev/sdc

A questo punto, ho usato boot-repair-disk per generare questo rapporto: http://paste.ubuntu.com/966561/

Si noti che nel rapporto sopra, il problema su core.img è scomparso. Sembra indicare il settore corretto.

Ora, se provo ad avviare, ricevo un prompt grub. Se eseguo "set", vedo che root viene trovato e impostato. Se eseguo "ls /" vedo la mia directory principale dal volume del raid, incluso il file del kernel vmlinuz. Se digito "ls / vmlinuz", dice "errore: file non trovato". Dice lo stesso errore se uso il comando "linux" per provare a caricare il kernel. Il file vmlinuz non è elencato se uso "ls -l /".

Dettagli troppo dettagliati, nel caso tu voglia seguire:

Ho notato che non esiste anche /boot/grub/grub.cfg, quindi ho corso

# grub-mkconfig -o /boot/grub/grub.cfg

Ma il problema rimane.

Se uso lo strumento "gptsync", questo comportamento non cambia.

Il disco di riparazione di avvio non ripara il sistema, perché vuole che esegua l'avvio con un BIOS abilitato EFI. Ho esaminato brevemente questo, ma non so come funzioni. Ho trovato una shell UEFI nelle mie opzioni di avvio, ma non ne so nulla e non vedo come cambiare l'avvio da lì (ad es. Per avviare il CD da quella shell EFI).

Ho anche letto questa pagina , ma Ubuntu non viene fornito con il comando "grub", quindi non posso seguirlo esattamente. Potrei semplicemente installare quel comando, ma sono più curioso di scoprire come il programma di installazione di Ubuntu è riuscito a installarlo piuttosto che avere una configurazione diversa. Ha usato le liste dei blocchi?

Ecco l'output di parted, mentre avviato sul boot-repair-disk (dove qui sdb è il primo disco rigido, sda quando viene avviato dal disco e "boot" cambia in "bios_grub" nel collegamento 2 ° incolla):

Model: ATA Hitachi HUA72303 (scsi)
Disk /dev/sdb: 3001GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End     Size    File system     Name   Flags
1      17.4kB  2000MB  2000MB  linux-swap(v1)  swap1
2      2000MB  2256MB  256MB   ext3            boot1  boot (this says bios_grub in 2nd link)
3      2256MB  66.3GB  64.0GB                  root1  raid
4      66.3GB  3001GB  2934GB                  data1  raid

Ecco una super vecchia macchina virtuale non correlata per il confronto (per chiunque non abbia familiarità con il disco di riparazione di avvio ): http://paste.ubuntu.com/966799/

Ecco l'ultima copia del sistema problematico, dopo aver eseguito grub-mkconfig sopra riportato e anche impostare "bios_grub" su "boot". http://paste.ubuntu.com/966808/

Confrontando i due, questo sembra interessante:

sdb2: __________________________________________________________________________

File system:       
Boot sector type:  Grub2's core.img
Boot sector info: 
Mounting failed:   mount: unknown filesystem type ''

md/bcserver8:0: ________________________________________________________________

File system:       ext4
Boot sector type:  -
Boot sector info: 
Operating System:  Ubuntu 12.04 LTS
Boot files:        /boot/grub/grub.cfg /etc/fstab /boot/grub/core.img

Sembra che il raid abbia i file di avvio e sdb2 non sia formattato. (nonostante ciò, il sistema si è avviato prima di eseguire grub-install). Dal CD di ripristino, "mount -t ext3 / dev / sdb2 / boot" non riesce. Ma ha senso che ciò confonda le cose, dal momento che grub usa esplicitamente la partizione 2 (il 2 nel comando parted che ha impostato bios_grub).

Quindi ho fatto qualcosa del genere:

# mkfs.ext3 -L boot1 /dev/sdb2
# mv boot boot_on_root
# mkdir boot
# mount /dev/sdb2 boot
# rsync -avHP boot_on_root/ boot/
# parted /dev/sdb set 2 bios_grub on
# parted /dev/sdc set 2 bios_grub on
# grub-install /dev/sdb
# grub-install /dev/sdc

Quindi riavviato e ho di nuovo lo schermo nero, nessun prompt. http://paste.ubuntu.com/966848/

Quindi, a questo punto, la mia ipotesi è che quando bios_grub è impostato, grub non si sta installando sull'MBR, e non sul file system ext3 su ext3, ma sulla partizione stessa, come se fosse EFI ... che ovviamente rovinerebbe il file system ext3 lì. E dalla mia breve lettura di EFI, sembrava che EFI supponesse che la prima partizione fosse l'avvio, ma nel mio caso la prima è swap, e inoltre dovrebbe essere FAT piuttosto che qualcosa di smontabile ... quindi dal momento che rende poco / no senso, sono ancora completamente perso senza un indizio. [EDIT: ora ho un indizio ... saltare un po 'per l'aggiornamento]

E ora, quando faccio clic su Ripara nel disco di ripristino del boot , mi chiede qualcos'altro. L'ultima volta l'errore è stato nascosto sotto la finestra e ho dovuto trascinare l'altro per vederlo. Questa volta la finestra principale scompare e la nuova finestra dice:

GPT detected.       You may want to retry after creating a
BIOS-Boot partition (>1Mo, flag). Do you want to continue?

Quindi ho fatto clic su Sì e ha detto che è stato riparato correttamente e ho creato un altro incolla: http://paste.ubuntu.com/966862/

Ma ho ancora uno schermo nero con un cursore lampeggiante.

Ora la mia teoria è che lo stivale è stato sovrascritto da una cosa non-fat non-EFI che è solo il codice grub che altrimenti sarebbe stato nei settori 0-63 prima. Per fortuna ho trovato una dichiarazione molto chiara in questa pagina, che probabilmente ha completato la mia comprensione di ciò che questo significa. E poi, dopo averlo scoperto, Jeremy ha pubblicato una risposta che, se vera, conferma che questo è il concetto chiave mancante. http://blog.psych0tik.net/2011/08/grub-embedding-blocklists-and-bios_grub-partitions/

Domande:

Cosa sta succedendo? Perché grub non dovrebbe avviarsi? Perché dice "file non trovato"?

Perché grub non vuole installare senza questa impostazione che ho impostato con parted (che non è stato impostato dal programma di installazione di Ubuntu)? Ho pensato che tutto ciò di cui avevo bisogno per installarlo fosse un separato / boot che non fosse in LVM né in un RAID software, dato che il mio root era in RAID e la tabella delle partizioni è GPT.

In che modo il programma di installazione del CD di Ubuntu lo installa senza questo problema e senza l'impostazione bios_grub?

Vorrei anche prendere in considerazione l'utilizzo di EFI. Se questa è una buona idea e esiste un modo standard per configurarla, sono sempre pronto a imparare cose nuove.

La risposta più rapida che mi renderebbe felice, anche senza rispondere a tutte le mie domande, sarebbe una serie di comandi che potrei eseguire dal CD di ripristino per riparare il bootloader nello stesso modo in cui lo ha fatto il CD di installazione. Sarebbe anche molto più bello se potessi eseguirli con il sistema avviato, invece del CD.


Potresti aggiungere l'output di stampa da parted?
Jeremy,

Puoi vedere che nei 2 link incolla sulla riga 993, ma per richiesta, lo aggiungerò alla mia domanda.
Peter,

Risposte:


8

La soluzione è utilizzare una partizione bios_grub, che non è la stessa della partizione / boot.

Per impostazione predefinita, la partizione bios_grub è 1MiB e deve essere contrassegnata con bios_grub. La mia è la prima partizione sul mio disco. Se la tua partizione 2 è effettivamente / boot come suggerisce parted, ciò non sarebbe corretto e dovresti creare un'altra partizione 1MiB.

Con GPT e GRUB2 il filesystem minimo ha tre partizioni: bios_grub, root, swap. (non è assolutamente necessario lo swap)

Perché grub non si avvia dopo aver semplicemente eseguito "grub-install"?

Sconosciuto ... Penseresti che non modificherebbe nulla se dice chiaramente che non può essere incorporato, quindi non può funzionare.

Perché dice "file non trovato"?

/ vmlinuz è un collegamento simbolico che utilizza la partizione di avvio e la partizione di avvio è danneggiata. Il codice bios_grub è stato scritto sopra la sua struttura ext3. Questo probabilmente significava che / boot non era montato e che i file grub visti erano effettivamente sul sistema root, che non conteneva il kernel.

Perché non grub vuole installare senza questa impostazione che ho impostato con parted

Una tabella delle partizioni GPT non ha spazio per un bootloader, a differenza di MBR. Pertanto, è necessario creare una partizione specifica per contenere il codice di avvio. Prima di eseguire "grub-install", specificare questa partizione con il comando:

    parted /dev/sda set 1 bios_grub on

Pensavo che tutto ciò di cui avevo bisogno fosse un separato / avvio. In che modo il programma di installazione del CD di Ubuntu lo installa senza l'impostazione bios_grub?

Questo requisito sembra essere tutto ciò che è necessario per il programma di installazione di Ubuntu, ma crea un sistema non standard che si rompe facilmente.

Quando GRUB dice "Questa etichetta di partizione GPT non ha partizione di avvio BIOS ", significa che la partizione bios_grub, non / boot.


Grazie. Questo è in realtà molto vicino a quello su cui sto lavorando ora. Vedi il mio "Sono ancora completamente perso senza un indizio." sezione sopra. Ora la mia teoria è che lo stivale è stato sovrascritto da una cosa non-fat non-EFI che è solo il codice grub che altrimenti sarebbe stato nei settori 0-63 prima. Sto lavorando a un esperimento e poi ti farò sapere come va.
Peter,

Stai usando Ubuntu? Esiste un modo in cui il programma di installazione di Ubuntu può installare correttamente usando la partizione bios_grub?
Peter,

@Peter Uso Ubuntu e se esegui un partizionamento guidato, il programma di installazione dovrebbe configurarlo correttamente. So che ha funzionato per me con il programma di installazione 11.10.
Jeremy,

Grazie mille. Questa è la risposta Successivamente proverò con configurazioni più complesse (raid e lvm all'avvio) e poi modificherò la tua risposta con i dettagli.
Peter,
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.