Changchun Master Li

[Windows10 in Gentoo Linux] 力大砖飞,扔掉X11,把Linux图形界面外包给windows 10

2025-04-20

你是否被 GNU/Linux 的图形化界面 X11 所困扰,架构老旧,配置复杂,bug多。以Gentoo为例,启用X会导致安装很多库,依赖复杂不说,要是使用独显的话,开源的nouveau体验很糟糕,发挥不出显卡性能;使用官方闭源驱动nvidia-drivers,它对非x86机器支持很差 Raspberry Pi support (arm64)?,你不光要接受EULA,而且每次编译安装kernel的时候都要用nVidia那一套闭源工具重新编译和内核对应的nvidia.ko。这就太不优雅了!我想如果没有X,那么 Linux 新手的问题可能会减少90%。

windows 10 就不存在这个问题,用户基础巨大,上游官方支持完善。对于非Linux图形开发者来说,抛弃X11可能是一个更理智的选择。

把 Linux 和 windows 10 融合在一起呢?虚拟化技术使windows10虚拟机有接近原生的体验

  • 得益于intel vt-x(amd-v) 技术,qemu+kvm的效率已经非常高了
  • PCIe passthrough 以及各种直通技术允许linux kernel把设备直接呈现给虚拟机,就像虚拟机直接使用一样

既然微软可以拥抱开源社区,推出WSL,把 Linux 子系统集成到 windows。那我们为什么不把 windows子系统 集成到 Linux 呢?

这样,一方面我们拥有定制kernel的自由,另一方面我们不需要折腾X11来满足日常使用

主板 firmware 设置

打开主板 bios/efi 的 VT-d 和 IOMMU 选项,此时从 /proc/cpuinfo 能看到 vmx(intel) 或者 svm(amd) 。arm64需要打开 smmu。

内核配置

1
2
3
4
enable iommu:
Device Drivers ---> IOMMU Hardware Support ---> Support for Intel IOMMU using DMA Remapping Devices
enable vfio pci:
Device Drivers ---> VFIO support for PCI devices

host os可以不安装任何显卡/PCIe设备驱动。编译安装kernel

内核启动参数

1
iommu=pt intel_iommu=on

给系统对应的bootloader,例如grub、lilo增加内核参数
我这里没有安装bootloader,使用的 EFI stub 直接启动内核,所以需要更新 efi boot entry

1
2
efibootmgr --create --disk /dev/nvme0n1 --part 1 --label "Gentoo 6.13.0-rc4" --loader " \EFI\Gentoo_testing\bzImage-6.13.0-rc4.efi" -u "root=/dev/nvme0n1p2 intel_iom
mu=on iommu=pt"

配置 PCIe passthrough 设备

编辑 /etc/modprobe.d/vfio.conf,让Linux对直通设备使用vfio驱动而非设备驱动

1
options vfio-pci ids=xxxx:xxxx,xxxx:xxxx,xxxx:xxxx

当然也可以手工卸载设备,绑定vfio驱动

1
2
3
4
5
gpu="0000:01:00.0"
gpu_vd="$(cat /sys/bus/pci/devices/$gpu/vendor) $(cat /sys/bus/pci/devices/$gpu/device)"

echo "$gpu" > "/sys/bus/pci/devices/$gpu/driver/unbind"
echo "$gpu_vd" > /sys/bus/pci/drivers/vfio-pci/new_id

启动虚拟机qemu

我这里用qemu 9.2.3
自己编译的话建议打开 io-uring、usb passthrough、vhost-net、virtfs 选项

创建虚拟硬盘

1
qemu-img create -f qcow2 win11.qcow2 1024G 

启用嵌套虚拟化

为了在windows10中可以正常使用wsl或者hyper-v,需要打开kvm嵌套虚拟化

1
2
cat /sys/module/kvm_intel/parameters/nested
Y

启动虚拟机

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
qemu-system-x86_64 \
-smp 8 \
-cpu Skylake-Client-noTSX-IBRS,hypervisor=off,vmx=on,mpx=off \
-drive file=win10.qcow2 -m 16G \
-device vfio-pci,host=0000:01:00.0 \
-device vfio-pci,host=0000:01:00.1 \
-device vfio-pci,host=0000:00:14.3 \
-enable-kvm -bios /usr/share/edk2-ovmf/OVMF_CODE.fd \
-usb \
-device usb-host,hostbus=1,hostaddr=3 \
-device usb-host,hostbus=1,hostaddr=4 \
-device usb-host,hostbus=1,hostaddr=7 \
-vnc 0.0.0.0:2 \
-nographic \
-device e1000,netdev=net0 \
-netdev user,id=net0,hostfwd=tcp::4444-:22
  • cpu 使用host会导致 windows guest系统开启虚拟机功能无法进入系统,所以选择Skylake-Client-noTSX-IBRS
  • hypervisor=off 避免kvm向windows报告它本身运行在虚拟化环境 forum.proxmox.com,否则systeminfo hyperv会返回 已检测到虚拟机监控程序。将不显示 hyper-v 所需的功能
  • vmx=on 为虚拟机打开vt-x功能,默认应该就是打开的
  • mpx=off 禁用后提高兼容性,否则可能进不去windows10系统 superuser.com
  • vfio-pci 配置 pcie 直通
  • usb-host 配置 usb键盘鼠标 直通,把host的键鼠给guest用
  • hostfwd=tcp::4444-:22 映射localhost:4444 到windows10 openssh端口

安装windows10

1
<qemu command line> -boot d -cdrom /path/to/windows10.iso

正常安装win10即可,微软会自动下载nVidia显卡驱动,接下来安装ubuntu 24.04 Linux子系统

  • 从Linux子系统登录到host系统可以直接ssh 10.0.2.2
  • 如果想从host登录到Linux子系统,需要给windows10安装 Win32-OpenSSH,再从powershell进入wsl

安装pytorch

按照官方教程,在wsl安装pytorch非常容易

1
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu126

值得注意的是,安装pytorch不需要安装cuda和cudnn!编译pytorch的时候才需要。很多人以讹传讹,给新手造成了困扰。仅仅是跑pytorch,pytorch+driver足够了

总结

最后,就是配置一下windows10了,安装好自己喜欢的软件 vscode、Termius/xshell/MobaXterm、steam、modelsim、vivado,远离x11,流畅的游戏,开心的使用电脑吧

refer

GPU passthrough Gentoo wiki
PCI_passthrough_via_OVMF archlinux wiki

使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章