ESTÁ BEM. Tornou-se um pouco longo para comentar. Isso não está diretamente relacionado, mas apenas para explicar o aa55comentário.
Quando o sistema básico de entrada / saída (BIOS) é iniciado, ele faz um POST ( Power-On Self Test ), verifica o hardware etc. Em seguida, procura dispositivos que sejam inicializáveis e ativos por ordem dada pelo CMOS por sua vez, é fornecido por um semicondutor complementar de óxido metálico ). Quando encontra um disco 0xaa55com deslocamento 510, ele carrega essa seção do disco (setor 1) na memória e deixa o controle para ele no endereço 0x00000 desse código. Esses 512 bytes são o Master Boot Record (MBR).
Esse código, neste caso " GRUB-boot" , verifica vários bytes desses 512, além de solicitar várias informações à BIOS. Nesse processo, ele localiza qual disco possui o restante do GRUB e carrega essa seção do disco na memória - então essa parte do código obtém o controle. Esse monta o kernel etc. e deixa o controle para isso.
Usando a GPT, a imagem que o GRUB carrega no MBR está localizada na bios_grub
partição - que você possui e é grande o suficiente etc., portanto, não pode ver como isso pode estar errado.
Em "Nenhum dispositivo inicializável encontrado". mensagem do BIOS - pode-se considerar que o MBR do disco de inicialização está corrompido; se o MBR termina 0xaa55eo MBR está corrompido, geralmente ocorre um outro erro - ou o sistema simplesmente trava.
De qualquer forma. Isso é estranho. Percebo que você não possui uma partição marcada como "boot" . Usando o GPT correto, - mas, embora seja proibido, você pode tentar sinalizar um, por exemplo, sda5como inicialização. No gparted: (aprendi que (g) parted também altera o GPT que não deseja) fdisk:
# Toggle bootable:
a [DISK NUMBER]
# Check (could be an asterisk marking boot partition):
p
# Save changes:
w
Pode ser que o BIOS esteja fazendo mais do que deveria e verificando a tabela de partições no MBR.
EDIT - Atualize para comentar:
AFAIK, não importa qual você definir, pois na verdade não é usado. A questão é que, para quem nunca disser "dispositivo inicializável encontrado" , eles deverão estar satisfeitos. Não sda1é uma partição de inicialização no sentido tradicional, mas espaço para arquivos de inicialização do GRUB.
Em um layout de partição tradicional (não GPT), você normalmente tem algo como:
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 ]
| |
| |
|__________________|
Isso significaria 3 partições. Tudo antes do deslocamento 0x400 no HDD i bytes brutos - como não faz parte de nenhuma partição, etc.
Aqui, a partição de inicialização é a Partição 2, que é a partição do sistema com o linux.
Os arquivos do módulo GRUB 1 residem logo após o MBR e antes da primeira partição. Ele pode residir em qualquer lugar, mas geralmente no mesmo disco e no deslocamento 512 do disco MBR.
Também em um sistema GPT - o GPT usa essa seção do disco para si próprio; portanto, é necessário mover esses arquivos GRUB para outro local. É para isso que
bios_grubserve - armazenar core.imgpara o GRUB 2.
O "set boot flag" é apenas um tiro no escuro - e ficaria surpreso se funcionasse. Mas alguém começou em algum lugar.
EDIT2:
E se você fizer isso:
MBR atual de backup:
dd if=/dev/sda of=/path/mbr-backup bs=512 count=1
Crie uma imagem Code TESTabaixo, salva no arquivo test.spor:
as -o test.o test.s
objcopy -O binary test.o test.img
Copie o test.imgarquivo para MBR:
dd if=test.img of=/dev/sda bs=512 count=1
Boot
Código 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
Para restaurar o MBR, faça:
dd if=/path/mbr-backup of=/dev/sda bs=512 count=1
Isso deve simplesmente imprimir "Olá!" para a tela se o MBR foi carregado, pare. Testei executando nos sistemas qemu-system-x86_64, qemu-system-i386, VirtualBox, Intel PC estacionário de 32 e 64 bits.
dd if=/dev/sda bs=1 skip=510 count=2 2>&- | hexdump(ou xxd em vez de hexdump) é igual a 55aa? Caso contrário, o MBR está ruim.