![直接从文件系统启动 qemu/kvm](https://linux22.com/image/26815/%E7%9B%B4%E6%8E%A5%E4%BB%8E%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E5%90%AF%E5%8A%A8%20qemu%2Fkvm.png)
使用 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),除非您从源软件包中进行操作。-c
grub-mkimage
/boot/grub/grub.cfg
该-bios grub.bin
方法听起来对我来说是最干净的方法,但我将使用-kernel
或 软盘方法,直到 debian 软件包修复为止。
编辑:嗯,ata.mod
grub 模块读取模拟 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 通过可用磁盘找到内核,然后将图像复制到主机中所需的文件夹。