ESTÁ BEM. Tornou-se um pouco longo para comentar. Isso não está diretamente relacionado, mas apenas para explicar o aa55
comentá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 0xaa55
com 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 0xaa55
eo 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, sda5
como 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_grub
serve - armazenar core.img
para 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 TEST
abaixo, salva no arquivo test.s
por:
as -o test.o test.s
objcopy -O binary test.o test.img
Copie o test.img
arquivo 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.