6

Я пытаюсь создать дистрибутивный образ (с помощью команды dd Linux) для ОС, которая будет работать с жесткими дисками и флеш-носителями. Я успешно создал образ, но не могу загрузить его правильно. Я буду макет шагов ниже:

  1. Это создаст пустой файл для хранения всего изображения:

    dd if=/dev/zero of=/tmp/test.img bs=512 count=1250000
    
  2. Связывает файл устройства обратной связи с файлом изображения:

    losetup /dev/loop0 /tmp/test.img
    
  3. Прежде чем мы сможем манипулировать с parted мы ДОЛЖНЫ определить тип метки носителя:

    parted -s /dev/loop0 mklabel msdos
    
  4. Сделайте первый раздел 512MB в файле образа:

    parted -s -a opt /dev/loop0 mkpart primary ext2 '0%' 512MB
    
  5. Установите первый раздел как «загрузочный»:

    parted -s /dev/loop0 set 1 boot on
    
  6. Создает файловую систему Ext2 в первом разделе:

    mkfs.ext2 -b 1024 /dev/loop0p1
    
  7. Устанавливает stage1 кода начальной загрузки grub, сохраняя созданную выше таблицу разделов:

    dd if=/boot/grub/stage1 of=/dev/loop0 bs=446 count=1
    
  8. Устанавливает stage2 кода начальной загрузки grub после первых 512 байт носителя (пропуская stage1 и таблицу разделов):

    dd if=/boot/grub/stage2 of=/dev/loop0 bs=512 seek=1
    
  9. Смонтируйте первый раздел файла образа в точку монтирования:

    mount /dev/loop0p1 /mnt/image
    
  10. Скопируйте все данные в раздел и размонтируйте.

  11. dd файл изображения на любой жесткий диск или флэш-носитель.

Используя эти шаги, я могу dd файл образа на жесткий диск или флэш-диск и загрузиться в устаревшую консоль grub, где я могу загрузиться, но только указав значения root , kernel и initrd . Если я пытаюсь установить grub legacy с помощью команд root и setup , я не получаю никаких ошибок, но устройство загружается с ошибками. Запуск и fdisk -l производит:

Partition 1 has different physical/logical beginnings (non-Linux?):
phys(0,32,33) logical(0,37,14)
Partition 1 has different physical/logical endings:
phys(62,53,55) logical(336,27,19)

Я думаю, что есть проблема с тем, как создается файл изображения, так как он отвечает за создание (испорченной) таблицы разделов. Кто-нибудь может использовать эти (модифицированные) шаги для создания работающего загрузочного носителя?

1 ответ1

1
  1. Сделайте первый раздел 512MB в файле образа

    parted -s -a opt /dev/loop0 mkpart primary ext2 '0%' 512MB

На шаге 4 вы используете утилиту для изменения первой записи таблицы разделов, которая находится в конце сектора / блока, который также содержит загрузчик MBR.

  1. Устанавливает stage1 кода начальной загрузки grub, сохраняя созданную выше таблицу разделов:

    dd if=/boot/grub/stage1 of=/dev/loop0 bs=446 count=1

На шаге 7 вы пытаетесь установить загрузчик в первый сектор / блок, который уже содержит недействительную таблицу разделов.
Но dd - это утилита переноса блоков, которая читает блоки из источника и записывает эти блоки в место назначения.

В этом случае устройством назначения является жесткий диск или твердотельный накопитель, который предположительно основан на 512-(или 4096) -байтных секторах. Операция чтения или записи на блочном устройстве должна выполняться для всего сектора.
При попытке "короткой" записи только 446 байтов контроллер диска (или ОС) обязуется, но добавляет 66 (или 3650) байтов нулей, чтобы заполнить сектор до его правильной / полной длины.
Блочная запись просто не предназначена для частичной модификации сектора и сохранения "неписаной части".

Следовательно, эта операция записи перезапишет ранее установленную таблицу разделов.

Простым решением является выполнение шага № 7 перед шагом № 4. Это запишет весь сектор MBR с пустой таблицей разделов, а затем отредактирует только одну запись.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .