前言
在 Proxmox VE (PVE) 的使用过程中,我们经常需要将宿主机上的某一特定物理硬盘直接分配给虚拟机(VM)使用。例如:给群晖(Synology)分配数据盘,或者给 Windows 虚拟机挂载一块独立的 NTFS 硬盘。
相比于直通整个 SATA 控制器(PCIe Passthrough),使用 RDM (Raw Device Mapping) 方式更加灵活,它允许我们只通过某一块硬盘,而不影响连接在同一控制器上的其他硬盘(比如 PVE 的系统盘)。
本文记录了如何通过命令行(CLI)实现物理磁盘的直通映射。
核心步骤概览
- 获取磁盘 ID:找到硬盘唯一的序列号路径。
- 执行映射命令:将硬盘挂载到指定虚拟机。
- 网页端确认:在 PVE 界面检查并优化配置。
步骤一:获取硬盘 ID (Disk ID)
在 Linux 系统中,/dev/sdX 这种盘符名称在重启后可能会发生变化,因此绝对不能直接使用。我们必须使用唯一的 Disk ID 来进行直通。
- 登录 PVE 的管理界面。
- 选中宿主机节点,点击 Shell,或者通过 SSH 工具连接到 PVE。
- 输入以下命令列出所有磁盘 ID:
ls -l /dev/disk/by-id/
你会在输出结果中看到类似如下的信息:
lrwxrwxrwx 1 root root 9 Jan 20 10:00 ata-WDC_WD40EZRZ-00GXCB0_WD-WCC7K4... -> ../../sdb
lrwxrwxrwx 1 root root 10 Jan 20 10:00 ata-WDC_WD40EZRZ-00GXCB0_WD-WCC7K4...-part1 -> ../../sdb1
lrwxrwxrwx 1 root root 9 Jan 20 10:00 nvme-Samsung_SSD_970_EVO... -> ../../nvme0n1
如何选择:
- 找到你要直通的那块硬盘。通常通过品牌(如
WDC,Seagate)和型号来识别。 - 复制
ata-或scsi-开头的完整字符串。 - 注意:不要复制以
-part1结尾的字符串,那是分区,我们要直通的是整个硬盘。
假设我复制的 ID 为:
ata-WDC_WD40EZRZ-00GXCB0_WD-WCC7K4123456
步骤二:执行直通命令 (qm set)
我们需要使用 qm set 命令将刚才找到的硬盘 ID 挂载给虚拟机。
命令格式:
qm set <虚拟机ID> -<总线类型><编号> /dev/disk/by-id/<硬盘ID>
参数说明:
- 虚拟机ID:例如
100或101。 - 总线类型:
sata:兼容性好,适合群晖等系统。scsi:性能更好,适合 Windows/Linux(需安装 VirtIO 驱动)。
- 编号:例如
sata1,scsi2(确保不要和现有的虚拟硬盘编号冲突)。
实操示例:
假设我要把硬盘挂载给 ID 为 100 的虚拟机,作为 sata1 接口:
qm set 100 -sata1 /dev/disk/by-id/ata-WDC_WD40EZRZ-00GXCB0_WD-WCC7K4123456
按下回车,如果看到 update VM 100: -sata1 ... 字样,说明执行成功。
步骤三:PVE 网页端确认与优化
命令执行完毕后,还需要在图形界面确认一下,并做一些简单的优化。
- 回到 PVE 网页管理界面。
- 点击左侧的虚拟机(如
100)。 - 选择 硬件 (Hardware) 选项卡。
- 你会看到列表中多出了一个新的硬盘,显示为
sata1(或你设置的总线)。
推荐优化(可选):
双击该硬盘条目,弹出编辑窗口:
- SSD 仿真 (SSD Emulation):建议勾选。即使是机械硬盘,勾选后系统会将其识别为 SSD,不再进行碎片整理等针对机械盘的操作,有些系统下还能提升少许性能。
- IO Thread:如果你使用的是
VirtIO SCSI控制器,勾选此项可以提升 I/O 性能。
完成后,启动虚拟机,即可在系统内看到这块硬盘。
注意事项
- 数据安全:一旦硬盘直通给虚拟机,PVE 宿主机本身就不要再去挂载或操作这块硬盘了,否则会导致文件系统损坏或数据丢失。
- 迁移问题:因为这种直通方式绑定了物理硬盘的序列号,如果将该虚拟机迁移(Migrate)到集群中的另一台物理机,该虚拟机将无法启动(因为另一台机器上没有这块硬盘)。
- SMART 信息:通过 RDM 方式直通,虚拟机内部通常能看到硬盘的型号和序列号,大部分 NAS 系统也能读取 SMART 信息,但不如 PCIe 直通控制器来得彻底。
总结
使用 qm set 进行 RDM 硬盘直通是 PVE 中最常用的技巧之一。它不需要主板支持 IOMMU,也不独占整个控制器,非常适合家用 All-in-One 服务器灵活分配存储空间。
参考命令速查:
# 查看硬盘ID
ls -l /dev/disk/by-id/
# 挂载硬盘
qm set <vmid> -sata1 /dev/disk/by-id/<disk-id>