qemu / kvm direkt von einem Dateisystem booten

8

Nachdem ich Xen und seine pygrubProdukte eine Weile verwendet habe, versuche ich jetzt, mit KVM / qemu etwas Ähnliches zu tun.

Grundsätzlich habe ich ein logisches LVM-Volume (obwohl dies auch eine Datei sein könnte), das das Root-Dateisystem einer Linux-Distribution enthält (keine Partitionierung, nur FS direkt auf der Festplatte), das auch eine /boot/grub/grub.cfg enthält. und ich würde das gerne booten können.

Ich hatte den Eindruck, dass das Paket grub-firmware-qemu unter Debian / Ubuntu dafür gedacht war, aber ich habe es nicht geschafft, dass es funktioniert. AFAICT, das grub.bin-Image enthält eine fest codierte Memdisk mit einer grub.cfg-Datei mit einigen Menüoptionen (wie die Suche nach einer multiboot.img oder die Suche nach einer grub.cfg), aber alles, was ich beim Ausführen bekomme, kvm -bios grub.binist eine "inkompatible Lizenz" " Fehlermeldung. Und ich bin mir nicht sicher, wie ich grub.binmit einer anderen grub.cfg eine andere generieren soll (eine, die nur funktionieren würde configfile (hd0)/boot/grub/grub.cfg).

Natürlich könnte ich eine Diskette, ein CD-ROM oder ein Disk-Image mit einer minimalen Grub-Konfiguration erstellen, die genau das tut, aber ich habe das Gefühl, dass es einen saubereren / kanonischen Weg geben sollte, und meine Forschung hat sehr wenig zurückgebracht weit.

Ich nehme an, man könnte auch die -kernelOption von qemu verwenden , aber ich weiß auch nicht, wie ich eine grub.imgdafür generieren soll . (Wenn Sie eine mit generierte grub.img verwenden, wird grub-mkimage -O i386-pc -o grub.img -c =(echo 'configfile (hd0)/boot/grub/grub.cfg') /usr/lib/grub/i386-pc/*.moddie gleiche Fehlermeldung "Inkompatible Lizenz" erneut angezeigt .)

Das ist auf Debian mit Version 1.99-23 der Grub-Pakete und 1.1.2 + dfsg-2 von kvm / qemu.

Kurz gesagt, wie soll ich vorgehen, um entweder eine grub.bin (zur Verwendung mit kvm -bios) oder eine grub.img (zur Verwendung mit kvm -kernel) zu erstellen, damit kvm ein grub-Image bootet, das / boot / grub analysieren kann /grub.cfg auf der virtuellen Festplatte?

Stéphane Chazelas
quelle

Antworten:

6

Wie es passiert, sieht es aus wie ein Fehler in Debians Paket von grub.

Der -kernel grub.imgAnsatz funktioniert, wenn ich nur die Grub-Module einbeziehe, die ich benötige grub-mkimage.

Das -bios grub.binfunktioniert mit dem neueren Grub-Paket von experimental(2.00-7). Das, grub.binwas damit einhergeht, ist jedoch nicht sehr nützlich.

Es kommt mit einem memdisk, das mit dem kommt grub.cfg. Es wäre besser gewesen, diese memdisk zu verwenden, um die Module zu halten und grub.cfgmit der -cOption von angegeben zu werden grub-mkimage. Beispielsweise sucht /boot/grub/grub.cfgund findet sich einer der Menüeinträge in der memdisk. Außerdem enthält das Debian-Paket keine qemu-Grub-Module, sodass Sie keine andere grub.bin erstellen können (obwohl Sie die Datei binär bearbeiten können, um die grub.cfg zu ändern), es sei denn, Sie tun dies aus dem Quellpaket.

Der -bios grub.binAnsatz klingt für mich nach dem saubersten Ansatz, aber ich werde den -kerneloder Floppy-Ansatz verwenden, bis das Debian-Paket behoben ist.

EDIT : Nun , das ata.modGrub-Modul zum Lesen emulierter IDE-Laufwerke ist viel langsamer als die Verwendung biosdisk.modin Kombination mit seabios(das Standard-BIOS, wenn es nicht verwendet wird -bios grub.bin). Es scheint auch, dass die Grub-Firmware weder virtio-blk noch virtio-scsi-Festplatten unterstützt, daher kvm -bios grub.binwird dies für mich keine Option sein.

Für den Fall, dass jemand diesen Weg gehen möchte, verwende ich jetzt (zsh-Syntax):

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

Und -kernel grub.img -nographican kvm übergeben. Das heißt, Linux-VMs ohne Grafik zu starten (nur eine serielle Schnittstelle). Stellen Sie daher sicher, dass der Grub der VM für die Verwendung von seriellen (oder zumindest nicht für die Verwendung von Grafiken) konfiguriert ist, dass die Kernelkonsole auf ttyS0 wechselt und dass Sie a ausführen getty dort). Es kann problemlos an VGA-Konsolen angepasst werden.

Stéphane Chazelas
quelle
2

Nach langem Surfen im Internet habe ich keine Lösung gefunden und einen Wrapper für pygrub erstellt, der mit libvirt / kvm verwendet werden kann.

Vielleicht ist diese Lösung auch spät für Sie nützlich, deshalb möchte ich sie gerne teilen. Es ist ein libvirt-Hook-Skript. Das Skript analysiert die Domänenkonfiguration beim Vorbereiten / Starten-Ereignis, lässt pygrub den Kernel über die verfügbaren Festplatten finden und kopiert die Bilder dann in den gewünschten Ordner auf dem Host.

Schauen Sie sich github.com/baquilla/pygrub-kvm-wrapper an .

Juan Javier Baca
quelle