PVE 虚拟机部署 UNRAID:磁盘直通与阵列搭建指南

发布时间:2026/10/2 5:29:22
PVE 虚拟机部署 UNRAID:磁盘直通与阵列搭建指南
很多人第一次把 UNRAID 装进 PVE 虚拟机折腾到凌晨两点最后卡在“阵列里那块盘显示为设备缺失”这一行红字上。我当年也是这么过来的。这台组合本身不复杂——PVE 提供虚拟化和硬件直通能力UNRAID 提供灵活的存储池、共享和 Docker 生态两者叠在一起等于用一台机器同时干掉了“虚拟化平台”和“NAS”两件事。但它有一个和其他虚拟机完全不同的脾气UNRAID 极其依赖对底层物理磁盘的“真实视野”一旦你把它当成一台普通 Linux 虚拟机来建后面几乎必然会翻车。下面我把从硬件确认、虚拟机参数、磁盘直通、网络配置到阵列建立的完整链路拆开讲一遍包括我在每个环节踩过的坑适合已经装好 PVE、想在同一台机器上再叠一层 NAS 的人参考。1. 为什么把 UNRAID 塞进 PVE 虚拟机里跑1.1 裸机 UNRAID 与嵌套方案的本质差别裸机装 UNRAID 是最省心的路线硬盘、网卡、USB 引导盘全部原生可见SMART 能读、磁盘能休眠、阵列行为和你预期完全一致。代价是这台机器基本被 UNRAID 独占你没法再顺手跑个软路由、跑个 Windows 测试机、或者折腾几个不同的 Linux 发行版。我自己就吃过这个亏——早期一台裸机 UNRAID 用了两年后来想加个测试环境只能再买一台机器电费和空间都翻倍。把 UNRAID 放进 PVE 虚拟机本质是用一层 hypervisor 换取资源复用。PVE 负责硬件抽象和资源切分UNRAID 只在一个受控的环境里做它擅长的事。听起来很美但关键约束在于UNRAID 的存储阵列不是传统的 RAID它对每块成员盘都是独立文件系统直接读写校验盘通过实时计算奇偶校验来容错。这意味着它需要看到磁盘的真实设备节点能拿到磁盘序列号、容量、SMART 状态而不是一个被 QEMU 包装过的虚拟盘。所以整个方案的成败八成压在“磁盘怎么交给虚拟机”这一个问题上。很多人一上来就在 PVE 网页界面点“创建虚拟机”然后把物理盘当普通虚拟盘挂进去结果 UNRAID 里根本识别不到可用于阵列的裸设备或者识别到了但容量显示异常。这不是 PVE 的错是路径选错了。1.2 这套组合真正适合的人群和场景我个人认为PVE 套 UNRAID 最适合三种人。第一种是家里只有一台性能还不错的机器既想跑 NAS 做文件共享和备份又想在 PVE 上开几个轻量虚拟机做软路由、内网服务、测试环境一台机器全包。第二种是已经把 PVE 当主力的用户数据盘本来就挂在 PVE 主机上但受够了手工管理 ZFS 数据集和 Samba 配置的繁琐想换成 UNRAID 那种“插盘就能用、界面点点就会”的管理方式。第三种是喜欢折腾的人想先在这套组合上验证自己的存储方案等摸清楚了再决定要不要迁移到裸机。反过来有两种情况我建议直接放弃这个念头。一是你对性能极度敏感比如要用 UNRAID 里跑的虚拟机做主力办公机或游戏机——多一层虚拟化带来的延迟和调度开销是实实在在的虽然不夸张但在高负载下能明显感觉到。二是你只有一块盘或者两块盘本来就没什么阵列需求那直接用 PVE 自带的 ZFS 或者 LVM 建存储就够了再套一层 UNRAID 纯属增加故障点。提示如果你打算长期使用某个项目虚拟机方案更适合做“先行验证”把配置、阵列布局、Docker 清单都跑通之后再考虑是否迁移到裸机。反过来从裸机迁移到虚拟机要麻烦得多。2. 动手之前先把硬件和磁盘的账算清楚2.1 CPU 虚拟化能力和 IOMMU 分组必须先验证在 PVE 主机上第一件事不是建虚拟机而是确认两件事CPU 虚拟化扩展是否打开IOMMU 分组是否干净。前者决定了虚拟机能不能跑起来后者决定了你的 HBA 卡能不能整卡直通。先看虚拟化扩展。登录 PVE 的 SSH执行grep -E vmx|svm /proc/cpuinfo | head -1只要输出里有vmxIntel或svmAMD就说明 BIOS 里的虚拟化开关是打开的。如果什么都没输出去主板 BIOS 里找 Intel VT-x 或者 SVM Mode打开它。这一步听起来很基础但我遇到过一次很诡异的情况主板更新 BIOS 之后虚拟化开关被重置了PVE 上的虚拟机全部启动失败报的是“KVM 不可用”查了半天才发现是固件设置问题。接着确认 IOMMU。在 PVE 8 里编辑/etc/default/grub在GRUB_CMDLINE_LINUX_DEFAULT里加上intel_iommuon iommuptAMD 平台把intel_iommuon换成amd_iommuon。然后执行update-grub并重启。重启后检查是否生效dmesg | grep -e DMAR -e IOMMU看到 “DMAR: IOMMU enabled” 之类的输出就算成功。接下来是看分组这条命令我建议你直接存下来for g in /sys/kernel/iommu_groups/*; do echo Group ${g##*/}: for d in $g/devices/*; do echo -e \t$(lspci -nns ${d##*/}) done done输出里如果一块 SATA 控制器或者 HBA 卡独占一个分组那恭喜你整卡直通很干净。如果它和别的设备挤在同一个分组里就得考虑是加装 ACS 补丁内核比较折腾也有风险还是退而求其次走单盘映射的方案。我自己的经验是消费级主板上板载 SATA 控制器经常和一堆小设备挤在一起所以后来我干脆加了张独立的 HBA 卡专门负责数据盘直通起来省心太多。2.2 硬盘角色的划分要提前想明白在建虚拟机之前先拿张纸把每块盘的用途写清楚。UNRAID 的阵列有个硬性规则校验盘的容量必须大于或等于阵列中最大的数据盘这一点没得商量。所以如果你手上有一块 16T 和几块 8T那 16T 要么当校验盘要么单独做缓存不能混着用。我一般的规划是这样的角色数量建议直通方式说明系统盘1 块 SSD不直通做虚拟盘装 PVE 系统和虚拟机镜像UNRAID 引导1 个 U 盘USB 直通授权和配置都在这里数据盘N 块 HDD单盘映射或整卡直通组成阵列容量任意校验盘0 或 1 块 HDD同上容量需 ≥ 最大数据盘缓存池1-2 块 SSD单盘映射放 Docker、虚拟机、应用数据这里有个容易被忽略的点不要把 PVE 系统盘所在的控制器整卡直通给虚拟机。我曾经见过有人把唯一的 SATA 控制器直通出去结果 PVE 主机直接失联只能重装。如果你要用整卡直通务必确认那块卡上没有任何 PVE 系统盘或者正在被 PVE 挂载的数据盘。2.3 引导介质怎么准备直接影响后面的授权UNRAID 的引导方式和普通系统不一样它是从一个 U 盘启动的而且授权是跟引导设备的唯一标识绑定的。这一点非常关键因为你在虚拟机里怎么提供这个引导设备决定了后续授权能不能顺利识别。目前主流有两种做法。第一种是把物理 U 盘直通给虚拟机用lsusb找到它的厂商和产品 IDlsusb输出类似Bus 001 Device 004: ID 0781:5567 SanDisk Corp. Cruzer Blade那0781:5567就是你要的。然后在虚拟机配置里加qm set 200 -usb0 host0781:5567这种做法的好处是引导设备就是真实的物理设备标识不变只要之前做好的引导盘插上就能直接用配置和授权都不会丢。我目前用的就是这种方式插上去虚拟机重启几次都没出过问题。第二种是把引导盘做成镜像文件挂载。做法是先在一台机器上把 U 盘内容dd成镜像然后把镜像作为虚拟磁盘挂到虚拟机里引导。这种做法灵活不占用 USB 口但引导设备的标识会变化需要按官方流程重新处理授权。所以如果你已经用物理 U 盘跑了很久我建议直接直通 USB别折腾镜像。注意不论用哪种方式引导盘的配置目录一定要定期备份。UNRAID 的界面里有导出配置的入口把这个备份文件存到别的地方比什么快照都实在。3. 在 PVE 里创建这台“特殊”的虚拟机3.1 命令行建机比网页点选更可控PVE 的网页创建向导很好用但它默认的参数对 UNRAID 并不友好而且有些选项藏得比较深。我习惯直接用命令行建参数一目了然也方便复现。先创建一台基础虚拟机qm create 200 \ --name unraid \ --ostype l26 \ --machine q35 \ --bios ovmf \ --cpu host \ --sockets 1 \ --cores 4 \ --memory 16384 \ --balloon 0 \ --scsihw virtio-scsi-single \ --net0 virtio,bridgevmbr0 \ --onboot 1 \ --agent 1上面这几行里我刻意加了一个--balloon 0。内存气球在普通虚拟机上是个好东西能在主机内存紧张时回收虚拟机内存但对 UNRAID 来说它的 ZFS 缓存、Docker 容器和虚拟机都吃内存气球机制会导致性能曲线非常难看——有时候快有时候卡你根本找不到原因。所以直接关掉气球给一个固定值宁可多留点余量。3.2 机型、BIOS 和 CPU 类型这几个参数为什么这么填--machine q35选的是新一代的虚拟芯片组相比默认的 i440fx它对 PCIe 设备的模拟更接近真实硬件直通和外设识别都更顺。这个参数不写的话默认是 i440fx装 UNRAID 也能跑但有些 PCIe 相关功能会受限。--bios ovmf表示使用 UEFI 引导。UNRAID 从 6.10 版本开始支持 UEFI 启动用 OVMF 的好处是引导过程更规范也方便后续挂 EFI 分区。不过要注意用了 OVMF 就必须给它建一个 EFI 磁盘否则虚拟机启动会直接报错qm set 200 --efidisk0 local-lvm:1,efitype4m,pre-enrolled-keys0这里的pre-enrolled-keys0很重要。如果你保持默认值 1OVMF 会预置安全启动的密钥而 UNRAID 的引导程序没有签名安全启动就不会放行结果就是开机直接掉进 UEFI Shell 里什么提示都没有。我在这上面浪费过整整一个晚上最后发现是安全启动拦住了引导。--cpu host让虚拟机透传主机的 CPU 特性包括各种指令集扩展。这对 UNRAID 来说意义不小因为它内部的 ZFS、加密、压缩等功能都依赖较新的指令集用默认的kvm64会损失不少性能。3.3 磁盘控制器和缓存策略的选择--scsihw virtio-scsi-single是我强烈推荐的一个设置。相比默认的virtio-scsi-pcisingle 版本给每个磁盘分配独立的队列配合iothread能把并行 I/O 的性能优势发挥出来对多盘阵列的场景帮助明显。对于系统盘和虚拟磁盘我会额外配一下缓存策略。QEMU 的磁盘缓存有几档含义差别很大缓存模式行为适用场景none直接写宿主不走主机页缓存直通物理盘、需要数据一致性writeback走主机页缓存定期刷盘性能优先但掉电有风险writethrough写穿不缓存写操作对数据一致性要求极高directsync类似 writethrough 且绕过缓存特殊场景性能较低对直通的物理盘我一律用cachenone。理由很直白UNRAID 自己有文件系统和校验逻辑如果再叠一层主机页缓存一是数据一致性难以保证二是磁盘休眠基本就别想生效了——主机随时可能因为缓存刷盘把盘唤醒。如果是本地 LVM 上的虚拟系统盘用writeback问题不大毕竟那上面放的是虚拟机镜像不是你的宝贵数据。4. 磁盘直通UNRAID 阵列能不能活的关键4.1 整卡直通和单盘映射的根本区别这是全文最重要的一个选择。UNRAID 的阵列成员盘本质上需要“裸设备访问”而虚拟化层有两种方式提供它。整卡直通是把整块 HBA 或 SATA 控制器通过 PCIe 直通交给虚拟机。虚拟机会以为它独占这块卡能枚举卡上所有磁盘读到完整的序列号、型号、SMART 信息也能下发休眠指令。这是最接近裸机的方案UNRAID 的各种磁盘管理功能都能正常工作。代价是这块卡上的资源对 PVE 主机完全不可见了而且 IOMMU 分组必须干净。单盘映射是用 PVE 的qm set命令把主机上的某个物理块设备直接分配给虚拟机qm set 200 -scsi1 /dev/disk/by-id/ata-WDC_WD40EFRX_1234567890注意这里必须用/dev/disk/by-id/下面的稳定路径而不是/dev/sdb这种随时会变的设备名。UNRAID 认盘的时候会记录设备标识如果 PVE 重启后磁盘顺序变了用/dev/sdX会导致虚拟机认到错误的盘严重的话就是数据损坏。我自己有过一次教训给机器加了块新盘重启后sdb变成了sdc虚拟机的配置还指向sdb结果 UNRAID 把一个不属于阵列的盘当成成员盘报了“设备缺失”的错折腾了很久才理清楚。单盘映射的缺点也很明确UNRAID 里看到的是一块虚拟盘SMART 数据基本读不到界面里的 SMART 信息会显示为空或者不可用磁盘休眠也几乎失效。好处是 IOMMU 分组不干净的时候也能用配置灵活。4.2 用 qm set 映射物理盘的完整过程假设你已经确认了要交给 UNRAID 的物理盘第一步是在 PVE 主机上确认它没有被挂载、没有文件系统、没有加入任何 ZFS 池lsblk -f看到某个盘没有挂载点、没有文件系统类型才说明它是空闲的。如果它之前属于某个 ZFS 池先用zpool destroy处理掉别硬来。第二步找到它的稳定路径ls -l /dev/disk/by-id/ | grep -i ata第三步把它挂到虚拟机上。这里有个细节如果虚拟机的 SCSI 控制器已经用来挂引导盘了注意编号别冲突。我一般让引导盘占sata0数据盘从scsi1开始排qm set 200 -scsi1 /dev/disk/by-id/ata-WDC_WD40EFRX_XXX,cachenone,aionative qm set 200 -scsi2 /dev/disk/by-id/ata-WDC_WD40EFRX_YYY,cachenone,aionative qm set 200 -scsi3 /dev/disk/by-id/ata-WDC_WD40EFRX_ZZZ,cachenone,aionativeaionative在 Linux 主机上配合cachenone能拿到最好的直通性能因为它是异步的不需要 QEMU 额外开线程池。如果换aiothreads虚拟机会占一个 iothread性能会略低一些。第四步检查虚拟机配置文件确认磁盘顺序和参数无误cat /etc/pve/qemu-server/200.conf这个文件我建议每次改完都看一眼。因为 UNRAID 认盘是按顺序和 ID 走的如果这里顺序错了它会提示“磁盘顺序变更”虽然一般能自动识别但总归是个隐患。4.3 直通之后SMART、序列号和休眠还剩多少这是很多人关心的点。我实测下来结论是这样的单盘映射的情况下UNRAID 的磁盘页面能看到容量、能看到型号型号是从虚拟设备信息里来的但SMART 数据读不到温度信息也没有。对于只想跑个 NAS 存文件的人来说这问题不大反正你有 PVE 主机可以监控硬盘健康。但如果你很在意磁盘健康预警那就得整卡直通。整卡直通的做法稍微复杂点。先在 PVE 主机上找到 HBA 卡的 PCI 地址lspci -nnk | grep -A3 -i sata\|sas拿到类似03:00.0的地址后把它绑定到 vfio 驱动。创建/etc/modprobe.d/vfio.confoptions vfio-pci ids1000:0072其中1000:0072是设备的 vendor:device ID从lspci -nn的输出里能看到。同时要在黑名单里屏蔽掉它原来的驱动比如blacklist mpt3sas blacklist ahci然后update-initramfs -u -k all并重启。重启后用lspci -nnk确认这个设备使用的是vfio-pci再在虚拟机里加qm set 200 -hostpci0 0000:03:00,pcie1整卡直通成功之后UNRAID 里会看到卡上所有磁盘SMART、序列号、休眠全部正常。我在一台机器上跑了两年多磁盘休眠确实生效了功耗和噪音都明显下降。一个忠告黑名单驱动之前务必确认你的 PVE 系统盘不在这个控制器上。否则重启后系统盘失去驱动机器直接起不来只能进恢复模式抢救。5. 网络打通从 PVE 网桥到 UNRAID 的 br05.1 网桥模式下虚拟网卡型号的选择PVE 默认建好的vmbr0就是一个 Linux 网桥虚拟机接上去就等同于接在同一个二层网络里同网段的设备能直接互相访问。这一步基本不用改。麻烦的是虚拟网卡的型号。我给的命令里用的是virtio这是性能最好的选择UNRAID 较新的内核版本都自带virtio_net驱动开机就能识别。但如果你用的是比较老的 UNRAID 版本内核里可能没有这个驱动开机后会显示“没有网络接口”界面也进不去这时候就抓瞎了。我的做法是先保险地试e1000跑起来之后再考虑换成virtio。切换方法qm set 200 --net0 virtio,bridgevmbr0换完之后进 UNRAID在“网络设置”里会看到新网卡重新配置一下 IP 就行。两种型号的实际性能差距在日常文件共享场景下感受不明显但如果你跑大量小文件传输或者要跑内网服务virtio 的优势就出来了。另外如果你的 PVE 主机有多个物理网口且你已经把其中一个专门分给了虚拟机用的网桥那 UNRAID 里的br0桥接配置会比较自然。如果只有一个网口所有流量都挤在vmbr0上也能跑只是要注意别把 PVE 管理口和 UNRAID 的业务口抢出问题来。5.2 UNRAID 侧配置静态 IP 的完整流程虚拟机第一次启动后UNRAID 默认用 DHCP 拿地址。你可以在 PVE 里看虚拟机的控制台输出找到它拿到的 IP然后浏览器访问http://那个IP。进去第一件事就是把网络设置改成静态地址理由很简单这是个 NASIP 飘来飘去会让所有挂载、Docker 映射、内网服务全部失效。在 UNRAID 的“设置 - 网络设置”里把“获取 IP 地址”从 DHCP 改成静态然后填IPv4 地址比如192.168.1.10子网掩码255.255.255.0网关你的路由器地址DNS路由器地址或者公共 DNS这里有个坑改完网络设置之后不要点“应用”直接关机再启动。因为 UNRAID 在运行中重启网络栈的时候如果配置有错你可能就再也连不上了只能通过 PVE 的虚拟控制台去改。我吃过这个亏改成了192.168.1.10结果和路由器地址撞了整个网络抖动最后只能用 PVE 控制台连进去手动改回来。静态 IP 配好之后把vmbr0上的 DHCP 服务确认没在瞎发地址别让同一个网段有两个 DHCP 服务器。这个在家庭环境里很容易出问题尤其是你 PVE 里还跑了软路由的情况下。5.3 同网段互访和主机名解析的几个细节网络通不通用ping就能验证。在 PVE 主机上ping 192.168.1.10在 UNRAID 上ping一下 PVE 主机的地址两边通就说明基础链路没问题。接下来几个细节值得处理一下。第一UNRAID 的主机名和 SMB 名称建议改成有辨识度的别用默认的Tower不然你有两台设备的时候会分不清谁是谁。第二如果要在 PVE 里访问 UNRAID 的共享直接在 PVE 上挂载 SMB 或者 NFS 都行但注意挂载路径别和 PVE 自己的存储冲突。第三如果你在 UNRAID 里启用了br0桥接比如要跑虚拟机用独立的 IP那会占用一个物理网口虚拟环境下这个操作需要谨慎因为网卡是虚拟的桥接行为跟物理机不一样。我一般不用 UNRAID 的桥接功能虚拟机直接在 PVE 层面管网络拓扑更清晰。UNRAID 只负责存储和 Docker职责单一出问题的概率小得多。6. 首次开机到阵列建立的完整过程6.1 引导设备和授权绑定的那些事虚拟机第一次开机你会看到 UNRAID 的引导菜单和一堆内核日志。如果卡在引导阶段不动了最常见的原因是引导设备没配对。这时候回到 PVE 检查虚拟机的boot顺序确认 USB 或者引导盘在前qm set 200 --boot orderusb0;sata0顺序写错了也没关系进去 BIOS 改一下就行PVE 的控制台里按 Esc 就能进 UEFI 设置界面。引导成功之后你会看到 UNRAID 的 Web 界面。第一次进去需要设置 root 密码然后开始注册授权。这里就是前面强调引导设备的原因授权是跟引导盘的唯一标识绑定的你换一个引导设备就得重新走一遍流程。所以一旦跑起来就别随便动引导盘了。如果你之前已经在别的地方用过 UNRAID可以把导出的配置直接恢复进去阵列布局、共享设置、Docker 容器都在里面。我迁移过一次用配置备份恢复之后除了磁盘顺序需要确认一遍其他都是原样省了大量重配时间。6.2 建立阵列的顺序和校验盘的取舍进入“主界面”所有被识别到的磁盘会列出来。这时候你会看到“阵列操作”区域需要给每块盘分配角色。顺序是这样的先选校验盘如果有再选数据盘。UNRAID 有个设计我得夸一下——阵列里的数据盘可以单独读取这也是它和其他 RAID 方案最大的不同。就算校验盘挂了你拔下任何一块数据盘插到别的机器上都能直接读出里面的文件。这个特性在数据恢复场景下价值极高。校验盘要不要配我的建议是看数据重要性。如果你存的都是些能重新下载的影视资源完全可以不配省一块盘的钱和电。但如果有照片、文档、工作资料这类不可再生的数据一块校验盘是底线。注意校验盘只提供一块盘损坏的容错两块盘同时坏就救不回来了所以重要数据还是要有异地备份。阵列建立之后会有一个“奇偶校验”的过程盘越多、容量越大同步时间越长。8T 的盘大概要十几个小时这个过程中不要动阵列不要拔盘让它跑完。6.3 共享、用户和 Docker 的落地配置阵列起来之后先把共享建好。UNRAID 的共享概念比较直观一个共享就是一个顶层目录可以指定它使用哪块盘、是主存储还是缓存优先。我一般这样分media影视资源直接放阵列不用缓存documents文档和照片用缓存优先写入快backup备份目标直接放阵列appdataDocker 应用数据必须放 SSD 缓存池否则数据库类的容器会被机械盘拖死appdata这一条尤其重要。刚开始我把 Docker 的 appdata 放在阵列上结果一些用 SQLite 的容器响应慢得离谱日志里全是 I/O 等待。后来移到 SSD 缓存池问题立刻消失。Docker 服务需要在设置里启用还要指定镜像文件的位置。默认镜像放在/var/lib/docker重启就没了必须改到缓存池上路径类似/mnt/cache/docker.img。虚拟机也建议放在缓存池用 SSD 跑系统盘体验完全不一样。7. 踩坑实录我在这个过程里遇到的五个坑7.1 开机掉进 UEFI Shell什么提示都没有这是我遇到的第一个坑表现是虚拟机启动后直接停在一个黑底白字的命令行界面上像是个简易的 Shell敲什么都没反应。当时以为是引导盘没做好重新做了一遍还是这样。排查过程是这样的先在 PVE 控制台里按 Esc 进 UEFI 设置看引导设备列表里有没有那个 U 盘。有说明设备识别正常。然后在 UEFI 里手动执行引导能看到 UNRAID 的启动菜单一闪而过又被踢回来。这时候我才想到安全启动的问题——果然去看虚拟机的 EFI 磁盘配置pre-enrolled-keys1。解决办法就是前面提过的把 EFI 磁盘重建指定pre-enrolled-keys0qm set 200 --delete efidisk0 qm set 200 --efidisk0 local-lvm:1,efitype4m,pre-enrolled-keys0重建 EFI 磁盘会清掉里面的 UEFI 变量所以虚拟机的引导顺序之类设置会重置记得重新配一遍。7.2 阵列里磁盘显示“设备缺失”的几种原因这个报错我在不同阶段遇到过三次原因完全不同值得单独说一下。第一次是设备路径用了/dev/sdX加了一块新盘之后顺序变了UNRAID 认到的盘和记录的对不上。改成/dev/disk/by-id/之后问题消失这也是我后来一直坚持用稳定路径的原因。第二次是磁盘之前属于一个 ZFS 池虽然我用zpool destroy删了池但盘上还残留着 ZFS 的元数据标签UNRAID 读盘的时候识别到了判定这块盘“不属于阵列”。解决办法是用wipefs -a清掉盘上的所有签名wipefs -a /dev/disk/by-id/ata-XXX注意这条命令会清掉磁盘上的所有文件系统签名执行前务必确认这块盘的数据已经不需要了或者已经备份好了。第三次比较隐蔽我在 PVE 主机上不小心把这块盘挂载了一下想看看里面有什么结果挂载点虽然在重启后消失了但/etc/fstab里留了一行记录导致系统启动时尝试挂载已经分配给虚拟机的盘两者抢设备UNRAID 里就报设备缺失。教训是分配出去的物理盘在 PVE 主机上必须保持“完全不管”的状态fstab里不能有任何相关记录。7.3 网络时通时断问题出在网卡型号和 MTU有一段时间我发现 UNRAID 的 Web 界面偶尔打不开但过一会儿又好了ping也是断断续续。查了很久没找到原因直到我在 PVE 里看虚拟机的网络流量发现有大包超时的情况。最后定位到两点。一是网卡型号用了e1000在高负载下虚拟网卡的模拟开销比较大容易出现丢包。换成virtio之后明显好转。二是 MTU 不一致我在 PVE 的vmbr0上设了 jumbo frame但 UNRAID 侧的网卡还是默认的 1500导致大包传输时被丢弃。统一成 1500 之后就稳定了。这个经验告诉我虚拟化环境下的网络问题先从“两端参数是否一致”查起比一开始就怀疑硬件要高效得多。7.4 快照和 UNRAID 阵列的相处方式PVE 的快照功能很好用但它只能快照虚拟磁盘对直通的物理盘完全无能为力。我一开始没意识到这点给 UNRAID 虚拟机做了个快照然后改了些配置想着出问题就回滚。结果回滚之后虚拟机的引导配置回到了旧状态但阵列里的数据盘还是新的配置和数据对不上UNRAID 报了一堆错。正确的心态是直通盘上的数据快照保护不了。UNRAID 自己的配置备份导入导出功能才是可靠的保护手段阵列数据的保护靠的是校验盘和外部备份。给跑 UNRAID 的虚拟机做快照最多只能拿来保护引导配置别指望它保护数据。7.5 性能对不上CPU 类型和缓存策略的影响有段时间我总觉得 UNRAID 里的文件传输速度比裸机慢一截测了一下大概差 20% 左右。排查下来有几个原因叠加。CPU 类型从默认的kvm64改成host之后压缩和校验计算的速度明显提升因为host模式会透传主机的指令集扩展。磁盘缓存策略从writeback改成none配合aionative减少了双重缓存带来的开销。还有一个是内存给少了ZFS 需要足够的内存做 ARC 缓存我给到 16G 之后热数据的读取速度提升非常明显。处理完之后性能差距缩小到 5% 以内日常用基本感觉不到。所以如果你觉得虚拟化方案的性能不对劲先别急着下结论说“虚拟化就是慢”把这几项调一遍再测。8. 长期维护升级、备份和资源分配的经验跑起来只是开始长期稳定才是考验。我在两台机器上跑了三四年总结了几条经验。PVE 大版本升级之前一定先把 UNRAID 虚拟机关机。PVE 升级过程会重启主机如果虚拟机设了onboot1升级到一半的 PVE 可能还没准备好虚拟机启动会出各种奇怪的问题。我现在养成的习惯是升级前qm stop 200升级完确认 PVE 正常再手动启动。引导盘的备份要定期做。UNRAID 界面里能导出配置压缩包我一般每个月导一次存到阵列里和外部存储各一份。这个文件包含了你所有的阵列布局、共享设置、用户和 Docker 配置恢复起来比重新配一遍快太多。资源分配上别把 PVE 主机的资源榨干。如果你的 PVE 主机有 32G 内存给 UNRAID 16G 是比较舒服的分配留一部分给 PVE 自己和其他虚拟机。CPU 核心数也一样UNRAID 的 ZFS 和校验计算是多线程的核心给少了会拖慢但给太多也没意义4 到 6 个核心对家庭场景够用了。还有一点UNRAID 里的虚拟机功能我基本不用。既然已经在 PVE 上跑虚拟机就统一在 PVE 里管理网络、存储、备份策略都在一层里比跨两层管理清晰。UNRAID 我只让它干两件事管存储和跑 Docker。职责越单一出问题的面就越小。最后分享一个我用了很久的小技巧把 UNRAID 的 Web 界面地址和 PVE 的管理地址都加进浏览器书签栏再在 PVE 里给这台虚拟机加个描述写清楚它用了哪些物理盘、直通方式是什么、引导盘是哪个 USB 设备。等你半年后再来看这台虚拟机不至于对着配置发呆重新翻一遍/etc/pve/qemu-server/200.conf才知道当初怎么设的。