Wie grub in eine installieren.img-Datei?

Ich habe Folgendes getan:

  1. erstellt eine leere .img-Datei mit dd -
  2. verknüpft es mit/dev / loop0 mit losetup
  3. erstellt eine Partition in ihm mit fdisk
  4. formatierte solche Partition mit mke2fs
  5. kopierte ein benutzerdefiniertes GNU / Linux-System in diese Partition

Jetzt möchte ich die machen .img-Datei bootfähig durch die Installation von grub in seine MBR und / Boot-Verzeichnis. Mein Ziel ist es, die zu laden .img-Datei mit qemu. Es wäre besser, wenn grub2 ist anstelle von grub legacy.

Dank.

 27
Author: Francesco Turco, 2010-04-14

3 answers

Dies ist mit grub-pc-version 1.98+20100804-5ubuntu3 (Maverick Meerkat).

Das grub2-Installationsprogramm kann auf Loopback-Geräten installiert werden, aber wenn Sie den Device Mapper verwenden, wird es verwirrt und glaubt, dass Sie ein LVM-Schema haben, das auf mysteriöse Weise mit einer Beschwerde über eine fehlende Abstraktion fehlschlägt.

Stattdessen sollten Sie das Loopback-Gerät für die Partition selbst einrichten, mit einem Namen, der muss mit dem Muster "/dev/loop[0-9] " übereinstimmen, dh ohne Partition bezeichner am Ende:

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

(Beachten Sie, dass grub-mkconfig / update-grub damit arbeiten soll volume, dann muss das Partitions-Loopback mit dem Festplatten-Loopback unter /dev und nicht direkt mit der Image-Datei verbunden sein).

Da Sie fdisk verwendet haben, um das Image zu partitionieren, haben Sie eine msdos -Stil Partitionstabelle (auch bekannt als label), und booten Sie mit einem BIOS. Zusätzlich zum Setzen der stage1 / Boot.img in der MBR, die stage1. 5 / core.img wird in eine Einbettungsbereich in unpartitionierten Raum (!) gleich danach folgen, und dafür muss Platz sein.

Der Trick besteht nun darin, dem grub2-Installationsprogramm über eine Gerätezuordnung mitzuteilen, wie Ihr Loopback-Setup BIOS-Laufwerken in der virtuellen Maschine zugeordnet wird. (In grub1 Legacy wurde dies direkt in der Shell gemacht). Sie planen wahrscheinlich, dieses Image als erste Festplatte zu booten, also denke ich, dass die entsprechende Zuordnung wäre:

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

Hier habe ich die Gerätekarte in die Gastdiskette gelegt image, damit Sie die Bootkonfigurationsdatei grub generieren können.cfg:

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

(Beachten Sie, dass der Post-Installer des grub-pc-Pakets eine sonde, die die Gerätekarte überschreibt(!), so müssen Sie es schreiben nach installation und ausführen von grub-mkconfig/update-grub sich selbst).

Führen Sie nun das Installationsprogramm vom Host aus und zeigen Sie auf die Gastinstallation:

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

Schließlich, unmount alles hier eingerichtet, bevor Sie qemu auf Ihrem image:

umount /mnt/dev
umount /mnt
losetup -d /dev/loop1
kpartx -v -d /dev/loop0
 25
Author: RolKau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2010-10-17 18:48:26

Vielen Dank für diese Erklärungen. Ich habe Ihre Lösung mit folgenden Änderungen in meine eigenen Skripte integriert (übersetzt in Ihre Notation/ Variablen):

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

Dies funktioniert zumindest auf debian squeeze. Überprüfen Sie ' / boot/grub / grub.cfg' für die Richtigkeit.

 11
Author: toh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2014-10-12 21:58:59

Hier ist eine kurze Anleitung zum manuellen Installieren und Booten von GRUB in QEMU-disk-image. Ich habe es nicht mit einem zum nächsten Schritt gebracht grub.cfg, aber ich nehme an, das ist ziemlich einfach, sobald dieses Haupt-Setup ist abgeschlossen.

Annahmen:

  • 'grub-install --version' ist "grub-install (GRUB) 2.02~beta2-grubuntu3. 2"
  • "qemu-system-x86_64 --version" ist "QEMU emulator version 2.5.0 (Debian 1:2.5+dfsg-5ubuntu10.6), Copyright (c) 2003-2008 Fabrice Bellard"
  • Ein Disk-Image mit dem Namen "disk1" im aktuellen Verzeichnis
  • / dev / loop0 hat "Disklabel type: dos" (dh mit fdisk)
  • / dev / loop0p1 ist eine bootfähige Partition, die bereits mit ext4

So habe ich qemu in das GRUB-Menü gebootet:

    # 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

Dann kommt die GRUB-Shell:

                        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>

Wenn Sie eine Kernel-und RAM-Diskette nach /dev/loop0p1 kopiert hätten, könnten Sie sie booten:

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

Und hier ist die Standard-Linux-Shell (weil in diesem Fall kein /sbin/init verfügbar war)

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

    (initramfs)
 0
Author: Beau Harder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2016-12-20 21:53:52