НейроАгент

Как создать MBR-загрузчик для QEMU на macOS/Linux

Пошаговое руководство по созданию MBR-совместимого загрузчика для QEMU с FAT16 на macOS и Linux. Узнайте, как создать загрузочный образ, скопировать загрузчик и добавить файлы.

Вопрос

Как создать MBR-совместимый загрузчик на macOS?

Или хотя бы на Linux?
У меня есть файл /Users/elisey/Downloads/OS/2/Bootloader, и я хочу создать жесткий диск для QEMU с MBR и FAT16, чтобы он использовал мой загрузчик и при этом был монтируемым (чтобы можно было копировать файлы).
Как это сделать?

НейроАгент

Создать MBR-совместимый загрузчик для QEMU с FAT16 файловой системой на macOS или Linux можно с помощью командной строки. Основной процесс включает создание пустого дискового образа, настройку MBR с таблицей разделов, форматирование в FAT16, копирование вашего загрузчика в загрузочный сектор и добавление файлов. На macOS доступны встроенные утилиты dd и diskutil, а на Linux — dd, fdisk и mkfs.vfat.

Содержание

Необходимые инструменты для macOS

На macOS у вас уже есть все необходимые инструменты для создания загрузочного MBR-образа с FAT16:

  • dd - для создания дискового образа и записи MBR
  • diskutil - для форматирования разделов в FAT16
  • hdiutil - для монтирования образов
  • fdisk (через fdisk_fdisk или gptfdisk из Homebrew)

Если вам нужен fdisk, установите его через Homebrew:

bash
brew install gptfdisk

Пошаговая инструкция для macOS

1. Создание пустого дискового образа

Сначала создайте пустой образ нужного размера. Для примера создадим образ размером 32 МБ:

bash
dd if=/dev/zero of=mydisk.img bs=1M count=32

2. Создание MBR с таблицей разделов

Теперь создадим MBR и таблицу разделов. В MBR мы определим один активный раздел FAT16:

bash
# Создаем MBR с активным разделом FAT16
(
echo "g"          # Создать GPT (для совместимости)
echo "n"          # Новый раздел
echo "1"          # Номер раздела
echo ""          # Начальный сектор (по умолчанию)
echo "+31M"      # Размер раздела
echo "t"          # Изменить тип раздела
echo "1"          # Выбрать раздел 1
echo "06"        # Тип FAT16 (0x06)
echo "a"          # Сделать раздел активным
echo "w"          # Записать изменения
echo "y"          # Подтвердить перезапись
) | fdisk mydisk.img

3. Копирование загрузчика в MBR

Теперь скопируйте ваш загрузчик в первый сектор диска:

bash
dd if=/Users/elisey/Downloads/OS/2/Bootloader of=mydisk.img conv=notrunc bs=512 count=1

4. Форматирование раздела в FAT16

Используйте diskutil для форматирования раздела в FAT16:

bash
# Подключите образ как устройство
diskutil attach mydisk.img

# Получите имя устройства (например /dev/disk4)
# Форматируем раздел в FAT16
diskutil partitiondisk /dev/disk4 1 MBR "MS-DOS FAT16" "MYDISK" 0B

# Отключаем устройство
diskutil detach /dev/disk4

5. Монтирование образа для добавления файлов

Смонтируйте образ, чтобы скопировать файлы:

bash
hdiutil attach mydisk.img

После этого файловая система FAT16 будет доступна как обычный том, куда можно копировать файлы.

Альтернативный метод для Linux

Если у вас есть доступ к Linux, процесс может быть проще:

1. Создание образа

bash
dd if=/dev/zero of=mydisk.img bs=1M count=32

2. Создание MBR и разделов

bash
# Создаем MBR с fdisk
(
echo "o"          # Создать пустую MBR таблицу
echo "n"          # Новый раздел
echo "p"          # Основной раздел
echo "1"          # Номер раздела
echo ""          # Начальный сектор
echo ""          # Конечный сектор (до конца диска)
echo "a"          # Сделать активным
echo "w"          # Записать
) | fdisk mydisk.img

3. Копирование загрузчика

bash
dd if=/Users/elisey/Downloads/OS/2/Bootloader of=mydisk.img conv=notrunc bs=512 count=1

4. Форматирование в FAT16

bash
# Определяем смещение раздела (обычно 2048 секторов по 512 байт)
OFFSET=1048576  # 2048 * 512

# Создаем loop устройство
sudo losetup -o $OFFSET --sizelimit $((31*1024*1024)) -f mydisk.img

# Форматируем в FAT16
sudo mkfs.vfat -F 16 /dev/loop0

# Монтируем
sudo mount /dev/loop0 /mnt

# Копируем файлы
sudo cp -r /path/to/your/files /mnt/

# Отмонтируем
sudo umount /dev/loop0
sudo losetup -d /dev/loop0

Настройка QEMU для загрузки

Для использования вашего образа в QEMU используйте следующую команду:

bash
qemu-system-x86_64 -drive file=mydisk.img,format=raw,if=ide -m 512M

Или для более точного симулирования:

bash
qemu-system-i386 -drive file=mydisk.img,format=raw,if=floppy -m 512M

Добавление файлов в образ

После создания образа вы можете добавлять файлы несколькими способами:

Через macOS:

bash
# Монтируем образ
hdiutil attach mydisk.img

# Копируем файлы в смонтированный том
cp -r /path/to/files /Volumes/MYDISK/

# Отмонтируем
hdiutil detach /Volumes/MYDISK

Через Linux:

bash
# Создаем loop устройство
sudo losetup -o 1048576 --sizelimit $((31*1024*1024)) -f mydisk.img

# Монтируем
sudo mount /dev/loop0 /mnt

# Копируем файлы
sudo cp -r /path/to/files /mnt/

# Отмонтируем
sudo umount /dev/loop0
sudo losetup -d /dev/loop0

Решение распространенных проблем

Проблема: QEMU не загружается из образа

Решение: Проверьте, что:

  • Загрузчик находится в первых 512 байтах образа
  • Раздел помечен как активный (флаг bootable)
  • В конце MBR есть сигнатура 0xAA55

Проверка MBR:

bash
# На macOS
diskutil info mydisk.img

# Или вручную
hexdump -C mydisk.img | tail -n 1
# Должны увидеть: 0003e000  aa 55 00 00 00 00 00 00 00 00 00 00 00 00 00 00  |.U.............|

Проблема: Файловая система не монтируется

Решение: Возможно, проблема с выравниванием разделов. Убедитесь, что раздел начинается с правильного сектора (обычно сектор 2048 для выравнивания по 4К):

bash
# Проверьте структуру разделов
fdisk -l mydisk.img

Проблема: Загрузчик не работает

Решение: Проверьте, что ваш загрузчик корректно скопирован и сохраняет структуру MBR. Загрузчик должен:

  • Быть ровно 512 байт
  • Содержать корректную сигнатуру в конце
  • Правильно обрабатывать прерывания BIOS

Подробная структура MBR и FAT16

Структура MBR (512 байт):

Байты 0-445: Код загрузчика
Байты 446-510: Таблица разделов (4 записи по 16 байт)
Байты 510-511: Сигнатура MBR (0xAA55)

Структура таблицы раздела (16 байт):

Байт 0: Активный флаг (0x80 для активного)
Байты 1-3: Начальный CHS
Байт 4: Тип раздела (0x06 для FAT16)
Байты 5-7: Конечный CHS
Байты 8-11: Начальный LBA
Байты 12-15: Размер раздела в секторах

Структура FAT16 загружаемого тома:

  1. MBR (512 байт) с вашим загрузчиком
  2. VBR (Volume Boot Record) - 512 байт, включая BPB (BIOS Parameter Block)
  3. Зарезервированные секторы - обычно 1 сектор
  4. Таблицы FAT (2 копии)
  5. Корневой каталог
  6. Область данных

Для создания полностью совместимого образа убедитесь, что ваш загрузчик сохраняет структуру MBR и правильно обрабатывает переход к коду в VBR при необходимости.


Источники

  1. Creating bootable FreeDOS DOS floppy diskette IMG file for V86 on OSX
  2. How to create SD card .img and add files to it in linux (fat16)?
  3. Bootable FAT16 Image - OSDev.org
  4. How do I create an MBR on a USB stick using DD command line tool
  5. Creating and using disk images mini-howto
  6. How To Create Disk Image on Mac OS X With dd Command
  7. Disk Images — QEMU documentation
  8. Booting from real (UEFI) disk image on QEMU

Заключение

Создание MBR-совместимого загрузчика для QEMU с FAT16 файловой системой на macOS — выполнимая задача с использованием стандартных утилит командной строки. Ключевые шаги включают:

  1. Создание пустого образа с помощью dd
  2. Настройку MBR и таблицы разделов через fdisk или diskutil
  3. Копирование загрузчика в первые 512 байт образа
  4. Форматирование раздела в FAT16 с помощью mkfs.vfat или diskutil
  5. Монтирование образа для добавления файлов

На macOS процесс немного сложнее из-за ограниченных встроенных инструментов, но полностью выполним. Для более удобной работы рекомендуется установить gptfdisk через Homebrew. При возникновении проблем с загрузкой проверьте корректность MBR-сигнатуры (0xAA55) и активного флага раздела.

Для экспериментов с загрузкой можно также рассмотреть использование более простых форматов, таких как гибридные образы или ISO, но MBR+FAT16 остается наиболее универсальным решением для загрузочных образов QEMU.