OK. È diventato un po 'lungo per un commento. Questo non è direttamente correlato, ma solo per spiegare il aa55
commento.
All'avvio del BIOS ( Basic Input / Output System ) esegue un Power-On Self Test (POST), controlla l'hardware, ecc. Quindi cerca i dispositivi che sono sia avviabili che attivi secondo l'ordine dato da CMOS (La tua configurazione nel BIOS - che a sua volta è dato da un semiconduttore di ossido di metallo complementare ). Quando trova un disco 0xaa55
con offset 510 carica quella sezione del disco (settore 1) in memoria e lascia il controllo su di esso sull'indirizzo 0x00000 di quel codice. Quei 512 byte sono il Master Boot Record (MBR).
Quel codice, in questo caso " GRUB - boot" , controlla vari byte di questi 512 oltre a chiedere al BIOS varie informazioni. In questo processo individua quale disco ha il resto di GRUB e carica quella sezione del disco in memoria, quindi quella parte del codice ottiene il controllo. Quello monta kernel ecc. E lascia il controllo a quello.
Usando GPT l'immagine che GRUB carica dall'interno di MBR si trova nella bios_grub
partizione, che hai, ed è abbastanza grande, ecc., Quindi non riesco a vedere come potrebbe essere sbagliato.
Su "Nessun dispositivo di avvio trovato." messaggio dal BIOS - si può avere il caso che l'MBR del disco di avvio sia danneggiato, se l'MBR termina 0xaa55
e l'MBR è corrotto si ottiene di solito un altro errore - o il sistema si blocca semplicemente.
Comunque. Questo è strano. Ho notato che non hai alcuna partizione contrassegnata come "avvio" . Usando GPT è corretto, ma, sebbene sia proibito, potresti provare a contrassegnarne uno, ad esempio, sda5
come avvio. In gparted: (ho appreso che (g) ha separato anche GPT che non vorrebbe) fdisk:
# Toggle bootable:
a [DISK NUMBER]
# Check (could be an asterisk marking boot partition):
p
# Save changes:
w
È possibile che il BIOS stia facendo di più di quanto dovrebbe e controlla la tabella delle partizioni in MBR.
EDIT - Aggiornamento per commentare:
AFAIK non importa quale hai impostato in quanto non viene effettivamente utilizzato. Indipendentemente dal fatto che, per chi non ha mai detto "dispositivo di avvio trovato" , devono essere soddisfatti. Non sda1
è una partizione di avvio in senso tradizionale, ma spazio per i file di avvio di GRUB.
In un layout di partizione tradizionale (non GPT) hai in genere qualcosa di simile:
0x000 [Master Boot Record] <- Partition table say Partition 2 is active
|
0x200 [ GRUB module 1 ] <- core.img from GRUB |
|
0x400 [ Partition 1 Swap ] |
| | |
| | |
|__________________| |
|
0x... [ Partition 2 ext4 ] |
| * Active | <- AKA boot ----------------+
| |
|__________________|
0x... [ Partition 3 ext4 ]
| |
| |
|__________________|
Ciò significherebbe 3 partizioni. Tutto prima di compensare 0x400 sull'HDD i byte grezzi - come in nessuna parte di alcuna partizione ecc.
Qui la partizione di avvio è Partition 2, che è la partizione di sistema con Linux.
I file del modulo 1 di GRUB risiedono subito dopo MBR e prima della prima partizione. Può risiedere ovunque, ma di solito sullo stesso disco e all'offset 512 del disco MBR.
Anche su un sistema GPT - GPT utilizza quella sezione del disco per sé, quindi è necessario spostare quei file GRUB in un'altra posizione. Questo è ciò che
bios_grub
serve per archiviare core.img
per GRUB 2.
Il "set boot flag" è semplicemente uno sparo nel buio, e sarebbe sorpreso se funzionasse. Ma uno è iniziato da qualche parte.
EDIT2:
E se lo fai:
Backup MBR corrente:
dd if=/dev/sda of=/path/mbr-backup bs=512 count=1
Crea immagine dal Code TEST
basso, salvata su file test.s
per:
as -o test.o test.s
objcopy -O binary test.o test.img
Copia il test.img
file su MBR:
dd if=test.img of=/dev/sda bs=512 count=1
Stivale
Codice TEST:
.file "test.s"
.text
.code16
.globl start, _start
start:
_start:
jmp go
nop
go:
movb $0x48, %al
call prnt_chr
movb $0x65, %al
call prnt_chr
movb $0x6c, %al
call prnt_chr
movb $0x6c, %al
call prnt_chr
movb $0x6f, %al
call prnt_chr
movb $0x21, %al
call prnt_chr
ret
prnt_chr:
movb $0x0e, %ah
int $0x10
ret
. = _start + 0x1fe
.word 0xaa55
Per ripristinare l'MBR fare:
dd if=/path/mbr-backup of=/dev/sda bs=512 count=1
Questo dovrebbe semplicemente stampare "Ciao!" sullo schermo se l'MBR è stato caricato, quindi interrompere. Testato eseguendo sotto qemu-system-x86_64, qemu-system-i386, VirtualBox, PC Intel fisso a 32 e 64 bit.
dd if=/dev/sda bs=1 skip=510 count=2 2>&- | hexdump
(o xxd invece di hexdump) è uguale a 55aa? Altrimenti l'MBR è male.