démarrer qemu / kvm directement à partir d'un système de fichiers

8

Après avoir utilisé Xen et ses pygrubpendant un certain temps, j'essaie maintenant de faire quelque chose de similaire avec KVM / qemu.

Fondamentalement, j'ai un volume logique LVM (bien que cela puisse aussi bien être un fichier) qui contient le système de fichiers racine d'une distribution Linux (pas de partitionnement, juste FS directement sur le disque) qui contient également un /boot/grub/grub.cfg, et j'aimerais pouvoir démarrer ça.

J'avais l'impression que le paquet grub-firmware-qemu sur Debian / Ubuntu était destiné à cela, mais je n'ai pas réussi à le faire fonctionner. AFAICT, l'image grub.bin contient un memdisk codé en dur avec un fichier grub.cfg avec quelques options de menu (comme rechercher un multiboot.img ou rechercher un grub.cfg), mais tout ce que j'obtiens lors de l'exécution kvm -bios grub.binest une "licence incompatible " Message d'erreur. Et je ne sais pas trop comment générer un autre grub.binavec un autre grub.cfg (un qui ne ferait que faire configfile (hd0)/boot/grub/grub.cfg).

Bien sûr, je pourrais créer une disquette ou un cdrom ou une image disque avec une configuration grub minimale qui fait exactement cela, mais j'ai le sentiment qu'il devrait y avoir une façon plus propre / canonique de le faire et mes recherches ont rapporté très peu loin.

Je suppose que l'on pourrait également utiliser l' -kerneloption de qemu , mais encore une fois, je ne sais pas comment générer un grub.imgpour cela. (l'utilisation d'un grub.img généré avec grub-mkimage -O i386-pc -o grub.img -c =(echo 'configfile (hd0)/boot/grub/grub.cfg') /usr/lib/grub/i386-pc/*.modaffiche à nouveau le même message d'erreur "licence incompatible").

C'est sur debian avec la version 1.99-23 des paquets grub et 1.1.2 + dfsg-2 de kvm / qemu.

Donc, en bref, comment dois-je créer un grub.bin (à utiliser avec kvm -bios) ou un grub.img (à utiliser avec kvm -kernel) pour que kvm démarre une image grub capable d'analyser le / boot / grub /grub.cfg sur le disque virtuel?

Stéphane Chazelas
la source

Réponses:

6

En l'occurrence, cela ressemble à un bogue dans le paquet Debian de grub.

L' -kernel grub.imgapproche fonctionne si j'inclus uniquement les modules grub dont j'ai besoin grub-mkimage.

Le -bios grub.bintravaille avec le paquet grub plus récent de experimental(2,00 à 7). Cependant, celui grub.binqui l'accompagne n'est pas très utile.

Il vient avec un memdiskqui vient avec le grub.cfg. Il aurait été préférable d'utiliser ce memdisk pour contenir les modules et grub.cfgêtre spécifié avec l' -coption de grub-mkimage. Par exemple, l'une des entrées de menu recherche /boot/grub/grub.cfget se trouve en conséquence dans le memdisk. De plus, le paquet debian n'inclut pas les modules qemu grub, donc vous ne pouvez pas construire un autre grub.bin (bien que vous puissiez éditer le fichier en binaire pour changer le grub.cfg) à moins que vous ne le fassiez à partir du paquet source.

L' -bios grub.binapproche me semble être l'approche la plus propre, mais j'utiliserai l' -kernelapproche or disquette jusqu'à ce que le paquet debian soit corrigé.

EDIT : eh bien, le ata.modmodule grub pour lire les disques IDE émulés est beaucoup plus lent que l'utilisation biosdisk.moden combinaison avec seabios(le BIOS par défaut lorsqu'il n'est pas utilisé -bios grub.bin). De plus, il semble que le firmware grub ne supporte pas les disques virtio-blk ni virtio-scsi, donc ça kvm -bios grub.binne sera pas une option pour moi.

Au cas où quelqu'un voudrait emprunter ce chemin, j'utilise maintenant (syntaxe zsh):

grub-mkimage -O i386-pc -c =(print -l serial 'terminal_input serial' \
  'terminal_output serial' 'set prefix=(hd0)/boot/grub' '. grub.cfg') -o grub.img \
  at_keyboard configfile biosdisk ext2 linux test serial halt minicmd terminal cat

Et -kernel grub.img -nographicpassé à kvm. C'est pour démarrer des machines virtuelles Linux sans graphiques (uniquement une interface série, alors assurez-vous que le grub de la machine virtuelle est configuré pour utiliser en série (ou du moins pas configuré pour utiliser des graphiques), que la console du noyau passe à ttyS0 et que vous exécutez un Getty là-bas). Il peut facilement être adapté pour fonctionner également sur les consoles VGA.

Stéphane Chazelas
la source
2

Après beaucoup de navigation sur le Web, je n'ai trouvé aucune solution et j'ai créé un wrapper pour pygrub à utiliser avec libvirt / kvm.

Peut-être que cette solution vous est utile, même tard, alors j'aimerais la partager. C'est un script de hook libvirt. Le script analyse la configuration du domaine lors de l'événement prepare / begin, permet à pygrub de trouver le noyau à travers les disques disponibles, puis de copier les images dans le dossier souhaité de l'hôte.

Jetez un œil sur github.com/baquilla/pygrub-kvm-wrapper .

Juan Javier Baca
la source