这题我会。如果只是这些需求的话感觉用 container 或许也可以。这里面可能需要解决一下 GUI 的一些问题,大概不如虚拟机简单直接,但是开销更小,玩熟之后也更灵活。
我没用 container 跑过 GUI ,但是我做过一个大概更加脱裤子放屁的事情。因为我现在用的是 Wayland 环境,然后我发现 Steam 的 Remote Play 大概对这玩意支持不是很好(
github.com/ValveSoftware/steam-for-linux/issues/6148 )因为 Steam 是闭源的所以不怎么方便折腾。为了能用 Remote Play ,就又做了个 QEMU 虚拟机,上面跑 Openbox ,只装必要的包和 Steam ,然后插了张空闲的显卡 passthrough 过去(中间手动 hack 了新版 kernel 引入的一个 bug
lore.kernel.org/lkml/c1c8bfa5-8ba4-c365-1663-535f656ca353@suse.de/T 不然 tty 就没法用了,然而我又时不时会改下 Wayland Compositor ...),写了个脚本启动和关闭。注意这上面是会跑 Proton 的,也就是为了解决一个 Linux 自己的兼容性问题跑了个虚拟机,然后上面又跑了解决 Linux 和 Windows 兼容性问题的 Emulator ...
刚才有几个明显的坑已经说了,还有几个:
* 我尝试过用 virtio-gl 代替 GPU Passthrough ,这个是 QEMU-KVM 这个栈给出的开源 GPU Paravirtualization 方案。说实话,纯 OpenGL 程序跑得还可以。但是 Proton 现在主要方向是 DXVK ,是需要 Vulkan 支持的,而 virtio-gl 现在是只给 OpenGL API 做虚拟化的。有人在利用 virtio-gl 的基础做一个 Vulkan 的 Paravirtualization 叫 Venus ,这个看样子已经基本可用了,但是不在目前 Mesa 和 QEMU 的稳定版里面(当时我测试的时候已经进 Mesa 的 testing 包了,但是 QEMU 的 patch 好像很久都没合进去),还好是 Arch ,折腾一阵编译好了,但是不能用,折腾到最后发现应该是 N 卡闭源驱动栈提供的一些内核对象不支持 mmap 操作,无法在两个系统之间共享内存,恰好这个闭源驱动栈的新硬件的内核部分有开源的,所以可能折腾一下能行,不过我一时半会不清楚该怎么改 ...
这个 Paravirtualization 的性能损耗会比 GPU Passthrough 要高,intel 驱动应该不会有这些问题,但是如果是核显的话本身性能也低。我去试的基础是本身主 GPU 性能足够损失一截也无所谓。这也是为啥要折腾 Vulkan 支持,更新的实现和开销更小的 API 也有助于降低 Paravirtualization 的损耗。但是 anyway Vulkan 支持现在还不成熟,虽然现在普通桌面一般还都是 CPU 渲染或 OpenGL ,但是需要游戏或者 Vulkan 编程的时候就成了问题。另外这玩意现在应该只是处理通用 API ,需要 GPGPU 等 GPU 特定 API 的时候不知道会怎么处理 ...
* 我尝试在虚拟机和主机之间共享游戏文件夹,这个 QEMU 也提供了 virtiofs 的解决方案。但是可能是因为我叠的 debuff 太多了(我还是在 ZFS 上用的),偶尔会出现不稳定。其实还有一些其他的方案,但是到底都是两个内核访问同一个文件系统,本身就是很奇怪的一个事情,使用 container 的话直接共享就行。
* 以前我都是虚拟 Windows ,我本来以为 Linux 内核会直接支持在 Linux 上虚拟 Linux 时,虚拟机没有使用的内存就不占用宿主机内存,这样我可以很低开销让虚拟机一直跑在后面。但是查了一下发现这个东西貌似挺麻烦的,不过折腾折腾估计还是可以的。
* 键鼠如何虚拟化解决方案也不唯一,现在我主要用的是 evdev passthrough ,相当于把所有事件转发给虚拟机,这样在虚拟机里用快捷键不会被宿主机拦截。但是在目前的设置下我还是需要手动处理虚拟机运行过程中热插拔键鼠的情况,并且偶尔会有不稳定。
非常凑巧的是大概同时间我还对硬盘分区进行了调整——先是换了一块更大的系统盘,这个过程很简单,就是插一个 Arch 安装盘启动,给新盘分区格式化,然后 rsync 原来的系统盘到新盘里,最后修改一下 fstab 里面的 UUID 和 bootloader 里面的系统盘分区标签(如果你用的是一样的标签就可以不做 ...),就可以直接从新盘启动。然后还把系统分区和 Home 分区分离了,这个更简单,就是分好区之后挪一下 Home 目录,fstab 加一条。我的意思是在直接备份很简单的情况下,只为了备份需求跑虚拟机实在有点大炮打蚊子的感觉。如果你只用包管理器装软件的话,桌面 Linux 大半的自定义其实都在 Home 里面,除了 Home 之外备份个 /etc 和 /boot 就差不多了(最多还有你的包列表)。所有这些都是可以通过直接拷贝文件解决的问题。虚拟机对我来说代价太重了,而且最重要的是不知道什么时候会出问题,比如我在主机可以用 turbostat 看 CPU 功耗和频率,虚拟机就跑不了(有可能是我设置问题)。
另外 Arch 属于在软件选择上没有偏向性的系统,基本只有 pacman ,glibc ,systemd 几个给你框下来了(内核可以改,因为内核的 userspace API 相对稳定反倒问题不大),剩下的基本都是你自己发挥。所以不存在“Arch 对虚拟机支持怎样”的说法。另外如果只是使用一个系统的话,没必要两个系统都装完整的 GUI 。可以向我一样只装最小化的 GUI ,或者干脆不装 GUI 直接 passthrough GPU 。