KVM虚拟机PCI设备直通

1. pci passthrough

1.1 概念

guest排他使用host上的某个PCI设备,就像将该设备物理连接到guest上一样

1.2 使用场景

  • 提升性能(如直通网卡和显卡)
  • 减少延迟(避免数据丢失或丢祯)
  • 直接利用bare-metal上设备的驱动

1.3 配置方法

  • 预先配置:
    a. 打开bios中的VT-d设置
    b. kernel引导配置iommu,参见文章 linux开启IOMMU方法
  • pci直通配置方法

  a. 识别设备

# virsh nodedev-list --tree |grep pci

  b. 获取设备xml

# virsh nodedev-dumpxml pci_8086_3a6

  c. detach设备

# virsh nodedev-dettach pci_8086_3a6c

  d. 改动虚拟机xml文件(将dumpxml查询到的bus,slot,function填入)

<devices>
......
<hostdev mode='subsystem' type='pci' managed='yes'>
 <source>
   <address domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
 </source>
</hostdev>
......
</devices>

  e. 启动虚拟机

2. pci passthrough (VFIO)

VFIO在kernel3.6/qemu1.4以后支持,眼下仅仅支持PCI设备。
VFIO是一套用户态驱动框架,提供两种基本服务:

  • 向用户态提供设备訪问接口
  • 向用户态提供配置IOMMU接口

VFIO能够用于实现高效的用户态驱动。

在虚拟化场景能够用于device passthrough。
通过用户态配置IOMMU接口,能够将DMA地址空间映射限制在进程虚拟空间中。

这对高性能驱动和虚拟化场景device passthrough尤其重要。

相对于传统方式,VFIO对UEFI支持更好。
VFIO技术实现了用户空间直接訪问设备。无须root特权,更安全。功能很多其它。

2.1 操作方法

  • 安装kernel module
# sudo modprobe vfio
# sudo modprobe vfio-pci
  • 虚拟机xml文件
    操作类似与非VFIO方式,虚拟机xml配置有所区别
<devices>
......
<hostdev mode='subsystem' type='pci' managed='yes'>
 <driver name='vfio'/> 
 <source>
   <address domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
 </source>
 <rom bar='off'/>
</hostdev>
......
</devices>
### KVM虚拟机中配置PF Passthrough物理网卡直通 #### 准备工作 为了成功完成PF Passthrough的配置,确保宿主机已经安装并启用了必要的内核模块和支持软件。通常情况下,现代Linux发行版默认已包含这些组件。 确认系统支持IOMMU(输入/输出内存管理单元),这是硬件辅助虚拟化的关键技术之一,能够提供安全高效的外设直接访问能力[^1]。 ```bash dmesg | grep -e DMAR -e IOMMU ``` 如果输出结果显示存在DMAR或IOMMU条目,则表示该功能已被激活;否则可能需要调整BIOS设置或将`intel_iommu=on`参数添加到GRUB启动选项中以启用它。 #### 安装必要工具和服务 更新包列表并安装QEMU-KVM及相关工具: ```bash sudo apt update && sudo apt install qemu-kvm libvirt-daemon-system virt-manager bridge-utils cpu-checker ``` 验证KVM是否正常工作: ```bash kvm-ok ``` 此命令应返回一条消息指出CPU支持全虚拟化技术,并且KVM模块正在运行。 #### 设置网络接口 假设目标是将eth0作为passthrough给guest OS使用,先禁用NetworkManager对该特定NIC的控制以防干扰: ```bash sudo nmcli dev set eth0 managed no ``` 接着创建一个新的桥接适配器用于其他未参与Passthrough的网络连接,编辑/etc/netplan/*.yaml文件如下所示: ```yaml network: version: 2 renderer: networkd bridges: br0: interfaces: [enp3s0] dhcp4: true ``` 应用更改: ```bash sudo netplan apply ``` 这里假定实际物理网卡名称为enp3s0而非eth0,请根据实际情况修改上述配置中的网卡名。 #### 修改Guest XML定义 通过virsh编辑现有域或者新建一个带有PCI设备传递属性的新实例之前,需获取待传入设备的信息: ```bash lspci -nn | grep Ethernet ``` 找到对应的Slot号后,利用以下指令导出XML描述符以便后续操作: ```bash virsh dumpxml your_vm_name > vm.xml ``` 打开生成的文件,在<devices>标签内部加入类似下面的内容指定要透传的具体位置: ```xml <hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0x0000' bus='0x81' slot='0x00' function='0x0'/> </source> </hostdev> ``` 注意替换正确的domain,bus,slot,function值匹配前面记录下来的PCI地址信息。 最后导入修正后的模板重新加载服务生效变更: ```bash virsh define vm.xml service libvirtd restart ``` 此时再次尝试启动关联的虚拟机会发现其独占获得了选定的真实网卡资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值