ХОРОШО. Стало немного долго комментировать. Это не связано напрямую, но только для объяснения aa55
комментария.
Когда Basic Input / Output System начинает (BIOS) она делает Power-On Self Test (POST), проверка аппаратных средств и т.д. Тогда это выглядит для устройств , которые одновременно являются загрузочным и активным по заказу заданной CMOS (Ваша конфигурация в BIOS - что в свою очередь дается Дополнительный металл-оксид-полупроводник ). Когда он находит диск 0xaa55
со смещением 510, он загружает эту часть диска (сектор 1) в память и оставляет ему управление по адресу 0x00000 этого кода. Эти 512 байтов являются основной загрузочной записью (MBR).
Этот код, в данном случае « GRUB-boot» , дополнительно проверяет различные байты этих 512, чтобы запросить у BIOS различную информацию. В этом процессе он определяет, на каком диске находится GRUB, и загружает этот раздел диска в память - тогда эта часть кода получает контроль. Это монтирует ядро и т. Д. И оставляет контроль над этим.
Используя GPT, образ GRUB, загружаемый из MBR, находится в bios_grub
разделе, который у вас есть, и он достаточно большой, и т. Д., Поэтому вы не видите, как это может быть неправильно.
На «Загрузочное устройство не найдено». сообщение из BIOS - может случиться так, что MBR загрузочного диска поврежден, если MBR заканчивается, 0xaa55
а MBR поврежден, обычно возникает другая ошибка - или система просто зависает.
Так или иначе. Это странно Я заметил, что у вас нет раздела, помеченного как «загрузочный» . Используя GPT, это правильно, но, хотя это запрещено, вы можете попробовать пометить один, например, sda5
как загрузочный. В gparted: (узнал, что (g) расстался и измените GPT, который не хотите) fdisk:
# Toggle bootable:
a [DISK NUMBER]
# Check (could be an asterisk marking boot partition):
p
# Save changes:
w
Возможно, ваш BIOS делает больше, чем следует, и проверяет таблицу разделов в MBR.
РЕДАКТИРОВАТЬ - Обновить, чтобы комментировать:
AFAIK, не имеет значения, какой из них вы установили, поскольку он на самом деле не используется. Скорее всего, для тех, кто никогда не скажет «загрузочное устройство найдено» , они будут удовлетворены. В sda1
традиционном смысле это не загрузочный раздел, а место для загрузочных файлов GRUB.
В традиционной схеме разделов (не GPT) у вас обычно есть что-то вроде:
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 ]
| |
| |
|__________________|
Это будет означать 3 раздела. Все до смещения 0x400 на жестком диске в необработанных байтах - как не в любом разделе и т.д.
Здесь загрузочным разделом является Раздел 2, который является системным разделом с Linux.
Файлы GRUB модуля 1 находятся сразу после MBR и перед первым разделом. Он может находиться где угодно, но обычно на одном диске со смещением 512 MBR-диска.
Также в системе GPT - GPT использует этот раздел диска для себя, поэтому необходимо переместить эти файлы GRUB в другое место. Для этого и
bios_grub
нужно хранить core.img
GRUB 2.
«Набор загрузочный флаг» является лишь выстрел в темноте, - и был бы удивлен , если он работает. Но у кого-то есть начало.
EDIT2:
Что делать, если вы делаете это:
Резервное копирование текущей MBR:
dd if=/dev/sda of=/path/mbr-backup bs=512 count=1
Создайте изображение Code TEST
снизу, сохраните в файл test.s
:
as -o test.o test.s
objcopy -O binary test.o test.img
Скопируйте test.img
файл в MBR:
dd if=test.img of=/dev/sda bs=512 count=1
ботинок
Код ТЕСТ:
.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
Для восстановления MBR выполните:
dd if=/path/mbr-backup of=/dev/sda bs=512 count=1
Это должно просто напечатать "Привет!" на экран, если MBR был загружен, затем остановите. Протестировал его, запустив под управлением qemu-system-x86_64, qemu-system-i386, VirtualBox, стационарные ПК Intel 32 и 64 бит.
dd if=/dev/sda bs=1 skip=510 count=2 2>&- | hexdump
(или xxd вместо hexdump) равен 55aa? Если не MBR это плохо.