当前位置:   article > 正文

Centos7的KVM安装配置详解

centos7安装kvm

KVM和虚拟化

虚拟化有几种类型:

  • 完全虚拟化(Full virtualization), 虚机使用原始版本的操作系统, 直接与CPU通信, 是速度最快的虚拟化.
  • 半虚拟化(Paravirtualization), 虚机使用修改过的操作系统, 与hypervisor通信, hypervisor不修改请求, 直接转发给CPU和其他接口.
  • 软件虚拟化(Software virtualization), 使用模拟器运行原始版本的操作系统. hypervisor将虚机请求翻译为宿主系统可以理解的格式. 比半虚拟化更慢.
  • 容器化(Containerization). 与KVM虚拟化创建一个单独的内核实例不同, 容器化直接在现有的内核实例上创建互相隔离的容器环境. 容器在适用性上不如KVM虚拟化, 但是更加轻量与灵活.

关于KVM

  • KVM (Kernel-based Virtual Machine) 属于完全虚拟化
    • 在内核中内置了KVM
    • 与QEMU (Quick Emulator) 集成
  • libvirt API 用于管理KVM
  • virt-manager和virsh是libvirt提供的管理工具

使用virsh edit guestname修改虚机配置而不是直接编辑虚机xml文件. 如果直接编辑虚机xml文件, 容易导致修改被覆盖. 通过virsh edit修改完配置后, 需要保存xml文件并重启虚机才能生效.

KVM模拟的网络设备

  • e1000 设备模拟 Intel E1000 network adapter (Intel 82540EM, 82573L, 82544GC).
  • rtl8139 设备模拟 Realtek 8139 network adapter.

Centos KVM环境

硬件环境

  • CPU需要支持虚拟化
  • 主板需要支持VT-x, 最好支持VT-d
    • VT-x: 运行64bit Guest OS基本指令
    • VT-d: 虚拟机可以直接针对硬件设备做存取,由北桥晶片来支援及BIOS来开启
    • VT-c: 以Network为主, 要由I/O装置来支援, 包含Virtual Machine Direct Connect 及 Virtual Machine Device Queues两项技术, 前者使用了SR-IOV(Single Root I/O Virtualization).

系统环境

  • 总核数 = 物理CPU个数 X 每颗物理CPU的核数
  • 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数
  1. # 查看物理CPU个数
  2. cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
  3. # 查看每个物理CPU中core的个数(即核数)
  4. cat /proc/cpuinfo| grep "cpu cores"| uniq
  5. # 查看逻辑CPU的个数
  6. cat /proc/cpuinfo| grep "processor"| wc -l
  7. # 查看物理机的cpu是否支持虚拟化, 找到flags部分,如果其中输出有VMX或SVM,即表明支持虚拟化技术。
  8. cat /proc/cpuinfo | egrep '(vmx|svm)'

查看系统版本

cat /etc/centos-release

查看是否加载KVM

lsmod | grep kvm

如果有kvm相关输出则表明已加载, 如果没有加载则执行命令

modprobe kvm加载KVM

安装KVM

  1. # 安装kvm
  2. yum install qemu-kvm qemu-img libvirt libvirt-python libvirt-client virt-install virt-viewer
  3. # 如果需要图形界面
  4. yum install virt-manager
  5. # 安装桥接工具
  6. yum install bridge-utils
  7. # 安装虚机镜像文件编辑工具
  8. yum install libguestfs-tools
  9. # 启动libvirt并设置开机自启动
  10. systemctl start libvirtd
  11. systemctl enable libvirtd

安装后, 使用virt-host-validate命令查看kvm环境的可用性.

  • qemu-kvm: KVM模块
  • libvirt: 虚拟管理模块
  • virt-manager: 图形界面管理虚拟机
  • virt-install: 虚拟机命令行安装工具

配置桥接网络

查看网口设备

  1. #
  2. yum install lshw
  3. # 这个命令可以将pci地址与网口设备对应上
  4. lshw -c network -businfo
  5. Bus info Device Class Description
  6. ========================================================
  7. pci@0000:02:00.0 eno1 network NetXtreme BCM5719 Gigabit Ethernet
  8. pci@0000:02:00.1 eno2 network NetXtreme BCM5719 Gigabit Ethernet
  9. pci@0000:02:00.2 eno3 network NetXtreme BCM5719 Gigabit Ethernet
  10. pci@0000:02:00.3 eno4 network NetXtreme BCM5719 Gigabit Ethernet
  11. virbr0-nic network Ethernet interface
  12. virbr0 network Ethernet interface

手工创建桥接网络

对应本机已有的网口, 创建一个新的配置文件为/etc/sysconfig/network-scripts/ifcfg-br0, br0是桥接的名字.
本机已有的网口为em1

  • 在上面指定桥接为br0, 这个名称可以自定义, 和后面创建的ifcfg-br0的文件名, 以及内部的DEVICE名称一致就可以
  • 取消IP等设置.
  • 需要带上MAC地址, 以避免网口名称漂移, 例如从em1变成em2, 这时候这个配置就不起作用了, 会出现br0获得IP, 这个网口也获得IP的情况
  • 正确配置的情况下, 在ifconfig的输出中只有br0有IP, em1这个网口是没有IP的
  1. $ more /etc/sysconfig/network-scripts/ifcfg-em1
  2. TYPE=Ethernet
  3. NAME=em1
  4. DEVICE=em1
  5. HWADDR=15:24:B4:63:D3:E1 # 加上, 不分大小写, 避免网口名漂移
  6. BRIDGE="br0"
  7. ONBOOT=yes

创建的桥接网络, 这里设置IP, GATEWAY和DNS

  1. $ more /etc/sysconfig/network-scripts/ifcfg-br0
  2. TYPE=Bridge
  3. BOOTPROTO=static
  4. DEVICE=br0
  5. ONBOOT=yes
  6. IPADDR=192.168.1.33
  7. NETMASK=255.255.255.0 #或者 PREFIX=24
  8. GATEWAY=192.168.1.1
  9. DNS1=192.168.1.1
  10. DNS2=114.114.114.114

然后systemctl restart network重启网络, 通过ifconfig和brctl查看网络设置

  1. $ brctl show
  2. bridge name bridge id STP enabled interfaces
  3. br0 800.3837173923 no em1
  4. vnet0

在没有创建虚拟机时,显示只绑定em1,运行虚机如果指定bridge=br0, 就会多一个vnet网卡

通过ip命令创建

  1. ip link add br0 type bridge
  2. ip link set br0 up
  3. ip link set tap0 master br0
  4. echo 0 > /sys/class/net/br0/bridge/stp_state
  5. ip addr add 10.0.1.1/24 dev br0

反向操作

  1. ip link set tap0 nomaster
  2. ip link set br0 down
  3. ip link delete br0 type bridge

通过brctl命令创建

创建桥接网络也可以通过brctl

  1. brctl addbr br0 # 创建网桥
  2. brctl addif br0 eth0 # 把br0和eth0网卡绑定
  3. brctl stp br0 on # 开启stp

对应的删除操作

  1. brctl delif br0 eth0 # 解除绑定
  2. ifconfig br0 down # 关闭br0, 不关闭删不掉
  3. brctl delbr br0 # 删除br0

虚机创建和管理

下载预安装的Centos镜像

关于qcow2c格式
在下载中有一种扩展名为qcow2c格式的镜像, 这种镜像是压缩版的qcow2, 和qcow2一样可以正常使用, 但是不保证IO性能.

This is the same image, run through the qemu qcow2 internal compression setup - while this image is suiteable for development and play, it comes with non trivial i/o performance penalties and therefore not recommended for production.

在实际使用中, 只要yum update过以及稍微安装了一些东西, qcow2c和qcow2的大小区别不大, 所以如果不是只开一下机测试一下, 那么还是建议用不带c的qcow2格式.

图形界面创建虚机

图形界面安装

  1. virt-install --name guest1-rhel7 \
  2. --memory 2048 \
  3. --vcpus 2 \
  4. --disk size=8 \
  5. --cdrom /home/username/Downloads/rhel-workstation-7.4-x86_64-dvd.iso \
  6. --os-variant rhel7

或者

  1. virt-install \
  2. --connect qemu:///system \ #连接默认本机hypervisor
  3. --virt-type kvm \ #虚拟化类型为kvm
  4. --vcpus 1 \ #vcpu为1
  5. --name unbuntu16 \ #虚拟机名称
  6. --ram 512 \ #内存大小
  7. --cdrom /var/lib/libvirt/images/ubuntu-16.04.5-server-amd64.iso \ #指定使用cdrom光驱启动,指定镜像路径
  8. --disk path=/var/lib/libvirt/images/ubuuntu16.img,size=50,format=qcow2,bus=virtio \ #指定硬盘路径,大小,格式为qcow2,总线类型为virtio
  9. --network bridge=br0 #指定虚拟网络类型为网桥br0

命令行创建虚机

如果需要用vnc连, 就需要用graphics参数, 如果想在虚机创建后console连接立即可用, 需要在 extra-args中添加 console=tty0 console=ttyS0,115200n8 参数[已验证]

  1. virt-install --name rhel7anaconda-guest \
  2. -r 1024 \
  3. --location /home/jherrman/Downloads/rhel-workstation-7.4-x86_64-dvd.iso \
  4. --disk size=8 \
  5. --nographics \
  6. --extra-args "console=tty0 console=ttyS0,115200n8"

或者

  1. virt-install --name centos7-guest --memory 1024 \
  2. --location /data/iso/CentOS-7-x86_64-Minimal-2009.iso \
  3. --disk path=/data/vms/centos7-guest.qcow2,size=10,format=qcow2 \
  4. --network bridge=br0 \
  5. --nographics \
  6. --extra-args "console=tty0 console=ttyS0,115200n8"

或者先创建虚机镜像文件, 再开始安装, 前一种方式镜像文件会直接申请10G, 如果先用qemu-img创建就不会.

  1. # 会创建一个很小的qcow2格式镜像文件
  2. qemu-img create -f qcow2 centos7-guest.qcow2 10G
  3. # 使用这个镜像进行安装, 文件大小会根据数据增长
  4. virt-install --name centos7-guest --memory 1024 \
  5. --vcpus 1 \
  6. --location /data/iso/CentOS-7-x86_64-Minimal-2009.iso \
  7. --disk path=/data/vms/centos7-guest.qcow2 \
  8. --network bridge=enxbr0 \
  9. --nographics \
  10. --os-type linux \
  11. --os-variant centos7.0 \
  12. --extra-args "console=tty0 console=ttyS0,115200n8"

或者

  1. virt-install \
  2. --virt-type kvm \
  3. --name test1 \
  4. --vcpus 2 \
  5. --memory 2048 \
  6. --location /root/images/CentOS-7-x86_64-Minimal-1810.iso \
  7. --disk path=/root/test1.qcow2,size=10,format=qcow2 \
  8. --network bridge=virbr0 \
  9. --graphics none \
  10. --extra-args "console=ttyS0"

或者

  1. virt-install \
  2. --name test03 \
  3. --ram 512 \
  4. --vcpus 1 \
  5. --network bridge=br0 \
  6. -f /data/kvm_centos/centos6.7_03.qcow2 \
  7. --location /data/soft/CentOS-6.7-x86_64-bin-DVD1.iso \
  8. --graphics vnc,listen=0.0.0.0,port=5987, \
  9. --extra-args "console=tty0 console=ttyS0,115200n8 serial" \
  10. --force \
  11. --autostart

此时在虚机上启动serial-getty服务(虚机为Centos7)

  1. systemctl enable serial-getty@ttyS0.service
  2. systemctl start serial-getty@ttyS0.service

宿主机就可以通过console访问

virsh console [虚机名称] ##

导入已有的镜像创建虚机

  1. virt-install \
  2. --name demo \
  3. --memory 512 \
  4. --disk /home/user/VMs/mydisk.img \
  5. --import

导入Centos官方的镜像, 并使用KVM的NAT网络, 参数中不需要extra-args, 默认就可以通过virsh console连接

  • 将镜像复制到vm工作目录
  • 通过guestfish或virt-customize修改root口令
  • 执行下面的导入
  1. virt-install \
  2. --name c7guest1 \
  3. --vcpus 2 \
  4. --memory 4096 \
  5. --disk /data/vms/c7guest1.qcow2c \
  6. --graphics none \ # 重要,如果不加这个参数,在执行此命令时就看不到启动过程
  7. --import \
  8. --os-type linux \
  9. --os-variant centos7.0 \ # 对于centos7.x建议加上
  10. --network bridge=br0,model=virtio # 将虚机配置到宿主机的桥接网络

导入Ubuntu镜像

  1. virt-install --name ubuntu2004-guest \
  2. --vcpus 2 --memory 4096 \
  3. --disk /data/vms/ubuntu2004-guest.qcow2 \
  4. --graphics none \
  5. --import \
  6. --os-type linux --os-variant ubuntu20.04 \
  7. --network bridge=enxbr0,model=virtio

修改root口令
Centos官方的镜像, root未设置口令, 而是通过ssh key登录, 可以通过guestfish修改, 或通过virt-customize修改.
通过guestfish:

  1. # guestfish --rw -a <qcow2 image file name>
  2. ><fs> run
  3. ><fs> list-filesystems
  4. ><fs> mount /dev/vda1 /
  5. ><fs> vi /etc/shadow # 这一步, 通过openssl passwd -1 changeme生成
  6. ><fs> umount /
  7. ><fs> exit # 或者quit

通过virt-customize

  1. # 安装virt-customize
  2. yum install libguestfs-tools
  3. # 停止虚机, 然后执行修改, --uninstall cloud-init是用于disable the cloud-init service
  4. virt-customize -a CentOS-7-x86_64-GenericCloud-2009.qcow2c --root-password password:[your password] --uninstall cloud-init

创建非X86异构虚机

ARM虚机, 需要手工指定一个启动kernel

  1. virt-install \
  2. --name armtest \
  3. --memory 1024 \
  4. --arch armv7l --machine vexpress-a9 \
  5. --disk /home/user/VMs/myarmdisk.img \
  6. --boot kernel=/tmp/my-arm-kernel,initrd=/tmp/my-arm-initrd,dtb=/tmp/my-arm-dtb,kernel_args="console=ttyAMA0 rw root=/dev/mmcblk0p3" \
  7. --graphics none

virt-install 常用参数

  • --import 跳过OS安装过程, 使用存在的磁盘镜像创建虚机. Skip the OS installation process, and build a guest around an existing disk image. The device used
    for booting is the first device specified via "--disk" or "--filesystem".

  • --name 或者 -n, 指虚机名称

  • --vcpus 虚拟CPU个数

  • --memory 2048 或者 -r/--ram, 后两者已经deprecated. 单位为MiB

  • --disk

    • size=8 指定磁盘大小, 单位为GiB
    • path=/somewhere/somefile 指定虚机文件路径, 如果不存在则会尝试创建(此时必须要有size参数)
    • format 磁盘镜像格式, 可以是 'raw', 'qcow2', 'vmdk' 等等, 默认为'qcow2'.
  • --location 或者-l, 指定安装来源, Distribution tree installation source. virt-install can recognize certain distribution trees and fetches a bootable kernel/initrd pair to launch the install

  • --cdrom 或者-c, 指定用于虚拟光驱的文件或设备 File or device used as a virtual CD-ROM device

  • --os-variant 指定虚机操作系统类型, 可以极大提升性能. 例如'fedora18', 'rhel7', 'winxp'等. 可以使用"osinfo-query os"命令查询可用的类型

  • --arch 指定系统架构例如aarch64, 默认与宿主机相同

  • --graphics 指定显示类型和输出, 例如 --graphics vnc,password=foobar, 如果没有指定, virt-install会自动检测可用的图形环境, 如果没有, 则会使用 --graphics none

  • --noautoconsole 阻止自动连接虚机console, 默认会自动连接

  • --network

    • bridge=BRIDGE 连接到桥接网络
    • network=NAME 连接到虚拟网络NAME. 虚拟网络可以用irsh 创建删除和查询. 默认会有一个default网络. 如果宿主机的网络是动态的则使用虚拟网络, 虚机将使用NAT连接到LAN.
    • type=direct,source=IFACE[,source_mode=MODE] 使用macvtap直接连接到宿主机网口IFACE
  • --extra-args 或者 -x 指定额外参数

  • --accelerate 在安装QEMU虚机时优先使用 KVM or KQEMU, 在最近的版本中已经是默认开启, 所以此参数已经decrecated. 如果要安装一个纯QEMU虚机, 使用参数'--virt-type qemu'

virt/virsh常用命令

直接输入virsh会进入交互式命令行, 或者直接使用 virsh + 指令 的形式执行命令

  • cd 更改当前目录
  • connect 连接(重新连接)到 hypervisor
  • echo echo 参数
  • exit 退出这个非交互式终端
  • help 打印帮助
  • pwd 输出当前目录
  • quit 退出这个非交互式终端
  • list 列出正在运行的虚拟机列表 --all列出所有
  • autostart 配置虚拟机自启,--disable表示禁用自启动
  • dumpxml 输出特定虚拟机XML格式的配置文件
  • create 从一个 XML 文件创建一个新虚拟机
  • define 从一个 XML 文件定义(但不开始)一个虚机
  • undefine 撤销一个虚机, 会将/etc/libvirt/qemu/下面的虚机xml删除, 但是不会删除虚机镜像文件
  • destroy 只是停止虚机, 不会删除/etc/libvirt/qemu/下面的虚机xml, 也不会删除虚机镜像
  • dominfo 虚机信息
  • domid 把一个域名或 UUID 转换为域 id
  • domstate 域状态
  • edit 编辑某个域的 XML 配置
  • reboot 重启一个虚机
  • shutdown 关闭一个虚机
  • start 启动一个虚机
  • save 把一个域的状态保存到一个文件
  • restore 从一个存在一个文件中的状态恢复一个域
  • screenshot 提取当前域控制台截图并保存到文件中
  • suspend 挂起一个虚机
  • resume 重新恢复一个虚机
  • setmem 改变内存的分配
  • setmaxmem 改变最大内存限制值
  • setvcpus 改变虚拟 CPU 个数
  • vcpuinfo 详细的域 vcpu 信息
  • attach-device 从一个XML文件添加设备
  • net-create 从一个 XML 文件创建一个网络
  • net-dumpxml 输出XML格式的网络信息
  • net-list 列出网络
  • net-start 启动一个网络
  • iface-define 使用XML文件定义主机网络接口
  • iface-list 物理主机接口列表
  • snapshot-create 使用 XML 生成快照
  • snapshot-delete 删除域快照
  • snapshot-dumpxml 为域快照备份xml
  • snapshot-list 为域列出快照

设置开机启动

  1. virsh autostart vm_agent
  2. # 逆操作
  3. virsh autostart --disable vm_agent

qemu-img命令

创建镜像qemu-img create

  1. # 创建一个设备空间大小为10G的镜像
  2. qemu-img create -f qcow2 centos7-guest.qcow2 10G
  3. # 基于backing_file创建大小为20G的镜像, 使用-b参数, -F用于指定backing_file的格式
  4. qemu-img create -F qcow2 -b /path/to/backing-kvm.img -f qcow2 /path/to/target.qcow2 20G
  5. # 基于backing_file创建大小为20G的镜像, 使用-o参数, 都在-o参数内指定
  6. qemu-img create -f qcow2 -o backing_file=/path/to/rhel6u3.img,backing_fmt=qcow2,size=20G /path/to/target.qcow2

关于backing_file的说明
If the option backing_file is specified, then the image will record only the differences from backing_file. No size needs to be specified in this case. backing_file will never be modified unless you use the "commit" monitor command (or qemu-img commit).

查看镜像信息 qemu-img info

qemu-img info rhel6u3.img

转换镜像格式 qemu-img convert

使用-f指定源文件格式, 用-O指定目标文件格式

  1. qemu-img convert -f raw -O qcow2 centos.img centos.qcow2
  2. qemu-img convert -f qcow2 -O raw centos.qcow2 centos.raw

virsh 管理虚机快照

快照会创建在虚机自身的qcow2文件上. virsh snapshot命令不支持raw磁盘格式, 如果需要使用快照功能, 用以下命令将raw转换为qcow2

qemu-img convert -f raw -O qcow2 image-name.img image-name.qcow2

创建快照

  1. # 格式
  2. virsh snapshot-create-as –domain {vm_name} –name {snapshot_name} –description “enter description”
  3. # 命令例子
  4. virsh snapshot-create-as --domain vm01 --name snap001 --description "snap before patch on 4Feb2018"

列出虚机的快照, 查看快照信息

  1. # 列出
  2. virsh snapshot-list vm01
  3. # 查看
  4. virsh snapshot-info --domain vm01 --snapshotname snap001

查看快照大小, 用 qemu-img 命令

qemu-img info /data/vms/vm01.qcow2

还原快照, 执行还原时必须关闭虚机

  1. # 格式
  2. virsh snapshot-revert {vm_name} {snapshot_name}
  3. # 命令例子
  4. virsh snapshot-revert vm01 snap001

删除快照

virsh snapshot-delete --domain vm01 --snapshotname snap001

virt-clone命令

克隆前对源虚机的处理

  1. 删除网络配置
# rm -f /etc/udev/rules.d/70-persistent-net.rules

如果没删除udev rules, 克隆后的虚机的第一个网口会变成eth1而不是eth0.

  1. 从/etc/sysconfig/network-scripts/ifcfg-eth[x]文件中删除包含唯一ID的网络配置信息. 例如HWADDR, 如果不删除, 与新虚机中的MAC地址不匹配, 这个ifcfg将被忽略.
  1. DEVICE=eth[x]
  2. BOOTPROTO=none
  3. ONBOOT=yes
  4. #NETWORK=10.0.1.0 <- REMOVE
  5. #NETMASK=255.255.255.0 <- REMOVE
  6. #IPADDR=10.0.1.20 <- REMOVE
  7. #HWADDR=xx:xx:xx:xx:xx <- REMOVE
  8. #USERCTL=no <- REMOVE
  9. # Remove any other *unique* or non-desired settings, such as UUID.

确保除了DHCP以外其他的全局唯一信息都被删除

  1. DEVICE=eth[x]
  2. BOOTPROTO=dhcp
  3. ONBOOT=yes
  4. Ensure that the file includes the following lines:
  5. DEVICE=eth[x]
  6. ONBOOT=yes

如果存在以下的文件, 确保它们的内容一致

  • /etc/sysconfig/networking/devices/ifcfg-eth[x]
  • /etc/sysconfig/networking/profiles/default/ifcfg-eth[x]

删除其他信息

  1. rm /etc/sysconfig/rhn/systemid
  2. subscription-manager unsubscribe --all
  3. subscription-manager unregister
  4. subscription-manager clean
  5. subscription-manager clean

删除sshd密钥

# rm -rf /etc/ssh/ssh_host_*

克隆命令

virt-clone --connect qemu:///system --original demo --name newdemo --file /var/lib/libvirt/images/newdemo.img --file /var/lib/libvirt/images/newdata.img

virt-filesystems命令

查看镜像的磁盘大小

  1. virt-filesystems --long --parts --blkdevs -h -a c7guest1.qcow2c
  2. Name Type MBR Size Parent
  3. /dev/sda1 partition 83 8.0G /dev/sda
  4. /dev/sda device - 8.0G -

virt-resize命令

将旧镜像中的文件系统扩充到新镜像中, 用于调整虚机磁盘大小

  1. # 创建一个50G容量的qcow2空白镜像
  2. qemu-img create -f qcow2 /data/images/win2012-50gb.qcow2 50G
  3. # 将镜像扩充到新镜像中去, 通过--expand指定需要扩张的分区
  4. virt-resize --expand /dev/sda2 /data/images/win2012.qcow2 /data/images/win2012-50gb.qcow2

此时只是将在虚机磁盘上增加了可用空间, 但是未体现到文件系统, 启动虚机后, 在虚机中扩充分区大小

  1. # 查看分区
  2. df -h
  3. # 查看分区对应的磁盘大小, 能看出来/dev/vda1已经增长, 但是未体现到df -h的输出中
  4. fdisk -l
  5. # 如果/dev/vda1格式是xfs
  6. xfs_growfs /dev/vda1
  7. # 如果/dev/vda1格式是ext2,3,4
  8. resize2fs /dev/vda1

网络配置

KVM支持以下的网络虚拟化

  • 使用NAT的虚拟网络 virtual networks using Network Address Translation (NAT)
  • 直接使用PCI物理设备 directly allocated physical devices using PCI device assignment
  • 使用PCIe SR-IOV的虚拟化
  • 桥接网络

查看当前qemu支持的网口模式

Centos7中, qemu-kvm这个命令并不在路径中, 需要直接指定路径

  1. /usr/libexec/qemu-kvm -net nic,model=?
  2. qemu: Supported NIC models: ne2k_pci,i82551,i82557b,i82559er,rtl8139,e1000,pcnet,virtio

对于万兆网口, 需要使用virtio模式才能支持

桥接网络

这个是最常用的网络配置方式, 在宿主机网口创建桥接网络, 在虚机上使用此桥接网络, 实现与宿主机共享同一内网.
参考前面的桥接网络创建部分. 这种方式不需要设置net.ipv4.ip_forward = 1.

  • 在创建虚机时使用--network bridge=br0参数, 或者在虚机配置xml文件中修改.
  • 虚机启动后, 在宿主机通过brctl show可以看到新创建的虚拟网口vnet[n], 这个网口在虚机停止后会自动删除.

手动添加到桥接网络
通过virsh edit编辑虚机, 添加下面的内容

  1. <interface type='bridge'>
  2. <source bridge='br1'/>
  3. <model type='virtio'/> <!-- 指定使用virtion, 否则系统会自动指定rtl8139 -->
  4. </interface>

然后保存退出, virsh会自动添加其它的部分, 这时候再用virsh edit进入查看, 可以看到变成了

  1. <interface type='bridge'>
  2. <mac address='52:54:00:11:4d:11'/> <!-- 系统自动添加的 -->
  3. <source bridge='br1'/>
  4. <model type='virtio'/>
  5. <address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/> <!-- 系统自动添加的 -->
  6. </interface>

NAT虚拟网络

如果宿主机的网口使用DHCP或动态IP, 不适合在网口上直接创建桥接, 可以使用NAT虚拟网络让虚机连入. 这种配置方式下, 虚机可以通过NAT上网, 但是从宿主机以外的其他机器, 不能直接访问虚机.

查看可用的网络, 配置文件在 /etc/libvirtd/qemu/ 下, 默认的default网络配置文件为 /etc/libvirt/qemu/networks/default.xml

  1. # 查看
  2. virsh net-list --all
  3. # Mark the default network to automatically start:
  4. virsh net-autostart default
  5. # Start the default network:
  6. virsh net-start default

对应的反操作

  1. # Mark the default network not to automatically start:
  2. virsh net-autostart default --disable
  3. # Shutdown the default network:
  4. virsh net-destroy default

当default网络启动后, 系统中就可以看到这个桥接设备. 此设备并不包含物理网口, 它用NAT和IP转发连接至物理网络

  1. # brctl show
  2. bridge name bridge id STP enabled interfaces
  3. virbr0 8000.000000000000 yes

宿主机应当启用ip转发

  1. # add the following to /etc/sysctl.conf.
  2. net.ipv4.ip_forward = 1

虚机在创建时 使用--network network=default, 或通过下面的配置连接default网络
/etc/libvirtd/qemu/xxx.xml

  1. <interface type='network'>
  2. <source network='default'/>
  3. </interface>

在虚机启动后, 在宿主机上通过ifconfig可以看到新增加的网卡vnet0(在虚机中可以看到同样mac地址的eth1), 在brctl show中也可以看到新增加的网口

  1. # brctl show
  2. bridge name bridge id STP enabled interfaces
  3. virbr0 8000.5254008c2001 yes virbr0-nic
  4. vnet0

virtio模式

在网口上使用virtio模式, 比rtl8139模式能提供更好的性能, 并且能支持万兆网络.

启用virtio模式
对于需要开启virtio模式的网口, 需要将虚机的网口配置, 从<model type='rtl8139'/>修改为<model type='virtio'/>.

  1. <interface type='bridge'>
  2. <mac address='52:54:00:61:34:dd'/>
  3. <source bridge='br0'/>
  4. <model type='virtio'/>
  5. <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
  6. </interface>

重启虚机后, 通过在虚机中执行lspci可以看到修改是否生效

  1. [root@c7guest2 ~]# lspci
  2. 00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02)
  3. ...
  4. 00:03.0 Ethernet controller: Red Hat, Inc. Virtio network device
  5. ...

如果未生效, 默认使用的是rtl8139

00:03.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8100/8101L/8139 PCI Fast Ethernet Adapter (rev 20)

如果使用virtio模式, 在宿主机中查看vhost-net的使用情况

  1. [root@kvm-host ~]# more /boot/config-3.10.0-1160.21.1.el7.x86_64 |grep VHOST
  2. CONFIG_VHOST_NET=m #这个表示已经将vhost-net编译为module
  3. # CONFIG_VHOST_SCSI is not set
  4. CONFIG_VHOST_VSOCK=m
  5. CONFIG_VHOST_RING=m
  6. CONFIG_VHOST=m
  7. # CONFIG_VHOST_CROSS_ENDIAN_LEGACY is not set
  8. [root@kvm-host ~]# lsmod|grep vhost
  9. vhost_net 22693 1 # 这个表示已经启用
  10. vhost 48851 1 vhost_net
  11. macvtap 22757 1 vhost_net
  12. tun 36164 6 vhost_net

上面的输出, 表明宿主机内核将vhost-net编译为module且vhost-net模块处于使用中状态

virtio模式下网口的速率问题
对于virtio模式的虚机网口, 是无法查看实际速率的, 通过ethtool和mii-tool都不行

  1. # ethtool eth0
  2. Settings for eth0:
  3. Link detected: yes
  4. # mii-tool eth0
  5. SIOCGMIIPHY on 'eth0' failed: Operation not supported

关于这个问题的说明 https://serverfault.com/questions/738840/get-link-speed-of-an-virtio-net-network-adapter
Virtio是一个半虚拟化设备, 意味着宿主和虚机都知道这个不是物理设备, 这个设备只是在虚机和hypervisor之间的一个API, 所以其速度和普通的网口无关. 对于hypervisor模拟的物理设备提供的网口速率来说, virtio能提供更好的性能. 虚机仅仅从总线中获取数据包, 由宿主负责与物理网口的交互, 虚机不需要也不关心宿主机的网口速率, 两个虚机之间交换数据包时速度只取决于内存之间的数据移动速度, 无法用网口速率来限制. Virtio允许宿主在多个虚机之间调节带宽, 而不需要在虚机启动时明确指定. 如果需要知道virtio网口的速率, 可以通过一些测试工具例如iperf3获得.

SR-IOV虚拟网络

SR-IOV技术可以在多个虚机之间共享一个物理网口. SR-IOV Virtual Functions有近乎物理设备的性能, 并且在同一个物理设备上对不同虚机提供了数据保护.

检查硬件是否支持

普通桌面用的CPU, i3, i5, 不带K的i7, 以及大部分E3系列CPU, 对SR-IOV的支持是不太好的, 这点需要提前了解, 如果要使用SR-IOV, 建议使用E5及以上的CPU. SR-IOV不能使用的网卡, 直接对PF配置直通也不能成功.

在宿主机中使用SR-IOV设备

对于Intel系统, 在BIOS中启用VT-d, 对于AMD系统, 则启用AMD IOMMU. 使用lspci命令

  1. # lspci
  2. 03:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
  3. 03:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)

检查PCI设备是否有SR-IOV功能, 带SR-IOV功能的设备, 会有sriov_numvfs和sriov_totalvfs这两个文件

  1. # 查看可用的VF数量上限
  2. more /sys/class/net/enp14s0f0/device/sriov_totalvfs

启用Virtual Functions

  1. # 创建指定数量的VF, 默认为0
  2. echo ${num_vfs} > /sys/class/net/enp14s0f0/device/sriov_numvfs

上面的命令可能遇到的错误: can't enable 8 VFs (bus 02 out of range of [bus 01])

  • 检查BIOS是否开启VT-d和Intr-Remap, 以及开启PCI Subsystem 的 SR-IOV Support, 但并非所有主板都支持这些BIOS设置
  • 如果主板不支持, 则需要在grub中添加pci=assign-busses intel_iommu=on启动参数, 前者是为了解决bus 02 out of range的错误, 后者是为了解决在虚机中绑定sr-iov设备后启动报host doesn't support passthrough of host PCI devices的错误

BIOS不支持SR-IOV的解决方案: 在grub中添加启动参数

  1. 编辑/etc/default/grub, 在GRUB_CMDLINE_LINUX="crashkernel=auto ..."这一行引号内的末尾, 添加pci=assign-busses intel_iommu=on, 注意前面保留空格
  2. 注意: 对于支持SR-IOV的服务器, 不要使用 pci=assign-busses 否则会导致centos无法启动
  3. 保存后, 需要更新grub.cfg, 检查这个文件位置是在 /boot/grub2/grub.cfg 还是在 /boot/efi/EFI/centos/grub.cfg, 对应的执行命令
grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

重启后, 使用下面的命令检查是否带上了刚才添加的参数

cat /proc/cmdline

如果添加成功, 此时运行上面的sriov_numvfs文件修改命令就可以正常执行, 在lspci中就能看到新添加的VF网卡

持久化为开机启动
下面的例子中,

  • 文件名称可以随便, 如果以数字, 如 70- 开头, 可以设置其执行顺序
  • 一行就是一个判断+赋值的语句, 一个文件可以有多行
  • 将 ENV{ID_NET_DRIVER} 的值替换为实际使用的驱动名称, 具体的驱动名称可以通过lsmod查看, 可能为igb或者ixgbe
  • 对应的sriov_numvfs可以使用设备所支持的VF数量, 本例中为2
  • 注意, 前面几个都是==, 是用于判断条件的, ATTR这个是=, 是用于赋值的. 条件判断必须用ENV的参数, 如果用ATTR似乎无效(在Centos7里测试是这样的)
  1. vim /etc/udev/rules.d/enp14s0f0.rules
  2. # 内容
  3. ACTION=="add", SUBSYSTEM=="net", ENV{ID_NET_DRIVER}=="ixgbe", ATTR{device/sriov_numvfs}="2"
  4. # 或者精确到具体的网口, 用endor和mac地址判断
  5. ACTION=="add", SUBSYSTEM=="net", ENV{ID_NET_DRIVER}=="ixgbe", ENV{ID_VENDOR_ID}=="0x8086", ENV{ID_NET_NAME_MAC}=="enx00113113b042", ATTR{device/sriov_numvfs}="3"
  6. ACTION=="add", SUBSYSTEM=="net", ENV{ID_NET_DRIVER}=="ixgbe", ENV{ID_VENDOR_ID}=="0x8086", ENV{ID_NET_NAME_MAC}=="enx00123113b043", ATTR{device/sriov_numvfs}="2"
  7. ACTION=="add", SUBSYSTEM=="net", ENV{ID_NET_DRIVER}=="igb", ENV{ID_VENDOR_ID}=="0x8086", ENV{ID_NET_NAME_MAC}=="enx002b21365cee", ATTR{device/sriov_numvfs}="3"
  8. ACTION=="add", SUBSYSTEM=="net", ENV{ID_NET_DRIVER}=="igb", ENV{ID_VENDOR_ID}=="0x8086", ENV{ID_NET_NAME_MAC}=="enx002b21365cef", ATTR{device/sriov_numvfs}="2"

上面的 ID_VENDOR_ID 和 ID_NET_NAME_MAC 可以用下面的udevadm命令得到. 如果在输出中有这个enp14s0f0.rules对应的sriov_numvfs设置, 就说明配置生效了

udevadm test /sys/class/net/enp14s0f0

使用lspci检查新产生的VF, 使用-n参数可以看到PCI设备ID

  1. # lspci | grep 82576
  2. 0b:00.0 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
  3. 0b:00.1 Ethernet controller: Intel Corporation 82576 Gigabit Network Connection (rev 01)
  4. 0b:10.0 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
  5. 0b:10.1 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
  6. 0b:10.2 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
  7. ...
  8. 0b:10.6 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
  9. 0b:10.7 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
  10. 0b:11.0 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
  11. 0b:11.1 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)
  12. ...
  13. 0b:11.5 Ethernet controller: Intel Corporation 82576 Virtual Function (rev 01)

从上面可以看到, 物理方法(PF)对应的是0b:00.0和0b:00.1, 而VF都会在设备名称中包含Virtual Function

在irsh中检查设备, 使用virsh nodedev-list命令查看, 使用0b过滤上面的例子

  1. # virsh nodedev-list | grep 0b
  2. pci_0000_0b_00_0
  3. pci_0000_0b_00_1
  4. pci_0000_0b_10_0
  5. pci_0000_0b_10_1
  6. ...
  7. pci_0000_0b_11_7
  8. pci_0000_0b_11_1
  9. ...
  10. pci_0000_0b_11_5

通过irsh获取设备详情, 使用virsh nodedev-dumpxml

  1. virsh nodedev-dumpxml pci_0000_0b_10_0
  2. <device>
  3. <name>pci_0000_0b_10_0</name>
  4. <path>/sys/devices/pci0000:00/0000:00:01.0/0000:0b:10.0</path>
  5. <parent>pci_0000_0b_00_1</parent>
  6. ...
  7. </device>

选项1:在虚机中直接添加SR-IOV设备

使用上面的参数, 创建设备xml: /tmp/new-interface.xml

  1. <interface type='hostdev' managed='yes'>
  2. <source>
  3. <address type='pci' domain='0x0000' bus='0x0b' slot='0x10' function='0x2'/>
  4. </source>
  5. </interface>

添加到运行中虚机(热拔插)
通过 virsh attach-device 命令

virsh attach-device MyGuest /tmp/new-interface.xml --live --config
  • 参数 --live 用于添加到运行中的虚机, 如果虚机是关闭状态的可以不加这个参数
  • 参数 --config 用于确保写入配置, 在重启后依然有效.

从运行中的虚机中移除(热拔插)
通过 virsh detach-device 命令

virsh detach-device <domain_name> <add_pci_vf.xml> –-live

从宿主机上解绑(和恢复绑定)
对于managed="yes"的设备, 在attach-device 时会自动从宿主机上dettach, 在宿主机上运行ifconfig可以看到此网卡不在列表中了; 在detach-device时会自动在宿主机上attach, 不需要额外的解绑和绑定操作, 但是对于managed="no"的节点, 需要额外的操作:

使用nodedev-detach命令, 将设备从宿主机上解除, 这样就可以在虚机上通过 安全使用.

  1. #
  2. virsh nodedev-detach <pci_device_name>
  3. #
  4. virsh nodedev-dettach pci_0000_06_10_0

通过nodedev-reattach命令可以取消解除, 让宿主机可以使用此设备

  1. #
  2. virsh nodedev-reattach <pci-device-name>
  3. #
  4. virsh nodedev-reattach pci_0000_06_10_0

手动添加到已关机的虚机上
编辑虚拟机的 XML 文件

  1. virsh edit MyGuest
  2. # 添加下述内容, mac可以自己定
  3. <interface type='hostdev' managed='yes'>
  4. <mac address='52:54:00:fe:72:11'/>
  5. <source>
  6. <address type='pci' domain='0x0000' bus='0x06' slot='0x10' function='0x0'/>
  7. </source>
  8. <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
  9. </interface>

检查直通网卡是否配置成功
虚机重启后, 通过ifconfig查看系统自动生成的网口名称, 对应的在/etc/sysconfig/network-scripts/下创建对应的ifcfg配置文件, 可以通过复制现有的配置文件创建, 但是要注意修改文件名以及内部的NAME和DEVICE, 添加上HWADDR避免名称漂移.
为了测试直通是否成功, 可以将此网口IP设置为不同网段的IP(或接入到单独的交换机上), 测试是否可以通过此IP连接到虚机.
如果在同一交换机上使用相同网段的IP, 可能会导致此IP的ARP指向原宿主机桥接网口MAC地址, 导致测试失败.

选项2:使用KVM设备池给虚机添加SR-IOV设备

直接给虚机添加SR-IOV设备会存在一些问题

  1. 物理网卡的PCI地址在重启后是可能发生变化的, 一旦发生变化, 配置在虚机xml里的interface对应的pci地址就无效了, 会导致虚机无法启动
  2. 无法手动批量去给每一个虚机添加具体的SR-IOV设备

所以在生产中, 最好使用SR-IOV virtual functions pool给虚机添加设备, 具体的步骤是

将SR-IOV设备池添加到KVM网络
创建一个文件, 名为sriov-ge0.xml, 内容为

  1. <network>
  2. <name>sriov-ge0</name>
  3. <forward mode="hostdev" managed="yes">
  4. <pf dev="enp4s0f0" />
  5. </forward>
  6. </network>

其中 是此网络设备池在net-list中显示的名称, dev的enp4s0f0是SR-IOV的PF设备的名称(即网口名称), 对这个文件执行命令添加到KVM网络列表, 在执行这个命令之前, 需要确认使用了此SR-IOV设备的虚机都已经关闭

  1. # 添加到kvm网络
  2. virsh net-define sriov-ge0.xml
  3. # 查看是否添加成功
  4. virsh net-list --all
  5. # 设为自动启动
  6. virsh net-autostart sriov-ge0
  7. # 启动
  8. virsh net-start sriov-ge0
  9. # 检查是否已启动
  10. virsh net-list --all

对应的反操作是

  1. # 强制停止
  2. virsh net-destroy sriov-10ge0
  3. # 移除
  4. virsh net-undefine sriov-10ge0

将设备添加到虚机
在运行中的虚机上添加, 创建一个文件, 名为new-interface2.xml, 内容为

  1. <interface type='network'>
  2. <source network='sriov-ge0'/>
  3. </interface>

其中network的值, 就是上一步创建的网络名称.
执行下面的命令, 对运行中的虚机添加设备

virsh attach-device MyGuest new-interface2.xml --live --config

显示成功后, 在虚机中通过dmesg查看新硬件信息, 然后再手动配置对应的ifcfg-xxx文件.
此时查看虚机xml, 会发现增加了对应的interface配置, 里面设置的model type为rtl8139, 但是在虚机系统里看到的硬件是对的, 是intel.

  1. <interface type='network'>
  2. <mac address='52:54:00:a9:xx:xx'/> <!-- 自动生成的 -->
  3. <source network='sriov-ge0'/>
  4. <model type='rtl8139'/> <!-- 自动生成的 -->
  5. <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/> <!-- 自动生成的 -->
  6. </interface>

如果手工添加, 通过virsh edit添加上面的内容, 也会默认分配设备类型为rt8139.

问题

需要选择正确的CPU和主板, 以及内核版本

存在问题的场景:

  • HP DL388 gen9服务器自带的4口千兆网卡331i, 不带SR-IOV支持
    在Centos7.9下实测, 用lspci -s 0000.03:xx.x -vv查看, 没有对应的capabilities.
  • 所有非XEON E5, E7的系统, 包括E3以及i3, i5, 绝大部分i7, 主板第一个PCIE插槽无法使用SR-IOV
  • 对于以上的主板如果有内核补丁支持, 主板的第二个及以后的PCIE插槽, 在部分内核版本中支持SR-IOV, 需要实际测试
    例如Centos7的3.10.x内核, 对于在第二个PCIE插槽的82576可以正常使用SR-IOV, 但是同样情况的82599会导致虚机启动闪退, 提示vfio_dma_map -14 Bad address, 在5.11.x内核就可以正常使用

B85M主板, 将82599 X520 DA2网卡插在第一个PCIE插槽. 此时无论是直接使用PCI地址, 还是通过pool, 如果向运行中的虚机添加SR-IOV设备, 都会出现"group 1 is not viable... Device initialization failed"错误; 如果是向关闭中的虚机添加, 则在启动时会报"group 1 is not viable Please ensure all devices within the iommu_group are bound to their vfio bus driver."的错误.
使用virsh nodedev-dumpxml查看82599的VF和PF设备, 这些设备都出现在了同一个iommuGroup下面, 就像这样

  1. [root@localhost ~]# virsh nodedev-dumpxml pci_0000_02_10_0
  2. <device>
  3. <name>pci_0000_02_10_0</name>
  4. <path>/sys/devices/pci0000:00/0000:00:01.0/0000:02:10.0</path>
  5. <parent>pci_0000_00_01_0</parent>
  6. <driver>
  7. <name>ixgbevf</name>
  8. </driver>
  9. <capability type='pci'>
  10. <domain>0</domain>
  11. <bus>2</bus>
  12. <slot>16</slot>
  13. <function>0</function>
  14. <product id='0x10ed'>82599 Ethernet Controller Virtual Function</product>
  15. <vendor id='0x8086'>Intel Corporation</vendor>
  16. <capability type='phys_function'>
  17. <address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
  18. </capability>
  19. <iommuGroup number='1'>
  20. <address domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
  21. <address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
  22. <address domain='0x0000' bus='0x01' slot='0x00' function='0x1'/>
  23. <address domain='0x0000' bus='0x02' slot='0x10' function='0x0'/>
  24. <address domain='0x0000' bus='0x02' slot='0x10' function='0x2'/>
  25. <address domain='0x0000' bus='0x02' slot='0x10' function='0x4'/>
  26. <address domain='0x0000' bus='0x02' slot='0x10' function='0x6'/>
  27. <address domain='0x0000' bus='0x02' slot='0x11' function='0x0'/>
  28. <address domain='0x0000' bus='0x02' slot='0x11' function='0x2'/>
  29. <address domain='0x0000' bus='0x02' slot='0x11' function='0x4'/>
  30. <address domain='0x0000' bus='0x02' slot='0x11' function='0x6'/>
  31. <address domain='0x0000' bus='0x02' slot='0x12' function='0x0'/>
  32. <address domain='0x0000' bus='0x02' slot='0x12' function='0x2'/>
  33. <address domain='0x0000' bus='0x02' slot='0x12' function='0x4'/>
  34. <address domain='0x0000' bus='0x02' slot='0x12' function='0x6'/>
  35. <address domain='0x0000' bus='0x02' slot='0x13' function='0x0'/>
  36. <address domain='0x0000' bus='0x02' slot='0x13' function='0x2'/>
  37. <address domain='0x0000' bus='0x02' slot='0x13' function='0x4'/>
  38. <address domain='0x0000' bus='0x02' slot='0x13' function='0x6'/>
  39. </iommuGroup>
  40. <pci-express>
  41. <link validity='cap' port='0' width='0'/>
  42. <link validity='sta' width='0'/>
  43. </pci-express>
  44. </capability>
  45. </device>

上面的列表中, 第一个是PCIex16控制器, 第二第三个是PF, 后面的都是VF

  • 0000.00.01.0 PCI bridge: Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor PCI Express x16 Controller (rev 06)
  • 0000.01:00.0 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01)
  • 0000.01:00.1 Ethernet controller: Intel Corporation 82599ES 10-Gigabit SFI/SFP+ Network Connection (rev 01)
  • 0000.02:10.0 Ethernet controller: Intel Corporation 82599 Ethernet Controller Virtual Function (rev 01)
  • ...
  • 0000.02:13.6 Ethernet controller: Intel Corporation 82599 Ethernet Controller Virtual Function (rev 01)

即使关闭这个网口的SR-IOV(向sriov_numvfs中写入0), 通过virsh nodedev-dumpxml查看物理网口的信息, 依然是

  1. <iommuGroup number='1'>
  2. <address domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
  3. <address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
  4. <address domain='0x0000' bus='0x01' slot='0x00' function='0x1'/>
  5. </iommuGroup>

因此即使是不开启SR-IOV, 要将此网卡配置至虚机也是不行的. 只有将此网卡移至第二个PCIE插槽, PF和VF才会出现在各自的iommuGroup中. 在选择硬件时, 应该避免选择家用的i3, i5, 以及低端的E3, 尽量选择E5及更高规格的CPU, 在选择主板时, 应当选择有2条或更多PCIEx4以上插槽的主板

相关的资料

This occurs when the PF is installed behind components in the system that do not support PCIe Access Control Services (ACS). The IOMMU group contains both the PF and the VF because upstream transactions can be re-routed downstream by these non-ACS components before being translated
by the IOMMU. Please provide 'sudo lspci -vvv', 'lspci -n', and kernel version and we might be able to give you some advise on how to work around the problem.
It does not and that's exactly the problem. We must assume that the root port can redirect a transaction from a subordinate device back to another subordinate device without IOMMU translation when ACS support is not present. If you had a device plugged in below 00:01.0, we'd also
need to assume that non-IOMMU translated peer-to-peer between devices behind either function, 00:01.0 or 00:01.1, is possible.
Intel has indicated that processor root ports for all Xeon class processors should support ACS and have verified isolation for PCH based root ports allowing us to support quirks in place of ACS support. I'm not aware of any efforts at Intel to verify isolation capabilities of root ports on client processors. They are however aware that lack of ACS is a limiting factor for usability of VT-d, and I hope that we'll see future products with ACS support.
Chances are good that the PCH root port at 00:1c.0 is supported by an ACS quirk, but it seems that your system has a PCIe switch below the root port. If the PCIe switch downstream ports support ACS, then you may be able to move the 82599 to the empty slot at bus 07 to separate the VFs into different IOMMU groups.

Intel Xeon E3-1200 v3/4th Gen Core Processor lacks necessary features to support SR-IOV use case. Intel Xeon E5 Processors are recommended for SR-IOV use case.

Move the card to a slot hosted by a PCH root port, otherwise no, ACS is not supported on your processor root ports.

On Xeon class processors (except E3-1200 series), the processor-based PCIe root ports typically support ACS. Client processors, such as the i5/i7 Core processor do not support ACS, but we can hope future products from Intel will update this support.

插在PCIex4的82599网卡, 作为SR-IOV设备添加到虚机导致虚机崩溃

宿主机和虚机都是Centos7.9, 添加成功, 但是会出现vfio_dma_map错误导致虚机关闭

  1. vfio_dma_map(0x145ef2bf0fc0, 0x98400000, 0x7c000, 0x145efae47000) = -14 (Bad address)
  2. qemu: hardware error: vfio: DMA mapping failed, unable to continue

这个问题在升级宿主内核到5.11.x后消失

相关issue

参考

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/433038
推荐阅读
相关标签
  

闽ICP备14008679号