家庭AI算力平台搭建:KVM虚拟化与显卡直通实战指南

发布时间:2026/9/9 1:21:14
家庭AI算力平台搭建:KVM虚拟化与显卡直通实战指南 拿一台闲置的 PC 组家庭 AI 算力平台是好几个朋友问过我的事。刚开始我以为他们只是想装个 Ubuntu 跑跑 PyTorch真正上手才发现绝大多数人的需求是“一台机器同时干多件事”宿主机要当 NAS、跑服务虚拟出来的 Windows 要能日常办公还要单独开一个带显卡的 Linux 桌面专门跑本地大模型和炼丹。如果每次切换系统都要重启那体验实在太割裂。所以“宿主机虚拟化 显卡直通”就成了最合适的方案整体链路可以浓缩成一句选一套能直通的硬件装一个支持 IOMMU 的宿主机再通过 KVM/QEMU 把物理显卡完整交给某个虚拟机。这篇文章是我搭建过程中的第一份实录重点讲硬件选型、Ubuntu Server 安装、KVM 环境准备以及最折腾人的显卡直通尽量把三步走通的细节和坑都写清楚。1. 硬件选型为虚拟化和直通打底1.1 先想明白你要虚拟化什么再倒推硬件需求家庭 AI 算力平台和公司机房不一样机器放在客厅或者书房声音、功耗、体积都得考虑。但比这些更重要的是硬件能不能满足虚拟化和直通的基本要求。我给自己定的需求很明确宿主机跑 Ubuntu Server虚拟机里再开一到两台带桌面的系统其中一台必须能完整使用独立显卡跑 CUDA。这意味着 CPU 要多核心内存要多通道主板要能良好地隔离 PCIe 设备显卡最好能独立分配一组 PCIe 通道。先从 CPU 说起。如果预算有限不建议选太老的平台因为 IOMMU 分组和 PCIe 通道数量直接影响直通成功率。我自己用的是 AMD Ryzen 9 5950X16 核 32 线程开 2 到 3 台虚拟机毫无压力而且 X570 主板的 PCIe 通道分散比较合理。如果你追求更强性能直接上 7950X 也完全没问题。Intel 平台同样能直通12 代之后的分组也还行但有些消费级主板会把 PCIe 插槽和 M.2 共享通道导致显卡和 SSD 互相抢带宽。选 AMD 会省心不少不是因为它绝对比 Intel 强而是因为 AMD 平台的 IOMMU 拓扑在消费级里相对干净。主板的选择可能是整个项目里最需要花心思的环节。直通的基本前提是“IOMMU 分组”说白了就是每个 PCIe 设备能被内核独立管理分组越细将来把显卡、声卡、USB 控制器分开直通就越方便。华硕、微星的 X570/B550 中高端板子我都试过默认分组基本可用偶尔会遇到显卡和声卡捆在同一组的情况后面我会讲怎么处理。另一个硬指标是板载 PCIe 插槽数量和位置你需要至少一条 PCIe x16 插槽给显卡最好再留一条 x4 或 x8 给额外的 M.2 转接卡或万兆网卡。还有一点容易被忽略如果主板 BIOS 里有 ACSAccess Control Services相关的选项记得打开它能进一步拆分 IOMMU 分组。实在找不到这个选项后面也可以通过内核参数补救。内存是另一个大头。开虚拟机、加载大模型、跑数据预处理都非常吃内存。如果只打算跑 7B 甚至 13B 参数量的模型32GB 也能凑合但虚拟机本身要占用一部分宿主机的缓存和文件系统也要内存所以 64GB 基本是及格线预算允许直接上 128GB。频率和时序不是重点稳定性更关键建议优先考虑两根或四根同批次内存避免混插导致的不稳定。家庭场景用不带 ECC 的消费级内存没问题不必为了 ECC 去换整套工作站平台那个成本就高了。1.2 显卡选型AI 算力核心别只看跑分显卡是整个平台最核心的算力来源。普通用户的直通目标通常是 N 卡因为 CUDA 生态在 AI 领域几乎是绕不开的。如果只考虑“能直通”这个指标A 卡反而更容易一些因为它没有针对虚拟化环境的驱动检测机制直通进去基本不用折腾。但如果你要跑 Stable Diffusion、LLaMA、PyTorch 这类明显依赖 CUDA 的框架N 卡才是首选。我目前用的是 RTX 409024GB 显存对家庭环境来说已经非常充裕跑 13B 量化模型、微调小模型都不在话下。如果没有这么高的预算RTX 3090 或 3080 Ti 也是很好的选择尤其是 3090 的 24GB 显存在二手市场性价比很高。需要注意N 卡在虚拟机里容易触发驱动检测表现为设备管理器里显卡带黄色感叹号错误代码 43。这其实不是显卡坏了而是 NVIDIA 驱动检测到虚拟化环境后主动罢工。解决方案不是换卡而是要在虚拟机配置里隐藏 KVM 的虚拟化特征我后面会专门讲 XML 怎么写。另外尽量选公版或者非公版里供电设计比较规整的型号。直通后显卡会长期运行在虚拟化环境里供电不稳定的卡在满载时容易出现驱动崩溃、机器重启之类的问题。供电接口也要注意RTX 4090 一般需要 3 到 4 个 8pin 或原生 12VHPWR电源的峰值余量一定要留够。我用的电源是 1000W 金牌整机满载大概 600 到 700W余量很健康。买非模组电源时要提前确认主线长度显卡供电线最好独立走线不要用一分二转接线去带大功率卡。存储尽量分开。系统盘用一块 1TB 的 NVMe SSD虚拟机系统镜像和数据盘用另一块 2TB SSD 或者机械硬盘。我的方案是宿主机系统盘一块三星 980 Pro 1TB虚拟机镜像统一放在一块 2TB 的西部数据 SN770 上数据备份再单独挂一块 4TB 机械盘。这样既保证宿主机稳定虚拟机磁盘 IO 也不互相拖累。如果以后要做存储池可以考虑把多块盘组 RAID但家庭场景没必要一上来就搞复杂存储。2. 系统安装Ubuntu Server 22.04 LTS 的完整落地过程2.1 制作启动盘与 BIOS 设置系统我选的是 Ubuntu Server 22.04 LTS内核版本 5.15对 IOMMU 和 vfio 的支持已经很成熟24.04 我也试过也能用但 22.04 的第三方文档和兼容性资料更多踩坑时好搜。制作启动盘很简单用 balenaEtcher 或 Ventoy 把 ISO 写进 U 盘。Ventoy 的好处是以后想试其他发行版不用反复格式化直接把 ISO 丢进 U 盘就行。BIOS 设置是系统安装前最重要的一步。进入主板 BIOS 后先把 Secure Boot 关闭虽然 Ubuntu 可以配合 Secure Boot 安装第三方驱动但后续加载 vfio-pci 和自定义内核参数时会多出签名验证的麻烦。接着确认 CPU 虚拟化功能已经开启AMD 平台叫 SVM ModeIntel 平台叫 VT-x不同主板名称可能略有差异。对于直通还需要开启 VT-d 或 AMD-Vi这个选项一般在 Advanced - North Bridge 或 PCI Subsystem 里。除此之外把 Above 4G Decoding 和 Resizable BAR 打开前者让 64 位 PCIe 设备能使用高于 4G 的地址空间后者对显卡性能和直通都有帮助。BIOS 里还有一个隐藏的“大头”如果主板的 PCIe ACS 相关选项不全可能需要找到类似 ACS Enable 或 PCIe Split Bifurcation 的项目。不是所有主板都有没有也别急先安装系统后续用 pcie_acs_override 内核参数试试但要注意这个参数有一定风险只建议在确实存在分组问题时才用。2.2 安装 Ubuntu Server分区和基础配置从 U 盘启动后Ubuntu Server 安装界面是字符菜单我一般选“Ubuntu Server (minimized)”最小化安装后面再慢慢补包。网络配置这里先不用纠结装完系统再改成静态 IP 都行。到磁盘分区环节默认的“使用整个磁盘”是最省事的但对宿主机来说我更推荐手动分区创建一个 512MB 的 EFI 分区一个 100GB 的 ext4 根分区剩下的空间全部给 LVM 或直接给 /var/lib/libvirt 作为数据目录。当初我图省事全给根分区后来发现虚拟机镜像文件越来越大备份和扩容都很别扭。正确做法是把数据分区独立出来挂载到/srv/vm或/var/lib/libvirt下。如果你对 LVM 不熟悉直接用 ext4 也足够别把家庭环境搞成实验田。安装过程会自动创建第一个用户这一步要注意用户名尽量用简单的小写字母比如admin后面很多命令和配置都会引用它。系统装完后先更新软件源并升级sudo apt update sudo apt upgrade -y然后安装常用的基础工具net-tools、curl、wget、git、vim、htop、iotop这些以后排查问题都会用到。接着设置静态 IPUbuntu Server 22.04 使用 netplan配置文件在/etc/netplan/00-installer-config.yaml给出一个参考配置network: ethernets: enp1s0: dhcp4: false addresses: - 192.168.1.20/24 routes: - to: default via: 192.168.1.1 nameservers: addresses: - 223.5.5.5 - 8.8.8.8 version: 2修改后执行sudo netplan apply然后用ip a确认 IP。如果这台机器要长期作为服务器建议把宿主机上的 SSH 配置好并开启密钥登录后面大部分操作都可以躺着用终端完成。2.3 开启 IOMMU 并验证直通基础系统装完先不要急着装虚拟化要确认 IOMMU 已经在内核层面生效。编辑/etc/default/grub找到这一行GRUB_CMDLINE_LINUX_DEFAULTquiet splash改成GRUB_CMDLINE_LINUX_DEFAULTquiet splash amd_iommuon iommupt如果是 Intel 平台把amd_iommuon换成intel_iommuon。参数里的iommupt表示仅对需要直通的设备启用 IOMMU可以减少性能损耗。保存后执行sudo update-grub并重启。重启后检查 IOMMU 是否开启dmesg | grep -e DMAR -e IOMMU应该能看到类似AMD-Vi: Interrupt remapping enabled的输出。然后查看分组for g in /sys/kernel/iommu_groups/*; do echo IOMMU Group ${g##*/}: for d in $g/devices/*; do echo -e \t$(lspci -nns ${d##*/}); done done这一步很重要它会以分组为单位显示所有 PCIe 设备。显卡和声卡如果正好在同一个分组直通时就要一起直通否则就得借助 ACS 补丁拆分。我用的微星 X570 上RTX 4090 和它的 HDMI 音频刚好分在两个组这是最理想的情况。3. KVM 虚拟化环境部署3.1 安装 QEMU/KVM/libvirt 工具链KVM 是 Linux 内核自带的全虚拟化模块用户态的工具是 QEMU管理接口是 libvirt。Ubuntu 上安装非常方便sudo apt install -y qemu-kvm qemu-utils libvirt-daemon-system libvirt-clients bridge-utils virtinst virt-manager ovmfvirt-manager是图形化管理工具虽然宿主机可以没有桌面但我在家里配了一台显示器装了 GNOME 桌面来操作 virt-manager体验直观很多。完全不想装桌面的同学可以只保留virsh和virt-install命令行也能完成所有操作。装完后把当前用户加入libvirt和kvm组sudo usermod -aG libvirt,kvm admin然后检查 KVM 是否可用ls -l /dev/kvm virsh list --all/dev/kvm必须存在。如果不存在大概率是 BIOS 里的 SVM/VT-x 没开或者宿主机的内核模块kvm_amd没加载。用lsmod | grep kvm查看一下。3.2 网络规划桥接模式还是 NAT 模式虚拟机的网络我推荐用桥接模式这样虚拟机在局域网里有自己的 IP像一台独立机器访问宿主机、NAS、外网都方便。NAT 模式配置简单但宿主机重启后端口转发规则容易忘SSH 进虚拟机也要绕一圈不够直观。创建 Linux 网桥前先确认宿主机网卡的名称例如enp1s0。编辑/etc/netplan/00-installer-config.yaml把原来的物理网卡配置改成桥接配置network: ethernets: enp1s0: dhcp4: false bridges: br0: interfaces: [enp1s0] addresses: - 192.168.1.20/24 routes: - to: default via: 192.168.1.1 nameservers: addresses: - 223.5.5.5 - 8.8.8.8 parameters: stp: false forward-delay: 0应用后ip a里会出现br0物理网卡enp1s0不再占用独立 IP所有流量都走br0。以后在 virt-manager 里新建虚拟机网络直接选择“桥接到 br0”即可。如果你不想动宿主机现有网络也可以用 libvirt 默认的defaultNAT 网络只是后面访问虚拟机里的服务要麻烦一点点。3.3 创建第一台 Linux 虚拟机为直通先热身虚拟化环境刚装好不建议直接上显卡直通而是先建一台普通虚拟机把整个流程跑通。我习惯用 virt-install 命令行操作既方便脚本化也更容易排错。下面创建一个 8GB 内存、4 核 CPU、40GB 磁盘的 Ubuntu 桌面测试机sudo virt-install \ --name ubuntu-desktop \ --memory 8192 \ --vcpus 4 \ --cpu host-passthrough \ --disk path/srv/vm/ubuntu-desktop.qcow2,size40,formatqcow2 \ --network bridgebr0,modelvirtio \ --os-variant ubuntu22.04 \ --graphics spice \ --cdrom /home/admin/iso/ubuntu-22.04.3-desktop-amd64.iso这里特别说明一下--cpu host-passthrough让虚拟机直接使用宿主机的 CPU 型号和能力集尽量避免因 CPU 特性不一致而出现性能损失。对之后的显卡直通而言这是必要的因为很多驱动会依赖宿主机的 CPU 特性。--graphics spice表示先通过虚拟显示器安装装好后我们再做显卡直通把物理显卡替换进去。安装完虚拟机后可以先在虚拟机内安装qemu-guest-agent它能让宿主机和虚拟机之间更好地交互比如查看 IP、执行命令。4. KVM 显卡直通实操4.1 确认显卡编号和 IOMMU 分组前面提到过 IOMMU 分组这里进入实操。先找到显卡的厂商和设备 IDlspci -nnk | grep -iA3 nvidia输出类似0b:00.0 VGA compatible controller [0300]: NVIDIA Corporation GA102 [GeForce RTX 3080] [10de:2206]括号里的10de:2206就是设备 ID。记下 VGA 控制器和同组里 Audio 设备的 ID通常格式都是vendor:device。然后在/sys/kernel/iommu_groups/下的分组列表里找到你的显卡组确认组内的设备只有显卡和它的音频输出没有多余设备。如果同组里混入了 NVMe 控制器、USB 控制器后续直通会很痛苦因为一旦把整组直通给虚拟机宿主机就失去了这些设备。4.2 在宿主机上隔离显卡黑名单和 vfio-pci显卡直通的基本思路是让宿主机的驱动不去管理这块显卡而是把它交给通用的 vfio-pci 驱动接管。需要做两件事屏蔽显卡自带的内核驱动以及让 vfio-pci 在系统启动时就绑定到这块卡上。创建/etc/modprobe.d/blacklist-nvidia.confblacklist nvidia blacklist nouveau blacklist nvidiafb然后创建/etc/modprobe.d/vfio.conf内容填入你的显卡设备 ID以 10de:2206 和 10de:1aef 为例options vfio-pci ids10de:2206,10de:1aef这里要注意如果声卡和显卡在同一 IOMMU 分组必须把声卡的设备 ID 也写进去一起交给 vfio-pci。接着更新内核镜像sudo update-initramfs -u重启后执行lspci -nnk -s 0b:00.0如果看到Kernel driver in use: vfio-pci说明隔离成功。如果显示nvidia或nouveau说明黑名单没生效或者显卡设备 ID 写错了。4.3 使用 virt-manager 把显卡挂进虚拟机现在可以打开 virt-manager找到刚才创建的ubuntu-desktop虚拟机。先把虚拟机的显示设备从 SPICE 改为“无”或删除因为我们要把物理显卡直通进去不需要虚拟显卡了。然后在“添加硬件”里选择“PCI Host Device”在下拉列表选中你的 NVIDIA 显卡和它的音频设备完成添加。但用 virt-manager 添加完先别直接开机因为 N 卡存在驱动检测的问题。需要编辑虚拟机的 XML 配置隐藏 KVM 的虚拟化标识。执行virsh edit ubuntu-desktop找到cpu标签改成cpu modehost-passthrough checknone cache modepassthrough/ /cpu然后在features标签里加入features acpi/ apic/ kvm hidden stateon/ /kvm /featureshidden stateon/的作用是让虚拟机里的 CPUID 不再报告自己是 KVM 虚拟化环境这是解决 NVIDIA 驱动 error 43 最常见的方法。保存后先确保安装在虚拟机里的系统是 64 位 UEFI 引导因为大多数显卡直通案例都建议用 OVMF 而不是传统 BIOS。如果当初建虚拟机时选的 BIOS 引导建议删掉重建或者把虚拟机固件切换成 OVMF不然显卡在系统启动阶段可能黑屏。启动虚拟机。如果一切正常显示器应该会直接亮起并显示虚拟机的界面。安装 NVIDIA 驱动时我用的是官方.run文件驱动wget https://cn.download.nvidia.com/XFree86/Linux-x86_64/550.78/nvidia-driver_550.78_amd64.deb这里不展开怎么装驱动了Ubuntu 上可以用ubuntu-drivers autoinstall自动安装也可以手动安装 CUDA 仓库。驱动装好后在终端执行nvidia-smi能看到显卡信息和显存容量就证明直通成功了。4.4 直通后的常见问题速查表整个流程里最麻烦的是各种报错我把自己遇到过的典型问题整理成了一张表方便你对照处理现象可能原因解决办法虚拟机启动黑屏宿主机显示器无输出显卡没有真正被 vfio-pci 接管或固件不是 OVMF确认lspci -nnk显示Kernel driver in use: vfio-pci检查虚拟机引导固件Windows 虚拟机里显卡错误代码 43NVIDIA 驱动检测到虚拟化特征在 XML 中添加kvmhidden stateon//kvm重启虚拟机直通后 GPU 性能明显偏低PCIe 链路降速到 x8 或 x4检查显卡插槽是否插在 CPU 直出的 x16 插槽检查 Resizable BAR 是否开启宿主机重启后直通失效vfio-pci 没有在启动早期绑定设备确认/etc/modprobe.d/vfio.conf存在并已执行update-initramfs -uIOMMU 分组不理想显卡和 NVMe 同组主板 PCIe 拓扑问题尝试在 grub 中添加pcie_acs_overridedownstream注意该参数有安全和兼容性风险关于pcie_acs_override需要多说一句这个参数相当于让内核忽略硬件上对 ACS 的实现强行拆分 IOMMU 组。能解决不少消费级主板的问题但也可能让设备之间出现意外的 DMA 访问风险只建议在家庭环境且你能接受这个风险时使用。如果主板 BIOS 里能开启 ACS优先用 BIOS 方案。4.5 性能验证用 nvidia-smi 和一个小模型跑分直通完成后不要光看驱动识别就完事一定要做一次实际性能验证。我一般分两步第一步对比宿主机和虚拟机里nvidia-smi的功耗、温度、显存这些基础信息第二步跑一个简单的 AI 计算任务看看 GPU 是否真的参与了计算。假设你已经装了 Python 环境和 PyTorch可以在虚拟机的终端里写一个最简单的小脚本import torch print(torch.cuda.is_available()) print(torch.cuda.get_device_name(0)) x torch.randn(10000, 10000, devicecuda) y torch.mm(x, x) print(y.sum().item())如果输出True并且torch.cuda.get_device_name(0)能正确显示显卡型号说明 CUDA 环境可用。更贴近实际的做法是下载一个小型 ONNX 模型跑一次推理或者直接在 llama.cpp 里加载一个 7B 量化模型输入一段文本看 token 生成速度。以 RTX 4090 为例7B 量化模型的生成速度能到 20 到 30 tokens/s这个性能已经能覆盖大多数家庭 AI 场景。我自己的经验是直通不要只看跑分还要看长时间稳定性。跑一次负载 10 分钟以上观察 GPU 温度是否过高虚拟机是否有黑屏、崩溃、机器重启。如果连续跑 2 小时没有异常再拿去日常使用。5. 安装与直通过程中的几条个人心得写到这里已经覆盖了从硬件到系统再到直通的完整链路。最后分享几个比较琐碎但很影响体验的细节都是我在实际装机和长期使用中总结的。第一虚拟机固件建议直接上 UEFI (OVMF)。传统 BIOS 引导在直通后容易遇到显示初始化问题很多功能也受限制。新建虚拟机时如果安装的是 Windows记得选择对应的os-variant并开启 Q35 芯片组Q35 对 PCIe 直通的支持比老式的 i440FX 好得多。第二如果家里有多台设备需要访问这台 AI 服务器优先把 SSH 和远程桌面都配置好。宿主机上用 SSH虚拟机里可以根据系统装 xrdp 或 x11vnc然后通过宿主机转发端口实现远程访问。这样就算主机放在书房的角落也能在卧室的电脑上直接跑模型。第三数据备份不可忽视。直通本身不会损坏数据但如果你在虚拟机里做各种 AI 实验经常要下载很多模型权重几天下来硬盘空间就会告急。所以我习惯把/srv/vm单独挂载并定期用rsync同步到备份盘。这样就算宿主机系统崩了虚拟机镜像文件也不会跟着遭殃。第四功耗和散热一定要提前考虑。满载运行一张 RTX 4090 时整机发热非常可观机箱风道如果不好显卡温度会瞬间逼近 80 度。我的做法是给机箱加了顶部出风和前置进风并且把显卡风扇曲线调得激进一点。安静和性能在这套环境里很难兼得最好在装修机位时就预留好通风空间。最后这个小项目其实可以一直玩下去。第一台虚拟机先跑通 Ubuntu 桌面 CUDA后续你可以继续给这台虚拟机加挂 USB 控制器直通或者再开一台 Windows 虚拟机做视频剪辑、游戏串流也可以把宿主机上的其他 PCIe 设备比如采集卡、无线网卡分别直通给不同的虚拟机让一台机器变成真正的“家庭 IT 机房”。我个人现在的使用习惯是宿主机只负责虚拟化和存储Windows 虚拟机和 Linux AI 虚拟机同时待命两台虚拟机之间通过 virtio 网络高速互通体验完全不输给两台独立物理机。这套搭建过程看起来步骤多但只要把硬件基础打好系统参数配好后面基本是一马平川。我踩过的那些坑在上面的章节里都尽量写清楚了尤其是 IOMMU 分组和 NVIDIA 驱动检测问题属于“知道原理之后很简单不知道就卡一星期”的类型。希望这份实录能帮你少走几步弯路。