使用PVE有时为了方便,需要将硬盘直通, PVE系统直通硬盘有两种方式,方法一命令操作,直通单块硬盘 Raw Device Mapping (RDM);方法二添加 PCI设备,直通 SATA Controller(SATA 控制器)。
其中裸磁盘映射 Raw Device Mapping (RDM) 是将单个硬盘或者分区,通过qemu进行映射到虚拟机,通过这种方式,硬盘会在虚拟机内会认为是一个qemu-hdd。
磁盘控制器直通会让磁盘控制器下的所有硬盘间接直通到虚拟机,通过这种方式,硬盘会在虚拟机内会认为是一个物理磁盘,具有smart属性。
RDM磁盘直通
进入Proxmox VE(PVE)系统的SSH,或直接进入PVE管理网页Shell,我们可以通过下面命令,列出当前的硬盘列表:
ls -la /dev/disk/by-id/
例如:
lrwxrwxrwx 1 root root 9 Jun 12 09:36 ata-GALAX_TA1D0240A_305D0********0279966 -> ../../sda
lrwxrwxrwx 1 root root 10 Jun 12 09:36 ata-GALAX_TA1D0240A_305D0********0279966-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 Jun 12 09:36 ata-GALAX_TA1D0240A_305D0********0279966-part2 -> ../../sda2
lrwxrwxrwx 1 root root 10 Jun 12 09:36 ata-GALAX_TA1D0240A_305D0********0279966-part3 -> ../../sda3
lrwxrwxrwx 1 root root 9 Jun 12 09:58 ata-ST1000DM003-1****2_W********7 -> ../../sdb
lrwxrwxrwx 1 root root 10 Jun 12 09:36 dm-name-pve-root -> ../../dm-1
lrwxrwxrwx 1 root root 10 Jun 12 09:36 dm-name-pve-swap -> ../../dm-0
lrwxrwxrwx 1 root root 10 Jun 12 09:36 dm-name-pve-vm--100--disk--0 -> ../../dm-8
lrwxrwxrwx 1 root root 10 Jun 12 09:36 dm-name-pve-vm--101--disk--0 -> ../../dm-7
lrwxrwxrwx 1 root root 10 Jun 12 09:36 dm-name-pve-vm--105--disk--0 -> ../../dm-6
lrwxrwxrwx 1 root root 10 Jun 12 09:36 dm-name-pve-vm--200--disk--0 -> ../../dm-9
lrwxrwxrwx 1 root root 10 Jun 12 09:36 dm-uuid-LVM-ezreio8tLBAyf5iIBYW5HS*********ZgzGBJxLqknLHZ05EUcCM0h3lWV -> ../../dm-1
lrwxrwxrwx 1 root root 10 Jun 12 09:36 dm-uuid-LVM-ezreio8tLBAyf5iIBYW5HS*********nbQKEmdsTHkKIe8j2Ou0mfRwXNL -> ../../dm-7
lrwxrwxrwx 1 root root 10 Jun 12 09:36 dm-uuid-LVM-ezreio8tLBAyf5iIBYW5HS*********OS0i5zs3870PzzgRxluMPy9qALl -> ../../dm-8
lrwxrwxrwx 1 root root 10 Jun 12 09:36 dm-uuid-LVM-ezreio8tLBAyf5iIBYW5HS*********SUJ1HHzTaROYIrVWHsoN9fZ4XiM -> ../../dm-9
lrwxrwxrwx 1 root root 10 Jun 12 09:36 dm-uuid-LVM-ezreio8tLBAyf5iIBYW5HS*********FE8hXy66BHq4Hf0HjxNMkUgqXnb -> ../../dm-0
lrwxrwxrwx 1 root root 10 Jun 12 09:36 dm-uuid-LVM-ezreio8tLBAyf5iIBYW5HS*********4PcYIkPqUFwmS91bfMSRwlA9vxR -> ../../dm-6
lrwxrwxrwx 1 root root 10 Jun 12 09:36 lvm-pv-uuid-2oucQP-****-****-****-****-****-gm99Po -> ../../sda3
lrwxrwxrwx 1 root root 13 Apr 28 16:39 nvme-eui.01000000010000005cd2e431fee65251 -> ../../nvme2n1
lrwxrwxrwx 1 root root 13 Mar 3 15:52 nvme-eui.334843304aa010020025385800000004 -> ../../nvme1n1
lrwxrwxrwx 1 root root 13 Apr 28 17:36 nvme-eui.334843304ab005400025385800000004 -> ../../nvme0n1
lrwxrwxrwx 1 root root 13 Apr 28 16:39 nvme-INTEL_SSDPE2KX020T8_BTLJ039307142P0BGN -> ../../nvme2n1
lrwxrwxrwx 1 root root 13 Mar 3 15:52 nvme-SAMSUNG_MZWLL800HEHP-00003_S3HCNX0JA01002 -> ../../nvme1n1
lrwxrwxrwx 1 root root 13 Apr 28 17:36 nvme-SAMSUNG_MZWLL800HEHP-00003_S3HCNX0JB00540 -> ../../nvme0n1
lrwxrwxrwx 1 root root 9 Mar 3 15:52 scsi-35000c500474cd7eb -> ../../sda
lrwxrwxrwx 1 root root 9 Mar 3 15:52 wwn-0x5000c500474cd7eb -> ../../sda
lrwxrwxrwx 1 root root 9 Jun 12 09:58 wwn-0x500********f289 -> ../../sdb
这里必需选择的是整个硬盘(物理硬盘)而不是分区,比如 sda、sdb、sdc 对应的 id,而不是 sda1、sda2…
将物理磁盘直通给PVE系统下虚拟机中需要在shell下通过CLI的方式来添加,使用的工具为qm(Qemu/KVM虚拟机管理器),通过命令 set 来设置物理磁盘到虚拟机中:
qm set <vm_id> -<disk_type>[n] /dev/disk/by-id/<type>-$brand-$model_$serial_number
其中:
vm_id: 为创建虚拟机时指定的VM ID。<disk_type>[n]: 磁盘的总线类型及其编号,总线类型可以选择IDE、SATA、VirtIO Block和SCSI类型,编号从0开始,最大值根据总线接口类型有所不同,IDE为3,SATA为5,VirTIO Block为15,SCSI为13。“/dev/disk/by-id/-brand-brand−model_$serial_number”: 为磁盘ID的具体路径和名称。
以上方的硬盘数据 ata-ST1000DM003-1****2_W****7 为例,将此硬盘直通给VM ID编号为200的虚拟机下,总线类型接口为sata0,命令如下:
qm set 200 -sata0 /dev/disk/by-id/ata-ST1000DM003-1****2_W********7
配置成功完成后,返回:
update VM 200: -sata0 /dev/disk/by-id/ata-ST1000DM003-1****2_W********7
同样,如果打算直通一个 nvme 硬盘,那么可以使用下面的命令:
qm set 200 --scsi1 /dev/disk/by-id/nvme-INTEL_SSDPE2KX020T8_BTLJ039307142P0BGN
当然,也可以使用ide或者sata形式直通硬盘,如下:
qm set 200 --sata1 /dev/disk/by-id/nvme-INTEL_SSDPE2KX020T8_BTLJ039307142P0BGN
qm set 200 --ide1 /dev/disk/by-id/nvme-INTEL_SSDPE2KX020T8_BTLJ039307142P0BGN
执行之后,可以进入 PVE 虚拟机管理网页,检查是否挂载成功:
建议为 scsi 设备,这样性能理论上是最优秀的。
需要注意的是,scsi 会有序号,如 scsi1,scsi0。在操作之前,应该要知道哪些 scsi 号是空的。对于 pve 来说,sata 最多有6个设备。如果要使用 sata 类型直通,请勿超过 sata5。
如果需要取消直通,可以使用命令:qm set <vmid> --delete scsiX
如上面的例子,命令为:
root@pve:~# qm set 101 --delete scsi1
update VM 101: -delete scsi1
直通 SATA Controller/PCI-E 阵列卡
Proxmox VE(PVE)系统直通SATA Controller(SATA 控制器),会把整个sata总线全部直通过去,就是直接将南桥或者直接把北桥连接的sata总线直通,那么有些主板sata接口就会全部被直通。
选择需要设置的PVE系统,点击 硬件 > 添加 > PCI设备 > 选择 SATA Controller(SATA 控制器),最后点击“添加”把 SATA Controller(SATA 控制器)添加给相应的系统后,完成重启,PVE硬件直通的设置就生效了。
References
Proxmox VE直通硬盘:https://optimus-xs.github.io/posts/passthrough-hard-drive-in-proxmox-ve/
Proxmox VE pve硬盘直通:https://foxi.buduanwang.vip/virtualization/1754.html/


直通阵列卡或 SATA 控制器的话,建议先在宿主机屏蔽驱动,禁止宿主机开机时初始化。
我之前没屏蔽宿主机阵列卡驱动,直接 webui 给虚拟机直通阵列卡,虚拟机开机跑一会儿整个宿主机就寄了,我猜测应该是宿主机和虚拟机抢阵列卡 SATA 控制器炸了,当然当初也没细研究,屏蔽了宿主机驱动就好了。