在使用了很长一段时间(大概 6-7 个月)的 VirtualBox 之后,我决定使用 Qemu 替代它。事实上我使用 VirtualBox 的体验非常好,尤其是它提供的 Host 和 Guest 之间的文件传输,剪切板共享功能,它对于网络的配置也非常的方便。

但对于一些复杂点的网络配置则需要用到命令行工具 vboxmanage,比如启用虚拟网卡的 dhcp 服务。

让我毅然决定放弃 VirtualBox 选择 Qemu 的原因是我在油管上看到的一则发表于 2022 年 1 月视频:Stop using Virtualbox, Here’s how to use QEMU instead

油管博主 Chris Titus 在视频里展示了相同的虚拟机 Guest 在 Qemu 下和在 VirtualBox 下的启动时间,结论是 11.17s35.28s

我震惊了。如果说只是快个百分之二三十,我还可以认为只是简单的因为 VirtualBox 提供了更多的管理功能而导致的性能下降,但事实摆在我面前,速度提升 68.3%

什么概念,要知道实际性能的提升和启动速度的提升并不是成正比的,通常来说实际性能的提升的比例会高于启动速度的提升比例,也就是说使用 Qemu 的虚拟机性能效果比 VirtualBox 的虚拟机性能效果提升超过一倍甚至更多。

这让我没有理由不选择使用 Qemu。


实际使用

Qemu 本身只提供了命令行工具来管理虚拟机,也不会保存虚拟机的相关配置信息。实际使用时通常是同时安装 Libvert(一套用于管理硬件虚拟化的开源API、守护进程与管理工具)配合 Libvert clients 来实现使用图形界面管理 Qemu 虚拟机。

Libvert clientsLibvert 的前端,常用的 Libvert clients这里。我使用的是 Virt-Manager 来管理 Qemu 虚拟机,因为在使用过程中 Virt-Manager 提供的管理功能和 VirtualBox 比较接近。使用教程参考 Derek TaylorVirt-Manager Is The Better Way To Manage VMs

使用 Virt-Manager 创建虚拟机的过程和 VirtualBox 类似,通常(对我来说)只需要改一下内存大小、CPU 数量和磁盘容量,其它无脑下一步就行。

与 VirtualBox 不同的是 Virt-Manager 还提供了通过网络安装(HTTP, HTTPS or FTP),安装过程要提供操作系统安装 URL,估计进行大规模安装的时候会用到,一般来说还是使用镜像文件来安装。


运行效果

不得不承认,Qemu 虚拟机的启动速度是肉眼可见的提升了,对 CPU 的占用也比 VirtualBox 少。除了没有剪切板共享功能有点不方便之外,其它使用体验和 VirtualBox 基本一致。

我主要使用虚拟机来调试一些应用程序,比如在 Windows 上运行 IDA,在 Linux 上运行 GDB。另外也会在 Linux 上运行些有意思的 Github 项目,比如 QQ Bot。

顺便提一嘴文件共享的问题。我不喜欢使用虚拟机软件提供的文件共享服务,一个是麻烦,有时还得重启配置才能生效;另一个是不灵活,不方便配置多个共享文件夹和控制权限。

我使用网络来实现文件共享,因为对这方面比较熟。

对于 Windows 虚拟机,只要开启网络文件共享,然后把想要共享的文件夹设置为对指定用户共享,就可以在宿主机(我这里用的 Linux,Windows 类似)使用 smb 协议连上 Windows 虚拟机,访问共享文件。

对于 Linux 虚拟机就更简单了,在 Linux 虚拟机里开启 SSHD/SSH 服务,使用 SSHFS 挂载 Linux 的文件系统或者直接 SCP,又或者使用 VS Code 的远程连接来直接编辑 Linux 虚拟机里的文件。

这个过程在 Qemu 下更加方便,因为 Qemu 直接虚拟出一个主机层面的虚拟网卡,也就不需要像 VirtualBox 那样使用 NAT 时还得配置端口转发才能从主机连上虚拟机。


实际使用中的问题

使用 Docker 和部署 Github 项目就不得不考虑配置代理的问题。

因为我在宿主机使用的是透明代理,所以在 VirtualBox 虚拟机里就不需要考虑配置网络代理的问题,网络数据自动由主机代理接管。

而 Qemu 虚拟的是主机层面的网卡,导致它的网络数据不由透明代理接管。(也可能是 iptables 配置的问题,弄了好久也没搞清楚是什么原因在开了 cgproxy 后 Qemu 虚拟机就连不上网,似乎可以对外请求,但返回的数据包没能回到虚拟机)

为了让虚拟机流量走主机代理,就只能是在虚拟机内使用配置 http_proxyhttps_proxy 环境变量来试图让流量走主机代理了,但很多应用却并不使用 http_proxyhttps_proxy 环境变量,搞自己的代理配置那一套。其中就包括 aptdocker 和 Python 脚本。

好在找到了一篇比较全的代理配置博文:UbuntuのProxy設定備忘録。里面包含了对 http_proxyhttps_proxy 环境变量、aptgitdockerwget 的代理配置方法。

关于 Python 的代理配置我参考的是 Stack Overflow 中的 How to pass all Python’s traffics through a http proxy?


结语

当需要考虑虚拟机性能时,毫无疑问应该选择 Qemu/KVM,这也是现在许多云服务厂商在使用的主流虚拟化方案。

但如果只是简单的虚拟需求如尝试各种 Linux 发行版啥的,那选择 VirtualBox 还是要更方便的,毕竟 VirtualBox 对虚拟机的管理配置很全,大部分需求都可以在 VirtualBox 的配置面板动动鼠标解决,这对新手非常友好。

折腾网络配置说实话挺烦的,尤其是还没深入研究过 NetfilterIptables。一些配置出问题虽然知道大概是哪有问题,但却不会修复。网上也不一定找得到答案,只能是论坛求助。

但折腾的好处则是我可以在解决问题的过程中学到不少新的东西,而这些经验会在未来不经意间发挥意想不到的作用。