Questo è con grub-pc versione 1.98 + 20100804-5ubuntu3 (Maverick Meerkat).
Il programma di installazione di grub2 può essere installato su dispositivi di loopback, ma se si monta utilizzando il mapper di dispositivo, si confonderà e si crederà di avere uno schema LVM, fallendo misteriosamente con un reclamo su un'astrazione mancante.
Invece, dovresti configurare tu stesso il dispositivo di loopback per la partizione, con un nome che deve corrispondere al modello "/ dev / loop [0-9]", cioè senza alcun designatore di partizione alla fine:
kpartx -v -a /dev/loop0
losetup /dev/loop1 /dev/mapper/loop0p1
mount /dev/loop1 /mnt
(Si noti che se si desidera che grub-mkconfig / update-grub funzioni su questo volume, il loopback della partizione deve essere collegato al loopback del disco in / dev e non direttamente al file di immagine).
Dato che hai usato fdisk per partizionare l'immagine, hai una tabella delle partizioni in stile msdos (nota anche come etichetta) e avviati usando un BIOS. Oltre a inserire stage1 / boot.img nell'MBR, stage1.5 / core.img verrà inserito in un'area di incorporamento nello spazio non partizionato (!) Che segue subito, e ci deve essere spazio per questo.
Il trucco è ora di dire al programma di installazione grub2 attraverso una mappa del dispositivo come la configurazione del loopback verrà mappata alle unità BIOS nella macchina virtuale. (In grub1 legacy questo è stato fatto direttamente nella shell). Probabilmente stai pianificando di avviare questa immagine come primo disco, quindi immagino che la mappatura appropriata sarebbe:
mkdir -p /mnt/boot/grub
cat > /mnt/boot/grub/device.map <<EOF
(hd0) /dev/loop0
(hd0,1) /dev/loop1
EOF
Qui ho inserito la mappa del dispositivo nell'immagine del disco guest, in modo da poter generare il file di configurazione di avvio grub.cfg:
mount --bind /dev /mnt/dev
chroot /mnt grub-mkconfig -o /boot/grub/grub.cfg
(Attenzione che il post-installer del pacchetto grub-pc eseguirà un probe che sovrascrive la mappa del dispositivo (!), Quindi dovrai scriverlo dopo l' installazione ed eseguire tu stesso grub-mkconfig / update-grub).
Ora esegui il programma di installazione dall'host , indicando l'installazione guest:
grub-install --no-floppy --grub-mkdevicemap=/mnt/boot/grub/device.map --root-directory=/mnt /dev/loop0
Infine, smonta tutto ciò che è impostato qui prima di avviare qemu sulla tua immagine:
umount /mnt/dev
umount /mnt
losetup -d /dev/loop1
kpartx -v -d /dev/loop0