6

Я скопировал ISO-файл в раздел (т.е. dd if = isofile of =/dev/sdb1). Как я могу загрузиться в этот раздел через GRUB?

Когда я пытаюсь просто с chainloader (hd1,0)+1, он говорит неизвестный исполняемый формат.

2 ответа2

3

Смотрите мой ответ на ваш вопрос загрузки из ISO-файлов. Используя это в качестве отправной точки, я провел несколько тестов со старым жестким диском. Ранее я настроил Grub2 для загрузки флешки с несколькими ISO , поэтому я сделал следующее:

  1. Создайте пару разделов на старом жестком диске. Это было сделано с помощью адаптера USB-IDE, поэтому диск отображается как /dev /sdb.

    • Раздел 1: FAT32, размер ~ 2 ГБ
    • Раздел 2: неформатированный


  2. Смонтировал первый раздел в /mnt и установил копию Grub из моей системы на диск:

    sudo grub-install --no-floppy --root-directory=/mnt /dev/sdb
    


  3. "Сгорел" ISO до второго раздела:

    sudo dd if=avg.iso /dev/sdb2
    


  4. Это вирус-сканер AVG ISO; на моей флешке с несколькими ISO я использую это для прямой загрузки ISO:

    menuentry "AVG Rescue CD" {
       loopback loop /iso/avg.iso
       linux (loop)/isolinux/vmlinuz max_loop=255 vga=791 init=linuxrc iso-scan/filename=/iso/avg.iso
       initrd (loop)/isolinux/initrd.lzm
    }
    

    Чтобы сделать это с раздела жесткого диска, нам нужно отменить команду loopback и установить корневое устройство и тому подобное. Все мои попытки заставить Grub2 автоматически обнаружить корневое устройство не увенчались успехом, поэтому я указал его непосредственно на раздел. Это работает, но следите за перечислением устройств Grub; диск, с которого вы пытаетесь загрузиться, может не быть (hd0). Вот рабочая запись для раздела ISO:

    menuentry "AVG Rescue CD" {
       linux (hd0,2)/isolinux/vmlinuz max_loop=255 vga=791 init=linuxrc
       initrd (hd0,2)/isolinux/initrd.lzm
    }
    

    Это приводит к загрузочному ISO-разделу.

Это работает, потому что Grub2 может читать файловые системы ISO9660, потому что этот конкретный ISO загружает ОС, которая может справиться с ISO в разделе, и потому что практически все, что загружает ядро, находится в initrd.


Если вы используете Grub4DOS или Grub 1, вы можете использовать аналогичный трюк с загрузчиком цепей. Предполагая, что это работает для загрузки Win7 ISO напрямую (источник):

title Windows 7
  map (hd0,0)/win7.iso (hd32)
  map --hook
  chainloader (hd32)

Вам может повезти с этой модификацией (при условии, что вы "записали" ISO во второй основной раздел (hd0,1); в противном случае замените соответствующий раздел):

title Windows 7
  map (hd0,1) (hd32)
  map --hook
  chainloader (hd32)

Вы также можете сойти с рук с этим:

title Windows 7
  chainloader (hd0,1)

Однако ISO не настроен на загрузку с диска, поэтому вы можете столкнуться с другими проблемами.

1

Вот как я смог сделать это с помощью Grub4DOS (последняя официальная сборка):

Grub4DOS может загружать ISO-образы, поэтому он должен быть в состоянии сделать это для разделов.
Мы бы хотели отобразить раздел iso на новый диск и загрузиться с него:

title Boot ISO Partition
    map (hd0,7) (0xff)
    map --hook
    chainloader (0xff)

Но это не работает, весь диск отображается.

К счастью, map может принять «файл или блок-лист» в качестве первого аргумента.

  1. Узнайте, сколько блоков занимает ваш раздел:

    $ sudo fdisk -l /dev/sda
    ...
       Device Boot      Start         End      Blocks   Id  System
    /dev/sda8            5948        6087     1124518+   b  W95 FAT32
    

    Я создал раздел 1.1Gb, поэтому мне нужно использовать 1124518 * 2 = 2249036 здесь.
    (технически это 2249037, но это не имеет значения)

  2. Теперь передайте блок-лист grub:

    title Boot ISO Partition
        map --heads=0 --sectors-per-track=0 (hd0,7)0+2249036 (0xff)
        map --hook
        chainloader (0xff)
    

    И это работает!

Заметки:

  • Если вы укажете неправильный размер, grub его поймает (команда map выйдет за пределы раздела).
    Если он слишком маленький, он, скорее всего, не загрузится.
  • Можно также использовать (hd32) вместо (0xff) .
  • Не пробовал версию 4.5b, проблема может быть решена там.

Чтобы загрузить Grub4DOS из Grub2:

menuentry "Boot ISO Partition" {
        root (hd0,1)
        set opts='map --heads=0 --sectors-per-track=0 (hd0,7)0+2249036 (0xff);
                  map --hook;
                  chainloader (0xff) '
        linux16 /boot/grub4dos/grub.exe --config-file=$opts
}

Добавьте это в /boot/grub/grub.cfg (или лучше /etc/grub.d/40_custom).
(при условии grub.exe в /boot/grub4dos на первом разделе)


Вывод: это действительно круто.

  • Цепная загрузка в isolinux / любой загрузчик, который использует образ,
    таким образом, опыт загрузки точно такой же, как у cd или usb флешки.
  • Все, что вам нужно сделать, чтобы попробовать новый iso, это поместить его в раздел и перезагрузиться.
  • Быстрее, чем USB (особенно с SSD!) и более эффективный, чем циклический монтаж iso (isos на основе Ubuntu).
  • Изображение не должно быть прочитано с диска как с memdisk.

Это должно работать с любым гибридным ISO. Прекрасно работает с живыми образами ubuntu и другими Linux-системами, так как им удается найти свои файлы в разделе iso9660. Все в реальном режиме (DOS) тоже должно быть хорошо. Windows isos не сможет справиться.

Гудзин может сделать это также между прочим.

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