直接从文件系统启动 qemu/kvm

直接从文件系统启动 qemu/kvm

使用 Xen 及其pygrub一段时间后,我现在尝试使用 KVM/qemu 做类似的事情。

基本上,我有一个 LVM 逻辑卷(尽管它也可能是一个文件),其中包含 Linux 发行版的根文件系统(没有分区,只是直接在磁盘上的 FS),其中还包含 /boot/grub/grub.cfg,我希望能够启动它。

我的印象是 Debian/Ubuntu 上的 grub-firmware-qemu 软件包就是为此而设计的,但我还没有设法让它工作。 AFAICT,grub.bin 映像包含一个硬编码的内存磁盘,其中包含一个 grub.cfg 文件和一些菜单选项(例如搜索 multiboot.img 或搜索 grub.cfg),但我在运行时得到的kvm -bios grub.bin只是一个“不兼容的许可证” “ 错误信息。而且我不太确定如何使用不同的grub.cfg 生成grub.bin不同的 grub.cfg (只能这样做configfile (hd0)/boot/grub/grub.cfg)。

当然,我可以用最小的 grub 配置创建一个软盘或 cdrom 或磁盘映像来做到这一点,但我感觉应该有一种更干净/规范的方法来做到这一点,而我的研究只带回很少的东西,所以远的。

我想人们也可以使用 qemu 的-kernel选项,但同样,我不知道如何grub.img为此生成一个。 (使用 生成的 grub.imggrub-mkimage -O i386-pc -o grub.img -c =(echo 'configfile (hd0)/boot/grub/grub.cfg') /usr/lib/grub/i386-pc/*.mod再次出现相同的“不兼容许可证”错误消息)。

这是在 debian 上,grub 软件包版本为 1.99-23,kvm/qemu 版本为 1.1.2+dfsg-2。

因此,简而言之,我应该如何创建 grub.bin (与 一起使用kvm -bios)或 grub.img (与 一起使用kvm -kernel)以使 kvm 引导能够解析 /boot/grub 的 grub 映像/grub.cfg 在虚拟磁盘上?

答案1

碰巧,它看起来像是 debian 的grub.

-kernel grub.img如果我只包含我需要的 grub 模块,该方法就有效grub-mkimage

它适用于(2.00-7)-bios grub.bin的较新 grub 软件包。experimental然而,它grub.bin附带的东西并不是很有用。

它带有一个memdisk带有grub.cfg.最好使用该内存磁盘来保存模块并使用选项grub.cfg指定。例如,其中一个菜单项会在内存磁盘中查找并找到自己。此外,debian 软件包不包含 qemu grub 模块,因此您无法构建不同的 grub.bin(尽管您可以对文件进行二进制编辑以更改 grub.cfg),除非您从源软件包中进行操作。-cgrub-mkimage/boot/grub/grub.cfg

-bios grub.bin方法听起来对我来说是最干净的方法,但我将使用-kernel或 软盘方法,直到 debian 软件包修复为止。

编辑:嗯,ata.modgrub 模块读取模拟 IDE 驱动器比biosdisk.mod结合使用要慢很多seabios(不使用时的默认 BIOS -bios grub.bin)。另外,grub 固件似乎不支持 virtio-blk 或 virtio-scsi 磁盘,因此kvm -bios grub.bin不会成为我的选择。

如果有人想走这条路,我现在使用(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

-kernel grub.img -nographic传递给kvm。也就是说,启动没有图形的 Linux VM(只有串行接口,因此请确保 VM 的 grub 配置为使用串行(或至少未配置为使用图形),内核控制台转到 ttyS0 并且运行盖蒂在那里)。它也可以轻松适应 VGA 控制台。

答案2

经过大量网页浏览后,我没有找到任何解决方案,我为 pygrub 制作了一个包装器,以便与 libvirt/kvm 一起使用。

也许这个解决方案对你有用,即使是晚了,所以我想分享它。这是一个 libvirt 挂钩脚本。该脚本在准备/开始事件上解析域配置,让 pygrub 通过可用磁盘找到内核,然后将图像复制到主机中所需的文件夹。

看一眼github.com/baquilla/pygrub-kvm-wrapper

相关内容