在工程仿真(如 EDEM)或深度学习场景中,我们经常需要在 Linux 服务器上运行 Windows 虚拟机,并且要求虚拟机能够发挥极高的图形或计算性能。这时候,传统的虚拟显卡就成了瓶颈,NVIDIA 显卡直通 (GPU Passthrough) 成了必选项。
本文将详细记录如何在一台 Linux 宿主机上从零搭建 KVM 虚拟化环境、配置 NVIDIA 显卡直通(VFIO),并通过 Cockpit Web 面板安装和管理一台配备 2TB 存储的 Windows 10 虚拟机。
同时,文章最后也会盘点在配置 KVM 权限时极易踩坑的“高危操作”,并给出正确的解决思路。
🛠️ 第一步:环境准备与显卡直通 (GPU Passthrough)
要让虚拟机独占显卡,必须将显卡与 Linux 宿主机“解绑”,并交由 vfio-pci 驱动接管。
1. 开启 IOMMU 支持
首先,需要修改 GRUB 引导配置以开启内核的 IOMMU 功能(Intel 平台为 intel_iommu=on,AMD 平台为 amd_iommu=on)。
sudo nano /etc/default/grub
# 修改 GRUB_CMDLINE_LINUX_DEFAULT 参数后保存
sudo update-grub
sudo reboot
2. 查找并隔离 NVIDIA 显卡
重启后,确认内核参数已生效,并查找 NVIDIA 显卡的 PCI 地址:
cat /proc/cmdline
lspci -nn | grep -i nvidia
找到显卡及自带音频设备的硬件 ID(本例中 PCI 地址为 0000:e1:00.0 和 0000:e1:00.1)。我们使用 driverctl 工具将它们与宿主机隔离:
sudo apt update && sudo apt install driverctl -y
sudo driverctl set-override 0000:e1:00.0 vfio-pci
sudo driverctl set-override 0000:e1:00.1 vfio-pci
📦 第二步:安装 KVM 核心组件与 Cockpit 管理面板
传统的命令行管理虚拟机门槛较高,我们可以安装 Cockpit 以及 cockpit-machines 插件,在浏览器中即可实现直观的图形化管理。
1. 安装基础虚拟化包与面板
sudo apt update
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst -y
sudo apt install cockpit cockpit-machines -y
2. 启动服务并配置防火墙
Cockpit 默认运行在 9090 端口。
sudo systemctl enable --now cockpit.socket
sudo ufw allow 9090/tcp
sudo ss -tulpn | grep :9090 # 检查端口是否成功监听
此时,在局域网内通过浏览器访问 https://宿主机IP:9090 即可登录管理后台。
📥 第三步:准备 Windows 镜像与 VirtIO 驱动
KVM 虚拟机如果使用默认的 IDE 硬盘和千兆网卡,性能极差。我们需要为其安装专为 KVM 优化的半虚拟化驱动(VirtIO)。
1. 下载 VirtIO 驱动光盘镜像
(注:由于网络环境问题,这里尝试了几个源,最终建议使用 Fedora 官方最新源或清华大学镜像源):
sudo wget -O /var/lib/libvirt/images/virtio-win.iso https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/virtio-win.iso
2. 获取 Windows 10 安装镜像
从内网文件服务器极速拉取事先准备好的定制版 Win10 镜像:
sudo wget -O /var/lib/libvirt/images/Win10_Pro_22H2.iso "http://192.168.61.61:2026/Windows/zh-cn_windows_10_consumer_editions_version_22h2_updated_july_2025_x64_dvd_f841fba5.iso"
💾 第四步:创建超大容量虚拟磁盘
因为虚拟机主要用于运行 EDEM 等大型仿真软件,需要充裕的存储空间。我们将虚拟机磁盘存放在空间更大的 /home 目录下。
# 创建存放目录
sudo mkdir -p /home/kvm_images
# 创建一个 2000G (2TB) 的 qcow2 动态扩展磁盘
sudo qemu-img create -f qcow2 /home/kvm_images/Win10-EDEM2.qcow2 2000G
提示:qcow2 格式是“用多少占多少”,虽然分配了 2TB,但初始并不会立刻占用宿主机 2TB 的物理空间。
⚠️ 第五步:【反面教材】千万别这么做权限管理!
在挂载自定义目录(如 /home/kvm_images)或进行直通配置时,KVM 经常会因为 AppArmor/SELinux 安全策略或文件属主不对而报 Permission denied 错误。
很多新手为了图省事,会采用以下极其危险且不规范的“暴力破除法”。请在生产环境中严格避免以下操作!
❌ 危险操作 1:彻底关闭 Libvirt 安全沙箱
# 错误示范:关闭了虚拟机强制访问控制沙箱
echo 'security_driver = "none"' | sudo tee -a /etc/libvirt/qemu.conf
sudo systemctl restart libvirtd
为什么危险: 禁用
security_driver意味着一旦虚拟机被黑客或勒索病毒攻破,恶意程序将极易发生“虚拟机逃逸”,直接获取你的 Linux 宿主机控制权。
正确做法: 应该配置 AppArmor 或 SELinux 策略,单独放行/home/kvm_images目录的访问权限,而不是一关了之。
❌ 危险操作 2:滥用 chmod 777 赋予全局读写权限
# 错误示范:将所有镜像文件对全网段/所有用户开放读写权限
sudo chmod 777 /var/lib/libvirt/images/*.iso
sudo chmod 666 /var/lib/libvirt/images/*
为什么危险:
777和666权限意味着系统上的任何低权限访客、甚至恶意脚本都可以随意篡改你的 ISO 镜像和虚拟机硬盘 (qcow2)。
正确做法: 确保文件所有者属于libvirt-qemu:kvm即可,保留标准的644或600权限。# 正确的权限赋予方式 sudo chown libvirt-qemu:kvm /home/kvm_images/Win10-EDEM2.qcow2 sudo chmod 644 /home/kvm_images/Win10-EDEM2.qcow2
结语
至此,基础架构已经搭建完毕。接下来只需在 Cockpit 的 "Virtual Machines" 界面点击 "Create VM",挂载准备好的 Win10 ISO、VirtIO 驱动盘以及 2TB 的 Win10-EDEM2.qcow2 磁盘,并在硬件列表中添加直通的 NVIDIA PCI 设备,即可开启高性能的高端仿真之旅。
(本文由真实操作记录整理,感谢阅读)
版权属于:soarli
本文链接:https://blog.soarli.top/archives/878.html
转载时须注明出处及本声明。