web-dev-qa-db-fra.com

Comment installer Grub dans un fichier .IMG?

J'ai fait ce qui suit:

  1. créé un fichier .IMG vide avec DD
  2. l'associé à/dev/loop0 avec perutup
  3. créé une partition en elle avec fdisk
  4. formaté cette partition avec mke2fs
  5. copié un système GNU/Linux personnalisé dans cette partition

Maintenant, je voudrais faire le fichier .IMG amorçable en installant Grub dans son répertoire MBR et/Boot. Mon objectif est de charger le fichier .IMG avec qemu. Il serait préférable que GRUB2 soit utilisé à la place de l'héritage de GRUB.

Merci.

26
Francesco Turco

Ceci est avec Grub-PC version 1.98 + 20100804-5ubuntu3 (Maverick Meerkat).

L'installateur GRUB2 peut s'installer sur des périphériques de bouclage, mais si vous montez à l'aide du mappeur de périphérique, il sera confus et croire que vous avez un schéma LVM, échouant mystérieusement avec une plainte d'une abstraction manquante.

Au lieu de cela, vous devez configurer le périphérique de bouclage pour la partition vous-même, avec un nom qui DOI correspondre au modèle "/ dev/boucle [0-9]", c'est-à-dire sans aucun concepteur de partition à la fin:

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

(Notez que si vous souhaitez que Grub-mkconfig/update-grub fonctionne sur ce volume, le bouclage de la partition doit être connecté au bord de disque sous/dev, et non directement au fichier image).

Étant donné que vous avez utilisé FDISK pour partitionner l'image, vous avez un MSDOS - Table de partition de style (étiquette AKA) et démarrez à l'aide d'un BIOS. En plus de mettre le stade1/boot.img dans le MBR, le stade1.5/core.img sera placé dans une zone d'intégration dans l'espace non privilégié (!) Après juste après, et il doit y avoir de l'espace pour cela.

L'astuce consiste maintenant à indiquer à l'installateur GRUB2 via une carte de périphérique comment votre configuration de bouclage planera dans la machine BIOS dans la machine virtuelle. (Dans Grub1 Héritage, cela a été fait directement dans la coquille). Vous envisagez probablement de démarrer cette image comme premier disque, alors je suppose que la cartographie appropriée serait:

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

Ici, j'ai mis la carte de périphérique dans l'image du disque d'invité, de sorte que vous puissiez générer le fichier de configuration de démarrage Grub.cfg:

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

(Méfiez-vous que le post-installateur du package de Grub-PC exécutera une sonde qui écrase la carte de périphérique (!), Vous devrez donc l'écrire après Installation et exécution grub-mkconfig/update -Prub toi-même).

Maintenant, exécutez l'installateur à partir du hôte, pointant vers l'installation invité:

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

Enfin, tout démontez-vous ici avant de commencer QEMU sur votre image:

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

merci beaucoup pour ces explications. J'ai intégré votre solution dans mes propres scripts avec des modifications suivantes (traduites de votre notation/variables):

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

cela fonctionne au moins sur Squeeze Debian. Vérifiez '/boot/grUB/grUB.cfg' pour l'exactitude.

11
toh

Voici une promenade rapide sur la façon d'installer et de démarrer GRUB manuellement dans une image de disque QEMU. Je ne l'ai pas emmené à la prochaine étape avec un grub.cfg, mais je suppose que c'est joli simple une fois cette configuration principale terminée.

Hypothèses:

  • "grub-installer" est "grub-installer (grub) 2.02 ~ beta2-36ubuntu3.2"
  • 'qemu-system-x86_64 --version' est "QEMU Emulator version 2.5.0 (Debian 1: 2.5 + DFSG-5UBUNTU10.6), Copyright (C) 2003-2008 Fabrice Bellard"
  • Une image de disque nommée "Disk1" dans le répertoire actuel
  • / dev/loop0 a "type disklabel: dos" (c'est-à-dire avec fdisk)
  • / dev/loop0p1 est une partition amorçable, déjà formée avec EXT4

C'est ainsi que j'ai démarré qemu dans le GRUB menu:

    # 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

Ensuite, le GRUB Shell arrive:

                        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>

Si vous aviez copié un kernel et un disque RAM sur/dev/loop0p1, vous pouvez le démarrer:

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

Et voici la coque Linux par défaut (car aucun/sbin/init était disponible dans ce cas)

    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
Beau Harder