Как установить grub в файл .img?


26

Я сделал следующее:

  1. создал пустой файл .img с помощью dd
  2. связал его с / dev / loop0 с losttup
  3. создал раздел в нем с помощью fdisk
  4. отформатировал такой раздел с помощью mke2fs
  5. скопировал пользовательскую систему GNU / Linux в этот раздел

Теперь я хотел бы сделать файл .img загрузочным, установив grub в каталог MBR и / boot. Моя цель - загрузить файл .img с помощью qemu. Было бы лучше, если бы grub2 использовался вместо grub legacy.

Спасибо.


Ответы:


24

Это с grub-pc версии 1.98 + 20100804-5ubuntu3 (Maverick Meerkat).

Установщик grub2 может устанавливать на устройства с обратной связью, но если вы монтируете его с помощью устройства отображения карт, он запутается и поверит в то, что у вас есть схема LVM, таинственно провалившаяся с жалобой на отсутствующую абстракцию.

Вместо этого вам следует самостоятельно настроить петлевое устройство для раздела с именем, которое должно соответствовать шаблону "/ dev / loop [0-9]", т.е. без какого-либо обозначения раздела в конце:

kpartx -v -a /dev/loop0
losetup /dev/loop1 /dev/mapper/loop0p1
mount /dev/loop1 /mnt

(Обратите внимание, что если вы хотите, чтобы grub-mkconfig / update-grub работал на этом томе, то петлевой раздел должен быть подключен к петле диска на / dev, а не напрямую к файлу образа).

Поскольку вы использовали fdisk для разбиения образа, у вас есть таблица разделов в стиле msdos (она же метка) и загружаетесь с помощью BIOS. В дополнение к помещению stage1 / boot.img в MBR, stage1.5 / core.img будет помещен в область встраивания в неразмеченное пространство (!) Сразу после него, и для этого должно быть место.

Теперь хитрость заключается в том, чтобы через установщик устройства сообщить установщику grub2, как ваши настройки loopback будут сопоставляться с дисками BIOS на виртуальной машине. (В grub1 legacy это было сделано прямо в оболочке). Вы, вероятно, планируете загрузить этот образ как первый диск, поэтому я думаю, что соответствующее сопоставление будет:

mkdir -p /mnt/boot/grub
cat > /mnt/boot/grub/device.map <<EOF
(hd0)   /dev/loop0
(hd0,1) /dev/loop1
EOF

Здесь я поместил карту устройства в образ гостевого диска, чтобы вы могли сгенерировать загрузочный конфигурационный файл grub.cfg:

mount --bind /dev /mnt/dev
chroot /mnt grub-mkconfig -o /boot/grub/grub.cfg

(Помните, что после установки пакета grub-pc будет запущен зонд, который перезаписывает карту устройства (!), Поэтому вам придется написать его после установки и запустить grub-mkconfig / update-grub самостоятельно).

Теперь запустите установщик с хоста , указав на гостевую установку:

grub-install --no-floppy --grub-mkdevicemap=/mnt/boot/grub/device.map --root-directory=/mnt /dev/loop0

Наконец, размонтируйте все, что настроено здесь, перед запуском qemu на вашем изображении:

umount /mnt/dev
umount /mnt
losetup -d /dev/loop1
kpartx -v -d /dev/loop0

Вот Это Да! Я просто натолкнулся на ваш ответ, пытаясь понять, почему я не могу обновить-закрепить зацикленный файл изображения. Я собираюсь посмотреть, может ли это быть применимо к моей проблеме, но это определенно интересная трасса, и она того стоит. Благодарность!
filofel

1
Хороший ответ, к сожалению, chroot /mnt grub-mkconfig -o /boot/grub/grub.cfgне получается, потому grub-mkconfigчто на диске .img нет или какой-либо двоичный файл, и /mntон уже смонтирован. Было бы здорово, если бы вы пошли по шагам и написали все детали / команды.
Флавий

@RolKau: спасибо за отличную документацию! Вместе с приведенными ниже модификациями toh он решил многие проблемы, которые у меня были в течение многих лет с grub при встраивании из среды chroot.
sparkie

1
losetup -Pэто еще один хороший способ монтирования отдельного раздела: stackoverflow.com/a/15200862/895245
Сиро Сантилли,

Я получаю: /usr/sbin/grub-probe: warning: the device.map entry 'hd0,1' is invalid. Ignoring it. Please correct or delete your device.map.так что этот ответ бесполезен.
Кальмариус

11

Большое спасибо за эти объяснения. Я интегрировал ваше решение в свои собственные сценарии со следующими изменениями (переведенными в ваши обозначения / переменные):

modprobe dm_mod
kpartx -va /root/rootfs.img # *.img is setup elsewhere
# normally you now would mount /dev/loop0p1 directly. BUT
# grub specialists didn't manage to work with loop partitions other than /dev/loop[0-9]
losetup -v -f --show /dev/mapper/loop0p1
mount /dev/loop1 /mnt
mkdir -p /mnt/boot/grub

# change into chrooted environment. all remaining work will be done from here. this differs from the howto above.
LANG=C chroot /mnt /bin/bash
set -o vi
mount -t sysfs sysfs /sys
mount -t proc  proc  /proc
# avoid grub asking questions
cat << ! | debconf-set-selections -v
grub2   grub2/linux_cmdline                select   
grub2   grub2/linux_cmdline_default        select   
grub-pc grub-pc/install_devices_empty      select yes
grub-pc grub-pc/install_devices            select   
!
apt-get -y install grub-pc
# don't setup device.map prior to this point. It will be overwritten by grub-pc install
#corrected the /mnt/boot/grub/device.map to /boot/grub/device.map
cat > /boot/grub/device.map << !
(hd0)   /dev/loop0
(hd0,1) /dev/loop1
!
# install here to fill /boot/grub for grub-mkconfig (update-grub)
grub-install /dev/loop0
# generate /boot/grub/grub.cfg
update-grub

это работает по крайней мере на сжатие Debian. Проверьте правильность /boot/grub/grub.cfg.


1
Должно cat > /mnt/boot/grub/device.mapбыть сделано в изолированной среде? Если так, путь должен быть /boot/grub/device.map.
cbliard

0

Вот краткое руководство по установке и загрузке GRUB вручную в образ диска QEMU. Я не перешел к следующему шагу с grub.cfg, но полагаю, что это довольно просто после завершения основной настройки.

Предположения:

  • «grub-install --version» - это «grub-install (GRUB) 2.02 ~ beta2-36ubuntu3.2»
  • qemu-system-x86_64 --version - это «Эмулятор QEMU версии 2.5.0 (Debian 1: 2.5 + dfsg-5ubuntu10.6), Copyright (c) 2003-2008 Fabrice Bellard»
  • Образ диска с именем «disk1» в текущем каталоге
  • / dev / loop0 имеет «Тип метки диска: dos» (т.е. с fdisk)
  • / dev / loop0p1 - загрузочный раздел, уже отформатированный с помощью ext4

Вот как я загрузил qemu в меню GRUB:

    # losetup -fP disk1
    # ls /dev/loop0*
    /dev/loop0  /dev/loop0p1  /dev/loop0p2  /dev/loop0p3
    # mount /dev/loop0p1 /mnt
    # cat > loop0device.map <<EOF
    (hd0) /dev/loop0
    EOF
    # grub-install --no-floppy --grub-mkdevicemap=loop0device.map \
    --modules="part_msdos" --boot-directory=/mnt /dev/loop0 -v
    # umount /mnt
    # losetup -d /dev/loop0
    # qemu-system-x86_64 -m 512 -curses -hda disk1 -enable-kvm

Затем появляется оболочка GRUB:

                        GNU GRUB  version 2.02~beta2-36ubuntu3.2

       Minimal BASH-like line editing is supported. For the first word, TAB
       lists possible command completions. Anywhere else TAB lists possible
       device or file completions.


    grub> ls
    (hd0) (hd0,msdos3) (hd0,msdos2) (hd0,msdos1) (fd0)
    grub>

Если вы скопировали ядро ​​и ram-диск в / dev / loop0p1, вы можете загрузить его:

    grub> linux (hd0,msdos1)/vmlinuz
    grub> initrd (hd0,msdos1)/initrd
    grub> boot

А вот оболочка Linux по умолчанию (потому что в этом случае / sbin / init не было)

    BusyBox v1.22.1 (Ubuntu 1:1.22.0-15ubuntu1) built-in shell (ash)
    Enter 'help' for a list of built-in commands.

    (initramfs)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.