Как создать 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
- Альтернативный метод для Linux
- Настройка QEMU для загрузки
- Добавление файлов в образ
- Решение распространенных проблем
- Подробная структура MBR и FAT16
Необходимые инструменты для macOS
На macOS у вас уже есть все необходимые инструменты для создания загрузочного MBR-образа с FAT16:
dd- для создания дискового образа и записи MBRdiskutil- для форматирования разделов в FAT16hdiutil- для монтирования образовfdisk(черезfdisk_fdiskилиgptfdiskиз Homebrew)
Если вам нужен fdisk, установите его через Homebrew:
brew install gptfdisk
Пошаговая инструкция для macOS
1. Создание пустого дискового образа
Сначала создайте пустой образ нужного размера. Для примера создадим образ размером 32 МБ:
dd if=/dev/zero of=mydisk.img bs=1M count=32
2. Создание MBR с таблицей разделов
Теперь создадим MBR и таблицу разделов. В MBR мы определим один активный раздел FAT16:
# Создаем 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
Теперь скопируйте ваш загрузчик в первый сектор диска:
dd if=/Users/elisey/Downloads/OS/2/Bootloader of=mydisk.img conv=notrunc bs=512 count=1
4. Форматирование раздела в FAT16
Используйте diskutil для форматирования раздела в FAT16:
# Подключите образ как устройство
diskutil attach mydisk.img
# Получите имя устройства (например /dev/disk4)
# Форматируем раздел в FAT16
diskutil partitiondisk /dev/disk4 1 MBR "MS-DOS FAT16" "MYDISK" 0B
# Отключаем устройство
diskutil detach /dev/disk4
5. Монтирование образа для добавления файлов
Смонтируйте образ, чтобы скопировать файлы:
hdiutil attach mydisk.img
После этого файловая система FAT16 будет доступна как обычный том, куда можно копировать файлы.
Альтернативный метод для Linux
Если у вас есть доступ к Linux, процесс может быть проще:
1. Создание образа
dd if=/dev/zero of=mydisk.img bs=1M count=32
2. Создание MBR и разделов
# Создаем MBR с fdisk
(
echo "o" # Создать пустую MBR таблицу
echo "n" # Новый раздел
echo "p" # Основной раздел
echo "1" # Номер раздела
echo "" # Начальный сектор
echo "" # Конечный сектор (до конца диска)
echo "a" # Сделать активным
echo "w" # Записать
) | fdisk mydisk.img
3. Копирование загрузчика
dd if=/Users/elisey/Downloads/OS/2/Bootloader of=mydisk.img conv=notrunc bs=512 count=1
4. Форматирование в FAT16
# Определяем смещение раздела (обычно 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 используйте следующую команду:
qemu-system-x86_64 -drive file=mydisk.img,format=raw,if=ide -m 512M
Или для более точного симулирования:
qemu-system-i386 -drive file=mydisk.img,format=raw,if=floppy -m 512M
Добавление файлов в образ
После создания образа вы можете добавлять файлы несколькими способами:
Через macOS:
# Монтируем образ
hdiutil attach mydisk.img
# Копируем файлы в смонтированный том
cp -r /path/to/files /Volumes/MYDISK/
# Отмонтируем
hdiutil detach /Volumes/MYDISK
Через Linux:
# Создаем 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:
# На 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К):
# Проверьте структуру разделов
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 загружаемого тома:
- MBR (512 байт) с вашим загрузчиком
- VBR (Volume Boot Record) - 512 байт, включая BPB (BIOS Parameter Block)
- Зарезервированные секторы - обычно 1 сектор
- Таблицы FAT (2 копии)
- Корневой каталог
- Область данных
Для создания полностью совместимого образа убедитесь, что ваш загрузчик сохраняет структуру MBR и правильно обрабатывает переход к коду в VBR при необходимости.
Источники
- Creating bootable FreeDOS DOS floppy diskette IMG file for V86 on OSX
- How to create SD card .img and add files to it in linux (fat16)?
- Bootable FAT16 Image - OSDev.org
- How do I create an MBR on a USB stick using DD command line tool
- Creating and using disk images mini-howto
- How To Create Disk Image on Mac OS X With dd Command
- Disk Images — QEMU documentation
- Booting from real (UEFI) disk image on QEMU
Заключение
Создание MBR-совместимого загрузчика для QEMU с FAT16 файловой системой на macOS — выполнимая задача с использованием стандартных утилит командной строки. Ключевые шаги включают:
- Создание пустого образа с помощью
dd - Настройку MBR и таблицы разделов через
fdiskилиdiskutil - Копирование загрузчика в первые 512 байт образа
- Форматирование раздела в FAT16 с помощью
mkfs.vfatилиdiskutil - Монтирование образа для добавления файлов
На macOS процесс немного сложнее из-за ограниченных встроенных инструментов, но полностью выполним. Для более удобной работы рекомендуется установить gptfdisk через Homebrew. При возникновении проблем с загрузкой проверьте корректность MBR-сигнатуры (0xAA55) и активного флага раздела.
Для экспериментов с загрузкой можно также рассмотреть использование более простых форматов, таких как гибридные образы или ISO, но MBR+FAT16 остается наиболее универсальным решением для загрузочных образов QEMU.