0%

折腾kvm虚拟机

  • 随笔可能有错误,请多包涵。
  • 如果有时间可以到repo下提 issue,谢谢。

  最近想折腾一下 FPGA,需要安装 xilinx 的一套工具。这堆东西真的大。自己想了想,为了稳定性还有使用上的方便。决定将这一套工具安装到虚拟机内,虚拟机还能有快照。于是看了下 linux 下的虚拟机。
  最初想用 lxc 容器,它靠内核来隔离用户空间,性能应该是最好的了,然而使用的还是和主机相同的内核,对于一些需要在内核上安装驱动的场景就不太合适了,弃之。
  最后还是用上了“传统”的虚拟机,毕竟有时候还要用到 windows 下的一些工具。先想到的是 vmware,virtualbox 这样的,但是 vmware 要钱,virtualbox 的图形似乎不太好,看 LTT 看到 linux 下的 qemu+kvm 似乎性能不错,就找几篇 wiki 看了一下。才发现功能强大,性能损失可以到相当低的地步,内存也可以在运行时动态分配,自己火星了。想来很早之前用 android sdk 时用的模拟器性能差劲,导致对 qemu 印象不好,一直没用上这一套。用了好长一段时间双系统,切换是真的麻烦。

图形

  对于虚拟机的图形来说,在合适的硬件上可以让显卡直通虚拟机,叫做 PCI passthrough,打游戏都不成问题。但是这样不太灵活,直通要求虚拟机独占一块显卡和显示器。不过也可以使用 LTT 的视频中用的办法来提高灵活性。
  如果机器上有 Intel 的核显,你也可以使用由 Intel 开发的 iGVT-g 来获得满足轻度使用的性能,客户机可以使用未修改的 Intel 显卡驱动,兼容性也不错。
  通用一点的是 Virgil 3D,令虚拟机使用主机的渲染节点,不过 windows 的驱动似乎还不太完善,性能个人没有测试,从搜索结果来看,似乎还不是特别好。

存储

  大概要感谢云计算和虚拟化的发展,qemu/kvm 在存储上是非常灵活的,既可以使用文件,也可以使用硬盘分区,还可以加上 lvm,使用跨盘跨分区的逻辑卷,这样的逻辑卷本身就有快照功能。更绝的是对于支持的 linux 客户机,使用 9p 或者新出的性能更好的 virtio-fs 可将 root 挂在在主机的文件夹中,这样不会有虚拟磁盘有可能产生的空间浪费,文件共享也更加轻松。不过这样没有快照,你可能需要手动配置 OverlayFS 来做到差不多的效果,这样的共享还可能会导致更多的漏洞。
  我自己没有使用 lvm,又没有在使用前做好功课,使用 ext4 文件系统下的虚拟磁盘文件+ovmf uefi 启动,由于现在的(2019-12)libvirt 对 uefi 启动的虚拟机快照支持不完善,导致快照使用起来有点麻烦,叹气。

动态内存分配

  在设置好最大可以占用内存后,可以在虚拟机开机时动态调整实际占用的内存大小,要注意最大值不能在运行时调整。windows 客户机需要按照下面这个说明安装驱动。这个特性对日常桌面应用应该是提高了不少可用性。

  自动分配,启用之后感觉客户机吃内存时变卡了些。

最终想要的效果

  三大操作系统程序都能跑,性能损耗不大,存储空间和内存浪费小,互相隔离又有快照,还能轻松迁移。甚至可以跑个 androidx86,,,感觉总算得到了一个个人比较满意的环境。

糖炒栗子

  下面用我的 arch 主机搭建一个用于 xilinx 工具的 ubuntu 18.04.3 lts 虚拟机。

准备

  安装

1
sudo pacman -S qemu virt-manager

  这里我选择 virt-manager 为图形前端方便使用。
你也可以通过命令使用 qemu 来直接运行虚拟机。

准备系统镜像

  下载 ubuntu 之类的发行版选择一个速度快的镜像站点下载即可。

新建虚拟机

  执行

1
virt-manager

  添加连接 QEMU/KVM ,然后新建虚拟机,按照提示一步步来即可。在最后一步选择 在安装前自定义配置 ,在此时我们就可以做一些调整。

调整

  一些配置需要编辑 xml 文件,请先在虚拟系统管理器的首选项中启用 XML 编辑。
我们可以删除一些用不到的设备例如数位板,这样可以提高性能。详细配置可以参考下面两个链接。

减少磁盘空间浪费

自动调整使用的内存

图形

  显卡类型改为 virtio ,勾选 3d acceleration。
显示协议监听类型改为无,勾选 OpenGL。

  轻度使用这样就可以了。

60FPS

  默认状态下 qemu(版本 4.2.0)显示的帧率最多为 30FPS,要想更加流畅需要小小地修改一下。

1
2
3
4
5
6
7
8
9
10
11
12
13
diff --git a/include/ui/console.h b/include/ui/console.h
index 281f9c145b..fa6c472042 100644
--- a/include/ui/console.h
+++ b/include/ui/console.h
@@ -26,7 +26,7 @@
#define QEMU_CAPS_LOCK_LED (1 << 2)

/* in ms */
-#define GUI_REFRESH_INTERVAL_DEFAULT 30
+#define GUI_REFRESH_INTERVAL_DEFAULT 17
#define GUI_REFRESH_INTERVAL_IDLE 3000

/* Color number is match to standard vga palette */

  不过,即使做了以上修改,在使用 virt-manager 内置的 spice 连接直通虚拟机时,你可能会注意到鼠标看起来帧率并不高。临时的办法是把鼠标直通给虚拟机,这样就不会看起来卡卡的了。

windows10 虚拟机

图形 iGVT-g