PVE + Arc Loader 群晖部署:核显 SR-IOV、跨机型数据救援与 NVMe 存储池重建实录
一次完整的 PVE 9.1 + DSM 7.2.2 (SA6400) 部署过程:从 SR-IOV 核显直通,到跨机型(SA6400 ↔ NAS-8100T)三盘数据迁移,再到突破 NVMe 兼容性限制重建存储池。包含所有踩坑点和最终方案。
目录
- 环境信息
- Part 1: PVE 9.1 SR-IOV 核显配置
- Part 2: 创建群晖 VM 并配置直通
- Part 3: Arc Loader 引导 DSM
- Part 4: 数据救援(关键章节)
- Part 5: NVMe 兼容性突破与存储池重建
- Part 6: 数据迁移到 Volume3
- 踩坑点与经验总结
- 附录:关键命令速查
环境信息
硬件
| 组件 | 型号 |
|---|---|
| CPU | Intel Pentium Gold 8505 (Alder Lake-UP3, 12 代) |
| 核显 | UHD Graphics (Device ID 8086:46b3) |
| 系统盘 | Samsung SSD 980 1TB (nvme1n1,PVE 系统) |
| NAS 数据盘 1 | Fanxiang S100Pro 256GB SATA SSD (sda) |
| NAS 数据盘 2 | TOSHIBA HDWG740UZSVC 4TB HDD (sdb) |
| NAS 数据盘 3 | Predator GM7 2TB NVMe (nvme0n1) |
软件
| 组件 | 版本 |
|---|---|
| Proxmox VE | 9.1.1 (Debian 13 Trixie) |
| PVE 内核 | 7.0.2-2-pve(初始 6.17.2,后被 apt 升级) |
| Arc Loader | 3.1.0 |
| DSM | 7.2.2-72806 |
| 模拟机型 | SA6400 (Atom C3xxx, epyc7002 平台) |
数据状态
三块 NAS 数据盘均含有重要数据:
sda(256G SSD)→ 来自 NAS-8100T 机型,标签NAS-8100T:2sdb(4T HDD)→ 来自 SA6400,标签SA6400:3nvme0n1(2T NVMe)→ 来自 SA6400,标签SA6400:4,含 MyDocker (24G, 146905 文件) 和 HighSpeed (2.1G, 2032 文件)
核心需求:保留三块盘所有数据,启用核显硬解,跑 Docker 项目集合。
Part 1: PVE 9.1 SR-IOV 核显配置
1.1 安装 Proxmox 内核与 Headers
PVE 9 默认 ISO 安装后,只启用了企业订阅源,需切换到非订阅源才能装齐内核 headers。
报错示例
# 直接执行会失败
apt install proxmox-default-kernel proxmox-default-headers
# Error: Unable to locate package proxmox-default-headers
解决:配置非订阅源
PVE 9 使用 deb822 格式的 .sources 文件:
# 1. 禁用企业源(401 报错)
mv /etc/apt/sources.list.d/pve-enterprise.sources /etc/apt/sources.list.d/pve-enterprise.sources.disabled
mv /etc/apt/sources.list.d/ceph.sources /etc/apt/sources.list.d/ceph.sources.disabled
# 2. 添加非订阅源(中科大镜像,国内更快)
cat > /etc/apt/sources.list.d/pve-no-subscription.sources << 'EOF'
Types: deb
URIs: https://mirrors.ustc.edu.cn/proxmox/debian/pve
Suites: trixie
Components: pve-no-subscription
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
EOF
# 3. 更新 + 安装
apt update
apt install -y proxmox-default-kernel proxmox-default-headers
💡 关键:PVE 9 的 metapackage 是
proxmox-default-headers,不是proxmox-headers-X.Y直接拼接。
1.2 安装 i915 SR-IOV DKMS 模块
# 安装编译工具
apt install -y build-essential dkms sysfsutils
# 下载并安装 i915-sriov-dkms
wget -O /tmp/i915-sriov-dkms_2026.05.06_amd64.deb \
"https://github.com/strongtz/i915-sriov-dkms/releases/download/2026.05.06/i915-sriov-dkms_2026.05.06_amd64.deb"
dpkg -i /tmp/i915-sriov-dkms_2026.05.06_amd64.deb
1.3 配置内核启动参数
编辑 /etc/default/grub:
GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on i915.enable_guc=3 i915.max_vfs=7 module_blacklist=xe"
参数说明:
| 参数 | 作用 |
|---|---|
intel_iommu=on |
启用 Intel VT-d / IOMMU |
i915.enable_guc=3 |
启用 GuC + HuC 固件加载(SR-IOV 必需) |
i915.max_vfs=7 |
最多创建 7 个 VF(Intel UHD 上限) |
module_blacklist=xe |
禁用 xe 驱动,避免抢占 |
更新 GRUB 与 initramfs:
update-grub
update-initramfs -u
1.4 配置 sysfs 自动创建 VF
echo "devices/pci0000:00/0000:00:02.0/sriov_numvfs = 7" > /etc/sysfs.conf
systemctl enable --now sysfsutils
重启:
reboot
1.5 验证 SR-IOV 成功
# 应该看到 1 PF + 7 VF
lspci -nn | grep -i vga
# 期望输出:
# 00:02.0 VGA compatible controller [0300]: Intel Corporation Alder Lake-UP3 GT1 [UHD Graphics] [8086:46b3] (rev 0c)
# 00:02.1 VGA compatible controller [0300]: ...
# ... (.1 - .7 共 7 个 VF)
# 验证 VF 数量
cat /sys/devices/pci0000:00/0000:00:02.0/sriov_numvfs # 应输出 7
cat /sys/devices/pci0000:00/0000:00:02.0/sriov_totalvfs # 应输出 7
# 验证 IOMMU
dmesg | grep -e DMAR -e IOMMU
Part 2: 创建群晖 VM 并配置直通
2.1 创建 VM(关键参数)
PVE Web UI 创建 VM(假设 ID 100):
| 类别 | 配置 |
|---|---|
| OS | Do not use any media |
| System | Machine: q35 / BIOS: OVMF (UEFI) / EFI Disk: ☑ |
| Disks | 删除默认磁盘,稍后手动添加 |
| CPU | Type: host / Cores: 4 |
| Memory | 12 GB(根据需求,禁用 Ballooning) |
| Network | Bridge: vmbr0 / Model: Intel E1000 |
⚠️ 创建时不要勾“Start after created”。
2.2 导入 Arc Loader 引导镜像
# 把 arc.img 导入为 sata0(必须 SATA 引导)
qm importdisk 100 /root/arc.img local-lvm --format raw
# Web UI 把 Unused Disk 设置为 sata0
# 启动顺序:order=sata0
qm set 100 -boot order=sata0
2.3 三块盘 SATA 仿真直通
qm set 100 \
-sata1 /dev/disk/by-id/ata-Fanxiang_S100Pro_256GB_MX_00000000000010031,ssd=1,discard=on \
-sata2 /dev/disk/by-id/ata-TOSHIBA_HDWG740UZSVC_4550A014FX6J,discard=on \
-sata3 /dev/disk/by-id/nvme-Predator_SSD_GM7_M.2_2TB_PSBH53380701353,ssd=1,discard=on
💡 NVMe 走 SATA 仿真直通的好处:配置简单,PVE 仍可访问。代价:DSM 看作 SATA SSD,不能用作真正的 NVMe 缓存。
2.4 添加核显 VF 直通
# 把 VF1(00:02.1)透传给 DSM
qm set 100 -hostpci0 0000:00:02.1,pcie=1
⚠️ 永远不要把 PF(00:02.0)透传给 VM,否则会让所有 VF 崩溃,整机核显挂掉。
2.5 启动前的最终配置确认
qm config 100
关键配置项:
balloon: 0
bios: ovmf
boot: order=sata0
cores: 4
cpu: host
hostpci0: 0000:00:02.1,pcie=1
machine: q35
sata0: local-lvm:vm-100-disk-1,size=1852M
sata1: /dev/disk/by-id/ata-Fanxiang...
sata2: /dev/disk/by-id/ata-TOSHIBA...
sata3: /dev/disk/by-id/nvme-Predator...
Part 3: Arc Loader 引导 DSM
3.1 关键决策:机型选择
SA6400 vs DS920+ 的权衡:
| 维度 | SA6400 | DS920+ |
|---|---|---|
| 老数据兼容性(我的 sdb/nvme0n1) | ✅ 完美匹配 | ❌ 机型不匹配,无法识别 |
| 原生 i915 核显硬解 | ❌ 无 | ✅ 支持 |
| Docker + GPU 硬解(VAAPI/QSV) | ✅ 通过 Docker 也能用 | ✅ |
| NVMe 作为存储池 | ⚠️ 需要 nvmesystem addon | ✅ 原生 |
最终选择 SA6400——保留旧数据优先,核显硬解走 Docker 容器路径。
3.2 Arc Loader 启动流程
启动 VM 后进入 Arc Loader 菜单:
qm start 100
Auto Mode 的特点
Auto Mode 会扫描已有盘的 RAID 标签自动选机型——正好我的盘标签是 SA6400:3 / SA6400:4,Arc 自动选了 SA6400,省了手动选择。
必须勾选的 Addons
通过 Webconfig (http://<VM_IP>:7080)操作 Addons 最方便。Arc 3.1.0 关键 addons:
| Addon | 状态 | 作用 |
|---|---|---|
acpid |
✅ 默认 | ACPI 电源管理 |
arcdns |
✅ 默认 | Arc DNS |
cpuinfo |
✅ 默认 | 显示真实 CPU 型号 |
hddb |
✅ 默认 | 加 DSM 兼容性 + M.2 Volume |
reducelogs |
✅ 默认 | 减少日志 |
storagepanel |
✅ 默认 | 存储面板增强 |
updatenotify |
✅ 默认 | 更新通知 |
vmtools |
✅ 默认 | qemu-ga + open-vm-tools |
nvmesystem |
⚠️ 必须手动勾 | 让 NVMe 可作为存储池(关键!) |
nvmevolume |
⚠️ 必须手动勾 | 让 M.2 当 Volume 用 |
💡 第一次部署的最大坑:Auto Mode 不会自动启用
nvmesystem/nvmevolume,导致 NVMe 在 DSM 里完全看不到。改完 addons 后选Rebuild Loader (existing)重新打包(几分钟,不用重新下载 pat)。
3.3 DSM 启动后的初步状态
# /proc/mdstat
md3 : active raid1 sata3p5[0] # sdb (4T 东芝)
md2 : active raid1 sata2p3[2] # sda (256G SSD)
md1 : active raid1 sata3p2[0] sata2p2[3] # DSM swap
md0 : active raid1 sata3p1[0] sata2p1[3] # DSM 系统
# /dev/dri/
card0 renderD128 # ✅ 核显硬解可用!
- ✅ Volume1 (256G SSD) 自动恢复
- ✅ Volume2 (4T HDD) 自动恢复
- ✅ 核显
/dev/dri/renderD128在(Auto Mode 居然加了 i915) - ❌ Volume3 (NVMe) 显示「丢失」
Part 4: 数据救援(关键章节)
4.1 问题诊断
进入 DSM 存储管理器,看到:
存储池 3 - 丢失
RAID 类别:Synology Hybrid RAID (SHR) (无数据保护)
必需硬盘信息:M.2 硬盘 1 (SSD), HS/MAXIO - Predator SSD GM7 M.2 2TB (1.9 TB)
关键的 SSH 诊断(在 DSM 内执行):
ls /dev/nvme*
# 输出:/dev/nvme-fabrics (没有 nvme0n1!)
真相揭示
由于 PVE 走的是 SATA 仿真直通,DSM 内核根本没识别为 NVMe 物理设备,而是把它当作普通 SATA 盘:
fdisk -l 2>/dev/null | grep "Disk /dev"
# Disk /dev/sata2: 238.5 GiB ← sda (256G SSD)
# Disk /dev/sata3: 3.7 TiB ← sdb (4T HDD)
# Disk /dev/sata4: 1.9 TiB ← nvme0n1 (2T NVMe!) ⭐
NVMe 在 DSM 里是 /dev/sata4,不是 /dev/nvme0n1。
4.2 验证数据完整性(只读)
# 看分区表
fdisk -l /dev/sata4
# /dev/sata4p1 8G Linux raid autodetect ← 原 SA6400 系统
# /dev/sata4p2 2G Linux raid autodetect ← 原 swap
# /dev/sata4p5 1.9T Linux raid autodetect ← 数据分区!
# 验证 RAID 元数据(关键)
mdadm --examine /dev/sata4p5
# Name : SA6400:4
# State : clean
# Array Size : 1989673280 KiB (1897.50 GiB)
# Checksum : f4c031d6 - correct ✅
4.3 三层只读组装挂载
整个救援流程的核心,确保绝对只读:
mount /mnt/rescue (ro) ← 第 1 道:挂载 ro
↓
/dev/vg3/volume_3 (LV) ← LVM 层
↓
/dev/md10 (read-only) ← 第 2 道:md readonly 拒绝任何写
↓
/dev/sata4p5 (NVMe 物理分区) ← 数据原位置,绝不被改
第一步:只读组装 RAID
mdadm --assemble --readonly /dev/md10 /dev/sata4p5
# mdadm: /dev/md10 has been started with 1 drive.
cat /proc/mdstat | grep md10
# md10 : active (read-only) raid1 sata4p5[0]
第二步:看文件系统类型
blkid /dev/md10
# /dev/md10: UUID="BoDCIL-..." TYPE="LVM2_member"
是 LVM,需要进一步处理。
第三步:激活 vg3 中的 LV
vgchange -ay vg3
# 2 logical volume(s) in volume group "vg3" now active
lvs vg3
# volume_3 vg3 -wi-a----- 1.85t
blkid /dev/vg3/volume_3
# /dev/vg3/volume_3: LABEL="2025.07.06-08:36:47 v72806" TYPE="btrfs" ← Btrfs!
💡 DSM 的
vgchange不支持--readonly选项,但底层 md 是 readonly,任何写穿透都会被拒绝,依然安全。
第四步:挂载 Btrfs
mkdir -p /mnt/rescue
mount -t btrfs -o ro /dev/vg3/volume_3 /mnt/rescue
ls /mnt/rescue/
# 看到 MyDocker HighSpeed @eaDir #recycle ✅
4.4 抢救数据到 volume2
mkdir -p /volume2/rescue_volume3
rsync -avh --progress /mnt/rescue/MyDocker /volume2/rescue_volume3/
rsync -avh --progress /mnt/rescue/HighSpeed /volume2/rescue_volume3/
# 验证
echo "原 MyDocker: $(find /mnt/rescue/MyDocker -type f | wc -l)"
echo "新 MyDocker: $(find /volume2/rescue_volume3/MyDocker -type f | wc -l)"
echo "原 HighSpeed: $(find /mnt/rescue/HighSpeed -type f | wc -l)"
echo "新 HighSpeed: $(find /volume2/rescue_volume3/HighSpeed -type f | wc -l)"
救援结果
| 项目 | 原数据 | 已复制 | 状态 |
|---|---|---|---|
| MyDocker | 24G / 146,905 文件 | 24G / 146,905 文件 | ✅ |
| HighSpeed | 2.1G / 2,032 文件 | 2.1G / 2,032 文件 | ✅ |
100% 完整恢复,MD5/文件数完全一致。
4.5 卸载临时挂载
umount /mnt/rescue
vgchange -an vg3
mdadm --stop /dev/md10
Part 5: NVMe 兼容性突破与存储池重建
5.1 第一次创建存储池失败
数据救出来后,尝试在 DSM 里重新创建存储池 3,结果:
硬盘要求 - 无法选择以下硬盘:
硬盘 3 / SATA / SSD / 1.9 TB / 良好
原因:当前 DSM 版本不支持此硬盘
SA6400 是企业机型,默认硬件兼容性数据库(hddb)较严格。直通的 NVMe 在 DSM 看来是 QEMU HARDDISK 2.5+,不在白名单。
cat /sys/block/sata4/device/vendor # QEMU
cat /sys/block/sata4/device/model # HARDDISK
cat /sys/block/sata4/device/rev # 2.5+
5.2 用 syno_hdd_db 自动加白名单
社区工具 Synology_HDD_db(007revad)专门解决这个问题:
cd /root
wget -O syno_hdd_db.sh \
"https://raw.githubusercontent.com/007revad/Synology_HDD_db/main/syno_hdd_db.sh"
chmod +x syno_hdd_db.sh
# -n 包含 NVMe / -r 重启相关服务 / -f 强制更新
./syno_hdd_db.sh -nrf
输出:
Synology_HDD_db v3.6.125
SA6400 x86_64 DSM 7.2.2-72806-3
HDD/SSD models found: 3
HARDDISK,2.5+,2048 GB
HARDDISK,2.5+,256 GB
HARDDISK,2.5+,4000 GB
HARDDISK (2.5+) already exists in sa6400_host_v7.db ✅
Disabled support disk compatibility. ✅
NVMe support already enabled. ✅
Drive db auto updates already disabled. ✅
5.3 第二次失败:盘上有 RAID 残留
reboot 后再次创建,**仍然报”不支持”**。原因:之前删除”丢失”的存储池只是清除 DSM 配置,NVMe 物理盘上的 RAID superblock + LVM 元数据还在:
mdadm --examine /dev/sata4p5
# 元数据还在,DSM 把它视为「已被使用」
5.4 彻底擦除 NVMe 元数据
⚠️ 执行前再三确认 /volume2/rescue_volume3/ 数据备份完整。
# 1. 停 LVM/RAID 引用
vgchange -an vg3 2>/dev/null
vgremove -y vg3 2>/dev/null
pvremove -y /dev/md10 2>/dev/null
# 2. 擦除 RAID superblock
for p in /dev/sata4p1 /dev/sata4p2 /dev/sata4p5; do
mdadm --zero-superblock "$p" 2>/dev/null
done
# 3. 擦除分区表头部 100MB
dd if=/dev/zero of=/dev/sata4 bs=1M count=100 conv=fsync
# 4. 擦除盘尾 100MB(GPT 备份头位置)
DISK_SIZE=$(blockdev --getsize64 /dev/sata4)
SEEK_MB=$(( (DISK_SIZE / 1024 / 1024) - 100 ))
dd if=/dev/zero of=/dev/sata4 bs=1M count=100 seek=$SEEK_MB conv=fsync
# 5. 刷新分区表
partprobe /dev/sata4
sync
# 6. 让 DSM 重新扫描
synodiskpath --enum
synospace --enum
# 7. 重启 DSM
reboot
5.5 创建新存储池 3 + Volume3
DSM 重启后,Web UI 操作:
- 存储管理器 → 存储池 → 创建 → RAID 类型 Basic → 选 硬盘 3(无红字!) → 跳过硬盘检查 → 应用
- 存储空间 → 创建 → 选刚建的存储池 3 → 文件系统 Btrfs → 应用
完成后 /volume3 自动挂载,1.85T 可用。
5.6 创建共享文件夹
控制面板 → 共享文件夹 → 新增:
MyDocker/ 位置:volume3 / 不加密 / 不启用回收站HighSpeed/ 位置:volume3 / 不加密 / 不启用回收站
Part 6: 数据迁移到 Volume3
6.1 跨卷复制
ssh admin@<DSM_IP>
sudo -i
# rsync 复制(Btrfs → Btrfs,跨卷必须 cp/rsync,mv 不行)
rsync -avh --progress /volume2/rescue_volume3/MyDocker/ /volume3/MyDocker/
rsync -avh --progress /volume2/rescue_volume3/HighSpeed/ /volume3/HighSpeed/
# 修复权限和 ACL
synoacltool -enforce-inherit /volume3/MyDocker
synoacltool -enforce-inherit /volume3/HighSpeed
💡 注意 rsync 末尾的
/:MyDocker/→MyDocker/是复制内容到目标内,避免双层嵌套。
6.2 验证一致性
echo "===== 大小对比 ====="
du -sh /volume2/rescue_volume3/MyDocker /volume2/rescue_volume3/HighSpeed
du -sh /volume3/MyDocker /volume3/HighSpeed
echo "===== 文件数对比 ====="
echo "rescue MyDocker: $(find /volume2/rescue_volume3/MyDocker -type f | wc -l)"
echo "volume3 MyDocker: $(find /volume3/MyDocker -type f | wc -l)"
echo "rescue HighSpeed: $(find /volume2/rescue_volume3/HighSpeed -type f | wc -l)"
echo "volume3 HighSpeed:$(find /volume3/HighSpeed -type f | wc -l)"
6.3 清理临时副本
rm -rf /volume2/rescue_volume3/
df -h /volume2 # 看空间释放
6.4 Container Manager 恢复 Docker 项目
MyDocker 含原 SA6400 的所有 docker-compose 项目。在 Container Manager 重新导入:
# 找所有 compose 文件
find /volume3/MyDocker -name "docker-compose.yml" -o -name "compose.yml"
每个项目目录:
- Container Manager → 项目 → 新增
- 项目目录:对应的
/volume3/MyDocker/<项目> - 来源:使用现有的 docker-compose.yml
- 启动
最终 19 个容器全部恢复运行:
server-management-frontend-prod server-management-backend-prod
webhook lucky filebrowser
gitea shared-postgres termix
guacd frps homeassistant
embyserver openlist haproxy
nginx frpc aliyundrive-webdav
it-tools nexterm qbittorrent
踩坑点与经验总结
🐛 坑 1:PVE 9 包名变了
| 错误 | 正确 |
|---|---|
proxmox-headers-6.17.2-1-pve |
proxmox-default-headers |
proxmox-headers-6.17 |
proxmox-default-headers(metapackage) |
apt install pve-headers |
不存在,改用 proxmox-headers-$(uname -r) |
🐛 坑 2:PVE 9 默认只启用企业源
ISO 安装后,apt update 直接报 401 Unauthorized。必须切换到 pve-no-subscription 源。
deb822 格式的源文件没有 Enabled 字段就是默认启用,要禁用必须显式加 Enabled: false 或重命名文件。
🐛 坑 3:Auto Mode 不会启用 nvmesystem
Arc Loader 的 Auto Mode 很智能(自动选机型 SA6400 太精准),但不会自动加 nvmesystem / nvmevolume addon。不加这俩,SA6400 的 NVMe 在 DSM 里完全看不到。
解决:Webconfig (:7080) → Addons → 手动勾选 → Rebuild Loader (existing)。
🐛 坑 4:NVMe 在 DSM 里不是 nvme0n1
走 SATA 仿真直通后,DSM 内核完全不认识 NVMe,把它识别为 /dev/sata4(按 SATA 槽位编号)。导致直接执行 mdadm --examine /dev/nvme0n1p5 报 “No such file or directory”。
正确做法:用 fdisk -l 看所有 sata 设备,找容量匹配的那一个。
🐛 坑 5:vgchange 不支持 –readonly
DSM 自带的 LVM2 工具版本不支持 vgchange --readonly 选项。
解决:用 vgchange -ay vg3(底层 md 已是 readonly,LV 即使激活为 RW 也无法穿透写入)。
🐛 坑 6:syno_hdd_db 不够,还要清盘
仅运行 syno_hdd_db.sh 加白名单不够——盘上残留的 RAID superblock 和 LVM 元数据会让 DSM 仍然拒绝使用。
完整清理三步:
mdadm --zero-superblock擦 RAID 元数据dd擦盘头 100MB(分区表 + LVM PV)dd擦盘尾 100MB(GPT 备份头)
🐛 坑 7:跨卷迁移用 mv 不行
Btrfs(volume2)→ Btrfs(volume3)是两个独立文件系统,mv 只是 inode 指针,跨文件系统时实际仍在做复制,但中断后状态不可预期。
正确做法:rsync -avh --progress,可断点续传 + 进度可见。
✅ 经验 1:三层只读保护
数据救援时坚持”双保险”:
- mount 层:
-o ro - md 层:
mdadm --assemble --readonly
任何一层 readonly 都能阻止穿透写入,数据万无一失。
✅ 经验 2:先备份再清盘
每次执行破坏性操作(zero-superblock、dd、vgremove)之前:
- 确认数据已 rsync 到其他卷
- 确认目标卷数据完整(大小 + 文件数)
- 才执行擦除
✅ 经验 3:Arc Loader 的 Webconfig 是神器
http://<VM_IP>:7080 提供完整的 Web 界面操作 Addons、Sysinfo、Filemanager,比 noVNC 里的 ncurses 菜单方便 10 倍。
✅ 经验 4:跨机型救援可行性
- 同机型(SA6400 ↔ SA6400):✅ 完美,DSM 自动识别恢复
- 跨同代机型(SA6400 ↔ DS920+):⚠️ 需要手动 mdadm,可能成功
- 跨平台(SA6400 ↔ NAS-8100T):⚠️ 取决于 RAID 元数据是否标准,本案例中 sda 也成功识别
附录:关键命令速查
PVE 主机侧
# 切换到非订阅源(中科大)
cat > /etc/apt/sources.list.d/pve-no-subscription.sources << 'EOF'
Types: deb
URIs: https://mirrors.ustc.edu.cn/proxmox/debian/pve
Suites: trixie
Components: pve-no-subscription
Signed-By: /usr/share/keyrings/proxmox-archive-keyring.gpg
EOF
# 安装内核 + headers
apt install -y proxmox-default-kernel proxmox-default-headers
# 验证 SR-IOV
lspci -nn | grep -i vga
cat /sys/devices/pci0000:00/0000:00:02.0/sriov_numvfs
# VM 配置查看与修改
qm config 100
qm set 100 -boot order=sata0 -cores 4
qm set 100 -hostpci0 0000:00:02.1,pcie=1
qm start 100
qm shutdown 100
qm status 100
# 直通磁盘(by-id 路径,稳定不变)
qm set 100 -sata1 /dev/disk/by-id/<id>,ssd=1,discard=on
DSM 内(数据救援)
# 1. 找 NVMe 真实设备节点
fdisk -l 2>/dev/null | grep "Disk /dev/sata"
# 2. 看 RAID 元数据
mdadm --examine /dev/sata4p5
# 3. 只读组装
mdadm --assemble --readonly /dev/md10 /dev/sata4p5
# 4. 激活 LVM
vgchange -ay vg3
# 5. 看文件系统
blkid /dev/vg3/volume_3
# 6. 只读挂载
mkdir -p /mnt/rescue
mount -t btrfs -o ro /dev/vg3/volume_3 /mnt/rescue
# 7. 救数据
rsync -avh --progress /mnt/rescue/重要目录/ /volume2/backup/
# 8. 清理
umount /mnt/rescue
vgchange -an vg3
mdadm --stop /dev/md10
DSM 内(兼容性 + 清盘)
# 加白名单
wget -O syno_hdd_db.sh \
"https://raw.githubusercontent.com/007revad/Synology_HDD_db/main/syno_hdd_db.sh"
chmod +x syno_hdd_db.sh
./syno_hdd_db.sh -nrf
# 彻底清盘(谨慎!)
mdadm --zero-superblock /dev/sata4p1 /dev/sata4p2 /dev/sata4p5
dd if=/dev/zero of=/dev/sata4 bs=1M count=100 conv=fsync
DISK_SIZE=$(blockdev --getsize64 /dev/sata4)
SEEK_MB=$(( (DISK_SIZE / 1024 / 1024) - 100 ))
dd if=/dev/zero of=/dev/sata4 bs=1M count=100 seek=$SEEK_MB conv=fsync
partprobe /dev/sata4
synodiskpath --enum
reboot
DSM 内(数据迁移与权限)
# 跨卷复制(必须 rsync,不能 mv)
rsync -avh --progress /volume2/source/ /volume3/dest/
# 修复 ACL
synoacltool -enforce-inherit /volume3/MyDocker
# 验证一致性
echo "原: $(find /volume2/source -type f | wc -l)"
echo "新: $(find /volume3/dest -type f | wc -l)"
最终成果
- ✅ PVE 9.1 + Alder Lake 核显 SR-IOV(7 个 VF)
- ✅ DSM 7.2.2 (SA6400) 通过 Arc Loader 正常引导
- ✅ 三块盘数据全部保留(同机型 SA6400 + 异机型 NAS-8100T 均成功)
- ✅ NVMe 兼容性突破,作为独立 Volume3 (Btrfs, 1.85T)
- ✅ MyDocker 24G / 146905 文件 / HighSpeed 2.1G / 2032 文件,100% 完整迁移
- ✅ 19 个 Docker 容器全部恢复运行
- ✅ 核显在 DSM 内可用(
/dev/dri/renderD128),Docker 容器可走 VAAPI/QSV 硬解
致谢:
- strongtz/i915-sriov-dkms — Intel 核显 SR-IOV 驱动
- AuxXxilium/arc — Arc Loader DSM 引导器
- 007revad/Synology_HDD_db — 硬盘兼容性数据库工具
文档创建时间:2026-05-10