来自分区的 KVM 来宾操作系统

来自分区的 KVM 来宾操作系统

我有 Linux 和 Windows 的双启动配置。现在,我想保留双启动设置,并且还能够在 Linux 上的 KVM 内运行 Windows。

以下配置工作正常。我将整个磁盘 ( /dev/sda) 包含在 KVM 中。为了运行 Windows,我创建了 grub ( ) 的 ISO 映像grub-mkresque,该映像已配置为从其分区 ( /dev/sda2) 启动 Windows。但是,我对这个解决方案并不满意,因为 Windows 来宾可以访问包含所有分区的整个磁盘。

正如评论者 @telcoM 和 @kenneth-b-jensen 也指出的那样,这是/应该成为我通过避免两个操作系统并发访问/安装来避免损坏的策略的一部分。

所需的解决方案只是包含 Windows 分区 ( /dev/sda2),然后从那里启动 Windows。由于该分区不可启动,因此我无法仅从该分区启动 Windows。因为 KVM 显然将单个分区绑定到具有自己的分区表的磁盘,所以grub从我的图像中无法找到相应的分区来启动。

我需要完成配置或其他一些想法才能获得工作配置。

  • 使用 VirtualBox,因为它提供了为原始磁盘访问创建映像的可能性,保留分区表,但仅指定必要的分区。恕我直言,应该避免这种情况,因为 KVM 会带来更高的性能。

  • 找到一个解决方案,用 KVM 保留分区表(如上所述)。

  • 设置grub为使用 KVM 内部的正确分区。我希望获得根据目标配置 grub 的专家指导。

答案1

我尝试在硬件上和虚拟机内交替运行同一个 Windows 磁盘,但总是失败,因为虚拟机内显示的设备与实际硬件不同。

但利用你的“其他一些想法”条款,让我解释一下我如何在同一台机器上运行 Linux 和 Windows。

Windows运行在KVM虚拟机中,但virt-viewer可以控制一个虚拟控制台。当我切换到该控制台时,在全世界看来它就像是一台专用的 Windows 计算机。而且我可以独立登录和退出Linux和Windows。 (与西格文安装在 Windows 上,我可以ssh在它们之间切换。)

这些是我设置它的大致步骤。我从 Microsoft 下载了 .iso 并单独购买了许可证。您也许可以重新安装现有的 Windows 许可证。

sudo vgcreate vg0 /dev/sd...
sudo lvcreate --size 128G --name win10 vg0
sudo virt-install --name Windows --connect qemu:///system --virt-type kvm --disk path=/dev/vg0/win10,format=raw --cdrom '<path>/Win10_1607_English_x64.iso' --network bridge=br0 --video qxl --chanel spicevm,target_type=virtio --graphics spice,listen=0.0.0.0,port=5900 --os-variant win10 --memorybacking nosharepages=true --memory 2048 --vcpus 1

br0我在 Linux 主机上创建了一个网桥设备,这样我就可以透明地连接虚拟机。但这是一个单独的话题。

virt-install命令第一次会自动启动virt-viewer,从而启动 Windows 10 安装程序。它看到的唯一磁盘是我创建并放在virt-install命令行上的虚拟磁盘。然后我随后启动它:

virsh --connect qemu:///system start Windows

这会启动机器,但不会查看输出。要查看输出,我切换到未使用的虚拟控制台,按 例如CTRLALTF6并输入此命令。请注意,我们virt-viewer直接在 X 服务器上启动 X 应用程序 ( ),没有窗口管理器。

-k开关将 virt-viewer 置于信息亭模式这有效地隐藏了它确实在虚拟机中运行的事实。

startx /usr/bin/virt-viewer -a -k -r -w -c qemu:///system Windows -- :6  -config CtrlAltBksp.conf -nolisten tcp -novtswitch

CtrlAltBksp.conf文件是可选的。它允许您通过按 来关闭 virt-viewer CTRLALTBackspace。它必须放在主机上的 /etc/X11/ 或其他xorg已知的目录中。这里是:

Section "ServerFlags"
        Option "DontZap" "false"
EndSection
Section "InputClass"
        Identifier "CTRL_ALT_BACKSPACE"
        MatchIsKeyboard "on"
        Option "XkbOptions" "terminate:ctrl_alt_bksp"
EndSection

注意:你不需要像我一样安装 SPICE 和 QXL,但如果你这样做,最好安装香料工具

答案2

我已经运行了一些并行安装的操作系统,QEMU 驻留在磁盘上,但我认为没有一个操作系统没有引导加载程序。

如果您使用 UEFI 启动,则需要对 QEMU 使用 OVMF,这意味着事情变得更加复杂,超出了我的知识范围。

尝试在 Windows 分区上安装和配置 GRUB,或启动 Windows 救援/安装介质与 QEMU(否则,Windows 将吃掉 GRUB)并重新安装以恢复 Windows 引导加载程序。要安装 GRUB,请使用grub-install /dev/sdxY、挂载文件系统,然后运行grub-mkconfig -o /mnt/grub/grub.cfg​​。然后,从现有的 grub.cfg 中复制您需要的内容,并根据需要对其进行编辑 - 请随时在此线程中寻求帮助。

另一种选择是对仅在 Windows 上本地安装引导加载程序进行一些研究。

核心选项是使用 qemu-img 创建一个与 Windows 分区大小相同的 .img 文件,通过 QEMU 将 Windows 重新安装到该文件,并在分区的某个偏移量之后复制所有内容(可能就在第一个偏移量之后) 1024 柱面左右)使用 dd 复制到 .img 文件。

一个非常危险的选择是继续使用现有的 GRUB 通过使用带有只读选项的所有磁盘来链式启动到 Windows。请参阅@telcoM 对 OP 的评论;不要在主机正在使用的磁盘上运行虚拟机!文件系统将被损坏且无法恢复!(除非它被来宾只读使用。)尝试qemu-xxxxxxx -drive file=/dev/sdxX,format=raw,readonly

尽管如此,QEMU 可以运行原始磁盘:

qemu-xxxxxxxx -drive file=/dev/sdxY,format=rawman 1 qemu有关详细信息,请参阅并搜索 -drive)。

如果您对 QEMU/KVM 没有太多经验,直接从命令行运行和配置它可能会令人生畏和沮丧——为了您的健康,请考虑使用前端。

答案3

您可以使用dmsetup来自工具与--table“构建”一个选项/dev/sda通过指定类似于您的table file(搜索“表格格式”)

您可以使用某些分区的只读映射(或副本),例如EFIBOOT分区,以及/,以及一些zero用于“替换”该映射中的 Linux 分区的目标。只需确保表映射中包含真实的 Windows 分区,并且在正确的位置在表中。

我过去曾用它进行过类似的尝试,这很可能就是这种机制在 Linux 的底层使用来构建定制的、组合的块设备。

确保您的任何分区一次都不会被多个操作系统挂载/访问。

相关内容