PVE硬件直通之强制IOMMU分组

文章介绍了如何检查和配置IOMMU分组,特别是对于不直接支持ACS的设备如何通过更新内核来启用。IOMMU分组和ACS能提高PCIe设备的安全性,防止非法的P2P通信,保护系统免受潜在攻击。配置步骤包括添加模块到启动项,修改GRUB配置,并更新内核。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

检查是否直接支持IOMMU分组

下面 以SATA控制器为例,看pci设备是否可以直接支持IOMMU分组

/* 打印pci设备详细信息*/
lspci -vv
/* 找到SATA controller 段落*/
16:00.1 SATA controller: Advanced Micro Devices, Inc. [AMD] Device 43eb (prog-if 01 [AHCI 1.0])
        Subsystem: ASMedia Technology Inc. Device 1062
        Flags: bus master, fast devsel, latency 0, IRQ 34, IOMMU group 8
        Memory at fcf80000 (32-bit, non-prefetchable) [size=128K]
        Expansion ROM at fcf00000 [disabled] [size=512K]
        Capabilities: [50] MSI: Enable+ Count=1/1 Maskable- 64bit+
        Capabilities: [78] Power Management version 3
        Capabilities: [80] Express Legacy Endpoint, MSI 00
        Capabilities: [100] Advanced Error Reporting
        /* 检查是否存在Capabilities: Access Control Services*/
        Capabilities: [2a0] Access Control Services
        Kernel driver in use: vfio-pci
        Kernel modules: ahci

如果设备信息中支持ACS(Access Control Services),便可直接通过设置开启IOMMU分组。若不支持ACS,需要更新内核,关闭ACS检查,开启IOMMU分组。

由于PCIe设备是支持P2P传输的,这也就意味着同一个PCIe交换开关连接下不同终端可以在不流经RootComplex的情况下互相通信。若使用过程中不希望P2P直接通信又不采取相关措施,则该漏洞很有可能被无意或有意触发,使得某些EP收到无效、非法甚至恶意的访问请求,从而引发一系列潜在问题。ACS协议提供了一种机制,能够决定一个TLP被正常路由、阻塞或重定向。在SR-IOV系统中,还能防止属于VI或者不同SI的设备Function之间直接通信。通过在交换节点上开启ACS服务,可以禁止P2P发送,强迫交换节点将所有地址的访问请求送到RootComplex,从而避开P2P访问中的风险。ACS可以应用于PCIe桥、交换节点以及带有VF的PF等所有具有调度功能的节点,充当一个看门人的角色。

配置IOMMU分组

编辑/etc/modules文件,将如下模块加入文件中

vi /etc/modules

# /etc/modules: kernel modules to load at boot time.
#
# This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with "#" are ignored.
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd

编辑/etc/default/grub文件,修改内容详见注释

vi /etc/default/grub

# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
#   info -f grub -n 'Simple configuration'

GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
# 在原始GRUB_CMDLINE_LINUX_DEFAULT后加入amd_iommu=on pcie_acs_override=downstream,multifunction
# 若是intel的cpu则将amd_iommu改为intel_iommu即可
# GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on pcie_acs_override=downstream,multifunction"
GRUB_CMDLINE_LINUX=""
GRUB_DISABLE_OS_PROBER=false
# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"

# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console

# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480

# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true

# Uncomment to disable generation of recovery mode menu entries
#GRUB_DISABLE_RECOVERY="true"

# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"

更新grub引导和ramfs

# 更新grub引导
update-grub
# 更新ramfs
update-initramfs -u -k all

如若正常,所有设备均有独立IOMMU Group 编号
在这里插入图片描述

不直接支持的需要更新内核

提供自己编译好的pve-kernel 6.1.6 百度云链接
将上述文件复制到pve中,执行如下命令更新内核,重启即可。

# 更新内核
dpkg -i *.deb

参考

[1] https://developer.aliyun.com/article/1071405

<think>好的,用户现在问的是如何在PVE中删除设备直通。之前他遇到了“failed to connect to bus”的问题,现在解决了可能想调整配置。首先,我需要回想PVE的设备直通机制,通常是通过PCI或USB直通给虚拟机。删除直通可能需要修改虚拟机的配置文件或者通过Web界面操作。 用户可能是之前添加了直通设备,现在想移除,但不确定具体步骤。可能的场景是用户误添加了设备,或者虚拟机不再需要该设备。需要注意的是,直接删除配置可能会有风险,比如导致虚拟机启动失败或者宿主机设备冲突。 接下来,我要考虑正确的删除方法。在PVE中,直通设备通常通过编辑虚拟机的.conf文件,比如在/etc/pve/qemu-server/目录下,或者通过Web界面在硬件选项中移除。需要提醒用户备份配置文件,避免误操作。 另外,用户可能不知道需要同时处理内核模块的加载和IOMMU组的设置。比如,如果之前修改了grub或模块加载配置,删除设备后是否需要还原这些设置?可能不需要,但如果有多个设备直通,可能需要保留相关配置。 还要考虑不同直通方式的处理,比如PCI直通和USB直通可能有不同的步骤。比如,USB直通可能通过设备ID直接添加,而PCI可能需要更复杂的配置。需要分别说明。 用户可能的误区是直接删除设备条目而不检查依赖关系,比如虚拟机是否正在运行,或者是否有其他配置引用了该设备。需要提醒用户在操作前关闭虚拟机,并确保设备未被使用。 另外,可能需要检查宿主机是否在移除设备后需要重启,或者是否需要重新加载相关驱动。例如,vfio-pci模块是否还需要保留。如果用户只删除单个设备,可能不需要调整模块参数,但如果是最后一个直通设备,可能需要清理配置。 最后,总结步骤:通过Web界面或手动编辑配置文件删除设备条目,检查相关模块和启动参数是否需要调整,确认虚拟机启动正常。同时提醒用户注意备份和验证操作后的系统稳定性。</think>### **PVE删除设备直通(PCI/USB直通)的详细步骤** 在Proxmox VE(PVE)中删除已直通给虚拟机的设备(如PCIe显卡、USB控制器等),需要从**虚拟机配置**和**宿主机设置**两个层面操作。以下是具体方法: --- #### **一、通过Web界面删除设备直通(推荐)** **步骤:** 1. **关闭虚拟机**:确保目标虚拟机处于关机状态。 2. 登录PVE Web管理界面 → 选择虚拟机 → **硬件**选项卡。 3. 找到已直通的设备(如PCI设备、USB设备等),点击设备条目右侧的 **“删除”** 按钮。 4. 确认删除后,重启虚拟机验证是否生效。 --- #### **二、手动编辑配置文件删除直通** 若Web界面操作异常,可直接修改虚拟机配置文件: 1. SSH登录PVE宿主机,定位虚拟机配置文件: ```bash # 配置文件路径:/etc/pve/qemu-server/<VM-ID>.conf nano /etc/pve/qemu-server/100.conf # 假设VM-ID为100 ``` 2. 删除与直通设备相关的行: - **PCI直通**:删除类似 `hostpci0: 01:00.0,pcie=1` 的行。 - **USB直通**:删除类似 `usb0: host=1234:5678` 的行。 3. 保存文件后重启虚拟机。 --- #### **三、宿主机配置还原(可选)** 如果删除直通后需彻底清理宿主机相关设置: 1. **移除内核参数**(仅当不再需要任何直通设备时): - 编辑 `/etc/default/grub`,删除直通相关的参数: ```bash GRUB_CMDLINE_LINUX_DEFAULT="... intel_iommu=on vfio_iommu_type1.allow_unsafe_interrupts=1" ``` - 更新GRUB并重启: ```bash update-grub && reboot ``` 2. **卸载VFIO驱动**(可选): ```bash modprobe -r vfio-pci vfio_iommu_type1 ``` --- #### **四、注意事项** 1. **虚拟机状态**:删除设备前必须关闭虚拟机,否则配置可能无法保存。 2. **硬件冲突**:直通设备释放后,宿主机可能需重启才能重新识别该设备。 3. **IOMMU组影响**:若同一IOMMU组内有其他直通设备,删除单个设备可能影响组内其他设备的使用。 4. **备份配置**:操作前建议备份虚拟机配置文件: ```bash cp /etc/pve/qemu-server/100.conf /root/100.conf.bak ``` --- ### **常见问题** **Q1: 删除直通设备后宿主机无法识别硬件怎么办?** - 重启宿主机或手动重置设备电源(如通过PCIe插槽重插)。 **Q2: 直通的USB设备删除后虚拟机仍显示残留条目?** - 检查虚拟机是否完全关闭,或尝试在Web界面中强制移除。 **Q3: 直通设备删除后虚拟机无法启动?** - 检查配置文件语法是否正确(如多余的逗号或格式错误)。 --- ### **总结** 删除PVE设备直通的核心操作是**从虚拟机配置中移除直通条目**,是否需要调整宿主机内核参数取决于是否完全放弃直通功能。建议优先通过Web界面操作,复杂场景再手动修改配置文件。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值