soarli

在 Linux 上配置 KVM 虚拟机与 NVIDIA 显卡直通 (附避坑指南)
在工程仿真(如 EDEM)或深度学习场景中,我们经常需要在 Linux 服务器上运行 Windows 虚拟机,并且...
扫描右侧二维码阅读全文
02
2026/03

在 Linux 上配置 KVM 虚拟机与 NVIDIA 显卡直通 (附避坑指南)

在工程仿真(如 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.00000: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/*

为什么危险: 777666 权限意味着系统上的任何低权限访客、甚至恶意脚本都可以随意篡改你的 ISO 镜像和虚拟机硬盘 (qcow2)。
正确做法: 确保文件所有者属于 libvirt-qemu:kvm 即可,保留标准的 644600 权限。

# 正确的权限赋予方式
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 设备,即可开启高性能的高端仿真之旅。

(本文由真实操作记录整理,感谢阅读)

最后修改:2026 年 03 月 02 日 05 : 19 AM

发表评论