J'ai fait ce qui suit:
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.
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
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.
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:
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)