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


26

Я зробив наступне:

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

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

Спасибі.


Відповіді:


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 (aka label) та завантажуйтесь за допомогою BIOS. На додаток до розміщення stage1 / boot.img в MBR, stage1.5 / core.img буде розміщений у зоні вбудовування в нерозподіленому просторі (!), Слідом за ним, і для цього має бути місце.

Підступність полягає в тому, щоб повідомити інсталятору grub2 через карту пристрою, як ваша установка циклу відображатиметься на дисках BIOS у віртуальній машині. (У спадщині grub1 це було зроблено безпосередньо в оболонці). Ви, напевно, плануєте завантажувати це зображення як перший диск, тому, мабуть, відповідне відображення було б:

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

Оце Так! Я просто наткнувся на вашу відповідь, намагаючись зрозуміти, чому я не міг оновити-grub файл із зображеннями з петелькою, закріпленим на монтажі. Я буду бачити, чи це може стосуватися моєї проблеми, але це, безумовно, цікавий трек і дуже вартий моїх результатів. Спасибі!
філофель

1
Приємна відповідь, на жаль, chroot /mnt grub-mkconfig -o /boot/grub/grub.cfgне вдається, оскільки grub-mkconfigна диску .img немає жодної бінарної для цього питання, і /mntвона вже встановлена. Було б чудово, якби ви зробили це крок за кроком і записали всі деталі / команди.
Флавій

@RolKau: дякую за чудову документацію! Разом із модифікаціями toh нижче він вирішив багато питань, які у мене були роками з grub при вкладанні з хронізованих середовищ.
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 має "Тип Disklabel: 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.