目录

PCI 与 PCIe 设备

  • PCI(Peripheral Component Interconnect,外设组件互连):符合 PCI 总线标准的设备就被称为 PCI 设备,PCI 总线架构中可以包含多个 PCI 设备。
  • PCIe(Peripheral Component Interconnect Express,快速外设组件互连):PCI Express,简称 PCIe,是电脑总线 PCI 的一种,它沿用了现有的 PCI 编程概念及通讯标准,但建基于更快的串行通信系统。是 Intel 提出的新一代的总线接口,PCI Express 采用了目前业内流行的点对点串行连接,比起 PCI 以及更早期的计算机总线的共享并行架构每个 PCIe 设备都有自己的专用连接,不需要向整个总线请求带宽,而且可以把数据传输率提高到一个很高的频率,达到 PCI 所不能提供的高带宽。







如上图,PCI 插槽都是等长的,防呆口位置靠上,大部分都是纯白色。PCIe 插槽大大小小,最小的 x1,最大的 x16,防呆口靠下。

SR-IOV

SR-IOV(Single-Root I/O Virtualization,单根 I/O 虚拟化)是 PCI-SIG 推出的一项标准,定义了一种 PCIe 设备虚拟化技术的标准机制,是 “虚拟通道” 的一种技术实现,用于将一个 PCIe 设备虚拟成多个 PCIe 设备,每个虚拟 PCIe 设备都具有自己的 PCIe 配置空间,如同物理 PCIe 设备一样为上层软件提供服务。

SR-IOV 技术是一种基于物理硬件的虚拟化解决方案,可以提高物理 I/O 设备(常见的是网络适配器)的性能与可扩展性。SR-IOV 技术允许在虚拟机之间高效共享 PCIe 设备,由于 SR-IOV 技术是基于硬件实现的,可以使虚拟机获得与宿主机媲美的 I/O 性能。

SR-IOV 虚拟出来的通道分为两个类型:

  • PF(Physical Function,物理功能):管理 PCIe 设备在物理层面的通道功能,可以看作是一个完整的 PCIe 设备,包含了 SR-IOV 的功能结构,具有管理、配置 VF 的功能。

  • VF(Virtual Function,虚拟功能):是 PCIe 设备在虚拟层面的通道功能,即仅仅包含了 I/O 功能,VF 之间共享物理资源。VF 是一种裁剪版的 PCIe 设备,仅允许配置其自身的资源,虚拟机无法通过 VF 对 SR-IOV 网卡进行管理。所有的 VF 都是通过 PF 衍生而来,有些型号的 SR-IOV 网卡最多可以生成 256 个 VF。

简而言之,每个 VF 就像是物理网卡硬件资源的一个切片,而 PF 则是对所有物理网卡硬件资源的统筹者,包括管理众多 VF 可以协同工作。

SR-IOV 的实现依赖硬件和软件两部分,首先,SR-IOV 需要专门的网卡芯片和 BIOS 版本,其次上层 Hypervisor 还需要安装相应的驱动。这是因为,只有通过 PF 才能够直接管理物理网卡的 I/O 资源和生成 VF,而 Hypervisor 要具备区分 PF 和 VF 的能力,从而正确地对网卡进行配置。

当 Hypervisor 识别出一个 VF 后,会通过 PF 来管理和配置 VF 的 I/O 资源。对于 Hypervisor 来说,VF 如同普通的 PCIe 网卡一般,安装相应驱动后就能够直接使用。假设一台服务器上安装了一个单端口 SR-IOV 网卡,这个端口生成了 4 个 VF,则 Hypervisor 就得到了四个以太网连接。

在 SR-IOV 的基础上,通过进一步利用 Intel VT-d 或 AMD IOMMU(Input/Output Memory Management Unit)技术,可以直接在虚拟机和 VF 之间做一对一的映射(PCI-Passthought)。在这个过程中,Hypervisor 的软件交换机被完全 Bypass 掉,从而实现低延时和近线速。同 VMware 的 VM DirectPath 相比,这种方式即实现了虚拟机对 VF 硬件资源的直接访问,又无需随着虚拟机数量的增加而增加物理网卡的数量。

缺省情况下,SR-IOV 网卡的 VF 处于禁用状态,此时 PF 充当传统的 PCIe 设备。一旦启用了 VF,PF 通过寄存器创建 VF,并通过 PF 的总线、设备和功能编号(路由 ID)访问各个 VF 的 PCIe 配置空间。每个 VF 都具有一个 PCIe 内存空间,用于映射其寄存器集。VF 设备驱动程序对寄存器集进行操作以启用其功能,并且显示为实际存在的 PCIe 设备。

在 KVM 中启用 SR-IOV 网卡

手动挂载 VF 到虚拟机

  1. 查看 PCI 设备清单:
[root@overcloud-compute-0 ~]# virsh nodedev-list | grep pci
pci_0000_00_00_0
pci_0000_00_01_0
pci_0000_00_01_1
pci_0000_00_02_0
pci_0000_00_03_0
pci_0000_00_03_2
pci_0000_00_05_0
pci_0000_00_05_2
pci_0000_00_05_4
pci_0000_00_11_0
pci_0000_00_16_0
...
  1. 查看选择的 PCI 设备详情:
[root@overcloud-compute-0 ~]# virsh nodedev-dumpxml pci_0000_81_10_2
<device>
<name>pci_0000_81_10_2</name>
<path>/sys/devices/pci0000:80/0000:80:03.0/0000:81:10.2</path>
<parent>pci_0000_80_03_0</parent>
<driver>
<name>ixgbevf</name>
</driver>
<capability type='pci'>
<domain>0</domain>
<bus>129</bus>
<slot>16</slot>
<function>2</function>
<product id='0x10ed'>82599 Ethernet Controller Virtual Function</product>
<vendor id='0x8086'>Intel Corporation</vendor>
<capability type='phys_function'>
<address domain='0x0000' bus='0x81' slot='0x00' function='0x0'/>
</capability>
<iommuGroup number='46'>
<address domain='0x0000' bus='0x81' slot='0x10' function='0x2'/>
</iommuGroup>
<numa node='1'/>
<pci-express>
<link validity='cap' port='0' width='0'/>
<link validity='sta' width='0'/>
</pci-express>
</capability>
</device>

NOTE:主要关注 <address domain='0x0000' bus='0x81' slot='0x10' function='0x2'/> 设备信息,e.g.

domain='0x0000'
bus='0x81'
slot='0x10'
function='0x2'

上述这些字段组成了 PCI device 的唯一地址:address: 0000:81:10.2

  1. Shut down the guest.

  2. 根据上述设备信息编写 new-dev XML 文件

$ cat /tmp/new-device.xml
<interface type='hostdev' managed='yes'>
<source>
<address type='pci' domain='0x0000' bus='0x81' slot='0x10' function='0x2' />
</source>
</interface>
  1. 将 New Device Attach 到 GuestOS
$ virsh attach-device VM1 /tmp/new-device.xml --live --config
Device attached successfully
  1. 查看 VM1 的 XML 更新
$ virsh dumpxml vm1
...
<devices>
...
<interface type='hostdev' managed='yes'>
<mac address='52:54:00:f0:d3:b8'/>
<driver name='kvm'/>
<source>
<address type='pci' domain='0x0000' bus='0x81' slot='0x10' function='0x2' />
</source>
<alias name='hostdev0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x07' function='0x0'/>
</interface>
...
</devices>

NOTE:或者可以直接 Edit 虚拟机的 XML 文件

virsh edit MyGuest

# 添加下述标签端:
<hostdev mode='subsystem' type='pci' managed='yes'>
<source>
<address bus='0x81' slot='0x10' function='0x2'/>
</source>
</hostdev>
  1. 进入 GuestOS 查看网卡信息
root@vm1:~# ip addr show eth4
4: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 2c:53:4a:02:20:3d brd ff:ff:ff:ff:ff:ff
inet 192.168.99.169/24 brd 192.168.99.255 scope global eth1
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fe3b:6128/64 scope link
valid_lft forever preferred_lft forever
  1. 启动虚拟机
virsh start MyGuest
  1. Dettach 虚拟机的 PCI 设备
$ virsh nodedev-dettach pci_0000_06_10_0
Device pci_0000_06_10_0 detached

指令方式挂载

qemu-system-x86_64 -enable-kvm -drive file=<vm img>,if=virtio -cpu host -smp 16 -m 16G \
-name <vm name> -device vfio-pci,host=<vf pci bus addr> -device vfio-pci,host=<vf pci bus addr> -vnc :1 -net none

重点在于通过 -device vfio-pci,host=<vf pci bus addr> 将 VF Passthrough 到虚拟机。

SR-IOV 的数据包分发机制

其实,从逻辑上可以认为启用了 SR-IOV 技术后的物理网卡内置了一个特别的 Switch,将所有的 PF 和 VF 端口连接起来,通过 VF 和 PF 的 MAC 地址以及 VLAN ID 来进行数据包分发。

  • 在 Ingress 上(从外部进入网卡):如果数据包的目的 MAC 地址和 VLAN ID 都匹配某一个 VF,那么数据包会分发到该 VF,否则数据包会进入 PF;如果数据包的目的 MAC 地址是广播地址,那么数据包会在同一个 VLAN 内广播,所有 VLAN ID 一致的 VF 都会收到该数据包。

  • 在 Egress 上(从 PF 或者 VF 发出):如果数据包的 MAC 地址不匹配同一 VLAN 内的任何端口(VF 或 PF),那么数据包会向网卡外部转发,否则会直接在内部转发给对应的端口;如果数据包的 MAC 地址为广播地址,那么数据包会在同一个 VLAN 内以及向网卡外部广播。

NOTE:所有未设置 VLAN ID 的 VF 和 PF,可以认为是在同一个 LAN 中,不带 VLAN 的数据包在该 LAN 中按照上述规则进行处理。此外,设置了 VLAN 的 VF,发出数据包时,会自动给数据包加上 VLAN,在接收到数据包时,可以设置是否由硬件剥离 VLAN 头部。

SR-IOV 网卡虚拟化技术的更多相关文章

  1. 网卡也能虚拟化?网卡虚拟化技术 macvlan 详解

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 01 macv ...

  2. 网卡虚拟化技术:VMDq和SR-IOV

    通常情况下,一个服务器上跑几十个虚机,对计算和网络的需求是很惊人的.前者促生了当下的多核技术发展,后者则不能简单的用多网卡来实现.试想,每个虚机如果都需要10G的交换能力,服务器要配置几十块物理网卡, ...

  3. 基于SR-IOV的IO虚拟化技术

    服务器配置要求 x86服务器内存不能低于32GB 服务器CPU需要支持虚拟化和设备虚拟化 VT-x VT-d,SR-IOV 功能,并且在BIOS中能启用了SR-IOV 网卡配置最起码为千兆配置 支持 ...

  4. VPS选购及辨别vps虚拟化技术

    现在国内外的VPS(Virtual Private Server)服务商非常多,每个服务商使用的VPS架构都不同.VPS属于虚拟化服务器,中文名:虚拟专用服务器. 常见的VPS虚拟化架构有多种:Ope ...

  5. KVM虚拟化技术

    KVM虚拟化技术 Qemu-kvm kvm virt-manager VNC Qemu-kvm创建和管理虚拟机 一.KVM简介 KVM(名称来自英语:Kernel-basedVirtual Machi ...

  6. KVM_虚拟化技术

    1 什么是 KVM KVM 是指基于 Linux 内核的虚拟机(Kernel-based Virtual Machine). 2006 年 10 月,由以色列的 Qumranet 组织开发的一种新的“ ...

  7. 云计算大数据:Xen、KVM、VMware、hyper-v等虚拟化技术的比较

    1.Xen.KVM.VMware.hyper-v等虚拟化技术的比较,xen和kvm,是开源免费的虚拟化软件. vmware是付费的虚拟化软件. hyper-v比较特别,是微软windows 2008 ...

  8. 关于Linux虚拟化技术KVM的科普 科普三(From OenHan)

    http://oenhan.com/archives,包括<KVM源代码分析1:基本工作原理>.<KVM源代码分析2:虚拟机的创建与运行>.<KVM源代码分析3:CPU虚 ...

  9. [转] KVM虚拟化技术生态环境介绍

    KVM虚拟化技术生态环境介绍 http://xanpeng.github.io/wiki/virt/kvm-virtulization-echosystem-intro.html kvm和qemu/q ...

  10. 网络虚拟化技术(二): TUN/TAP MACVLAN MACVTAP (转)

    网络虚拟化技术(二): TUN/TAP MACVLAN MACVTAP 27 March 2013 TUN 设备 TUN 设备是一种虚拟网络设备,通过此设备,程序可以方便得模拟网络行为.先来看看物理设 ...

随机推荐

  1. 【LGR-065】洛谷11月月赛 III Div.1

    T1,T2,T3,T4 T1 基础博弈练习题 分析 首先区间长度为1的情况特判,偶数必胜,奇数必败 考虑倒推,如果最后一个位置为偶数那么该位置为必败局面,否则为必胜局面 因为先手到这个位置要减去1就会 ...

  2. JDK 14的新特性:文本块Text Blocks

    目录 举个例子 Indentation编排 Escaping转义 formatted格式化 总结 说起来,Text Blocks是在JDK13中以第一次预览版本引入的.现在在JDK14中是第二次预览版 ...

  3. Linux程序崩溃自启动方法

    linux进程挂掉后,可以通过配置 systemd 来自动启动服务 1.创建 systemd 服务文件,例如:huyang.service,需要放置在系统文件夹 /etc/systemd/system ...

  4. MogDB-opengauss中的聚集与分组操作

    MogDB/opengauss 中的聚集与分组操作 COUNT:对结果集中的元组数量进行计数,如果是 COUNT(*),那么会统计所有元组(包括 NULL 值)的数量,如果是 COUNT(colnam ...

  5. GAN的实现和一些问题

    GAN的学习是一个二人博弈问题,最终目标是达到纳什平衡.对抗指的是生成网络和判别网络的互相对抗.生成网络尽可能生成逼真样本,判别网络则尽可能去判别该样本是真实样本,还是生成的假样本.示意图如下: 生成 ...

  6. Linux CentOs6.4 静态IP 设置

    Linux CentOs6.4 静态IP 设置 分类: IT技术 2013-04-07 09:20  2330人阅读  评论(1)  收藏  举报 To do that, just log on as ...

  7. docker 应用篇————nginx 例子[六]

    前言 简单整理一下nginx 例子. 正文 拉取nginx 镜像. docker pull nginx 那么会拉取nginx:latest 这个. 如果需要其他的,可以去官网查询一下. 2.docke ...

  8. 在ashx中如何使用session

    前言 都是写陈年往事罢了,如何在ashx 使用session 正文 我们知道在ashx 中使用context.Session 我们即读取不到值,同时设置完也感觉无效. 原因是我们在ashx 中使用的s ...

  9. ABP -Vnext框架一步一步入门落地教程——使用ABP -Vnext创建一个WEBAPI接口(二)

    开发主题:何谓开发应用服务端 在官方开发教程这一段的内容叫做开发应用服务端,作为现在前后端分离的开发模式来说,一个应用就分为前端页面框架和后端API,页面框架调用WEBAPI实现业务就完事了.所以咱们 ...

  10. drf——基于apiview写过滤、排序和分页

    基于APIView带过滤和排序 from rest_framework.views import APIView from .models import Book from .serializer i ...