zoukankan      html  css  js  c++  java
  • qemu-kvm安装and配置桥接和SR-IOV

    kvm和docker的区别:kvm是全虚拟化,需要模拟各种硬件,docker是容器,共享宿主机的CPU,内存,swap等。本文安装的qemu-kvm属于kvm虚拟化,其中:kvm负责cpu虚拟化和内存虚拟化,QEMU模拟IO设备(网卡、磁盘等)。

    参考资料:

    qemu和docker区别:https://www.cnblogs.com/boyzgw/p/6807986.html

    qemu,kvm,qemu-kvm关系:https://www.cnblogs.com/echo1937/p/7138294.html

    1. 安装

    ubuntu环境安装:

    sudo apt-get install qemu virt-manager  qemu-kvm
    

    centos环境安装:

    yum install qemu-kvm qemu-img virt-manager libvirt libvirt-python virt-manager libvirt-client virt-install virt-viewer -y
    

    其中,virt-manager是虚拟机管理工具,相当于windows环境下的vmware软件。

    2. 新建虚拟机

    下载系统镜像(以ubuntu14.04为例):

    wget http://mirrors.163.com/ubuntu-releases/14.04/ubuntu-14.04.6-server-amd64.iso
    

    创建一个虚拟磁盘, -f指定格式, 文件名kvm.qcow2 ,大小为20G

    qemu-img create -f qcow2 -o preallocation=metadata ubuntu14_04.qcow2 20G
    

    通过命令行安装虚拟机:

    virt-install --virt-type=kvm --name=ubuntu14_04 --vcpus=2 --memory=2048 --location=ubuntu-14.04.6-server-amd64.iso --disk path=ubuntu14_04.qcow2,size=20,format=qcow2 --network network=default --graphics none --extra-args='console=ttyS0' --force
    
    参数 含义
    --virt-type 虚拟化类型
    --name 虚拟机的名字
    --vcpus CPU个数
    --memory 内存大小,单位MB
    --location ISO系统镜像位置
    --disk path 磁盘位置, 大小, 格式等
    --network 网络
    --graphics guest显示设置, 设置为none时,表示从命令行安装
    --extra-args 如果从命令行安装,需要指定该参数为 'console=ttyS0'

    安装虚拟机时指定网桥(需要先配置好桥接,方法在下面):

    virt-install --virt-type=kvm --name=ubuntu14_04 --vcpus=2 --memory=2048 --location=ubuntu-14.04.6-server-amd64.iso --disk path=ubuntu14_04.qcow2,size=20,format=qcow2 --network bridge=br0 --graphics none --extra-args='console=ttyS0' --force
    

    安装虚拟机时指定PCI设备(需要先配置好SR-IOV,方法在下面,02:00.1是SR-IOV虚拟出来的网卡的PCI编号):

    virt-install --virt-type=kvm --name=ubuntu14_04 --vcpus=2 --memory=2048 --location=ubuntu-14.04.6-server-amd64.iso --disk path=ubuntu14_04.qcow2,size=20,format=qcow2 --network network=default --hostdev=02:00.1 --graphics none --extra-args='console=ttyS0' --force
    

    其中,hostdev可以是以下几种形式:

    --hostdev pci_0000_02_00_1

    A node device name via libvirt, as shown by virsh nodedev-list

    --hostdev 001.003

    USB by bus, device (via lsusb).

    --hostdev 0x1234:0x5678

    USB by vendor, product (via lsusb).

    --hostdev 02.00.1

    PCI device (via lspci).

    如果出现错误

    WARNING /home/user/ubuntu14_04.qcow2 may not be accessible by the hypervisor. You will need to grant the 'qemu' user search permissions for the following directories: ['/home/user']

    出现这种错误是因为qemu用户没有权限访问当前用户的家目录,修改权限为其他用户可以访问当前用户目录即可解决:

    cd /home
    chmod 755 user
    

    drwxr-xr-x. 12 user user 4096 Oct 19 11:43 user

    3. 使用虚拟机

    命令 含义
    virsh dumpxml name 查看虚拟机配置文件
    virsh start name 启动kvm虚拟机
    virsh console name 连接到虚拟机终端
    virsh shutdown name 正常关机
    virsh destroy name 非正常关机,相当于物理机直接拔掉电源
    virsh undefine name 彻底删除,无法找回,如果想找回来,需要备份/etc/libvirt/qemu的xml文件
    virsh define file-name.xml 根据配置文件定义虚拟机
    virsh suspend name 挂起,终止
    virsh resume name 恢复挂起状态
    virsh edit name 编辑虚拟机配置文件(编辑之后需要重启虚拟机才会生效)
    virsh list 查看正在运行的虚拟机(在root账号或加sudo运行才能看到)
    virsh list --all 查看所有虚拟机(在root账号或加sudo运行才能看到)

    配置桥接网络:

    virsh iface-bridge --interface eth0 --bridge br0
    

    eth0是设置桥接的物理网卡名称,br0是桥接网卡的名称。

    查看桥接网络:

    brctl show 
    virsh iface-list 
    

    删除桥接网卡:

    virsh iface-unbridge br0
    

    OR 通过修改配置文件配置桥接网络:

    virsh edit ubuntu14_04
    

    修改的内容如下:

        <interface type='network'>              ###这一行修改接口模式为"bridge"
          <mac address='52:54:00:c6:9f:8a'/>
          <source network='default'/>      			###这一行修改源为"bridge='br0'"
          <model type='virtio'/>
          <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
        </interface>
    

    4. qemu配置SR-IOV使用RDMA网卡

    查看物理机是否开启VT:

    cat /proc/cpuinfo | grep vmx
    

    如果输出内容中有 vmx,仅仅说明CPU支持 VT,还需要通过如下命令查看是否开启:

    lsmod |grep kvm 
    

    如果已经开启VT,会显示 kvm_intelkvm,如果没开启,需要进BIOS设置。

    已经开启的显示示例:

    在启动菜单的内核CMDLINE中开启iommu,/boot/grub2/grub.cfg不能直接修改,需通过修改 /etc/default/grub:

    vim /etc/default/grub
    

    GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet intel_iommu=on iommu=pt"

    然后更新grub配置:

    grub2-mkconfig -o /boot/grub2/grub.cfg
    

    更新配置后,重启。

    为RDMA网卡设置SR-IOV之前,确认已安装好网卡驱动。

    4.1 在固件上开启SR-IOV

    1. 运行 mst(以下命令均是在root账户执行)

      mst start
      

      Starting MST (Mellanox Software Tools) driver set

      Loading MST PCI module - Success

      Loading MST PCI configuration module - Success

      Create devices

      Unloading MST PCI module (unused) - Success

    2. 查看PCI插槽中的HCA设备

      mst status
      

      MST modules:

      ------------

      MST PCI module is not loaded

      MST PCI configuration module loaded

      MST devices:

      ------------

      /dev/mst/mt4119_pciconf0 - PCI configuration cycles access.

      ​ domain:bus :dev.fn=0000:02:00.0 addr.reg=88 data.reg=92 cr_bar.gw_offset=-1

      ​ Chip revision is: 00

      /dev/mst/mt4119_pciconf1 - PCI configuration cycles access.

      ​ domain:bus :dev.fn=0000:81:00.0 addr.reg=88 data.reg=92 cr_bar.gw_offset=-1

      ​ Chip revision is: 00

    3. 查询设备的SRIOV是否开启、虚拟化数量

      mlxconfig -d /dev/mst/mt4119_pciconf0 q | grep -E "SRIOV_EN|NUM_OF_VFS"
      

      NUM_OF_VFS 0

      SRIOV_EN False(0)

    4. 开启SR-IOV并设置VFS的数量

      • SRIOV_EN=1; 开启SRIOV
      • NUM_OF_VFS=4 ; 将VFS数量设置为4
      mlxconfig -d /dev/mst/mt4119_pciconf0 set SRIOV_EN=1 NUM_OF_VFS=4
      
    5. 查看是否设置成功

      mlxconfig -d /dev/mst/mt4119_pciconf0 q | grep -E "SRIOV_EN|NUM_OF_VFS"
      

      NUM_OF_VFS 4

      SRIOV_EN True(1)

      注意:此时,无法通过lspci看到VFS,只有在MLNX OFED驱动程序上启用SR-IOV后,你才能看到它们。

    4.2 在MLNX_OFED驱动上开启SR-IOV

    1. 找到设备,本示例中,有两个设备处于激活动态:mlx5_0对应接口 "ib0",mlx5_1对应接口 "ib1",我们只配对 "mlx5_0" 配置。

      ibstat
      

      CA 'mlx5_0'

      ​ ......

      ​ Port 1:

      State: Active

      Physical state: LinkUp

      ​ ......

      CA 'mlx5_1'

      ​ ......

      ​ Port 1:

      ​ State: Active

      ​ Physical state: LinkUp

      ​ ......

      ibdev2netdev
      

      mlx5_0 port 1 ==> ib0 (Up)

      mlx5_1 port 1 ==> ib1 (Up)

    2. 查看固件中配置的VFS数量

      cat /sys/class/net/ib0/device/sriov_totalvfs
      

      4

      注意:这是一个查看操作,配置VFS数量应使用上面用到的命令:

      mlxconfig -d /dev/mst/mt4119_pciconf0 set SRIOV_EN=1 NUM_OF_VFS=4
      
    3. 查看当前设备的VFS数量(三种方式结果一样)

      cat /sys/class/infiniband/mlx5_0/device/mlx5_num_vfs
      cat /sys/class/net/ib0/device/sriov_numvfs
      cat /sys/class/net/ib0/device/mlx5_num_vfs
      

      0

      注意:如果命令执行失败,可能意味着未加载驱动程序。

      注意:mlx5_num_vfs和sriov_numvfs的区别在于,即使操作系统未加载虚拟化模块(未向grub文件添加intel_iommu=on),mlx5_num_vfs也存在;sriov_numvfs 仅在将intel_iommu=on添加到grub文件时才适用。因此,如果没有sriov_numvfs文件,请检查是否已将Intel_iommu=on添加到grub文件中。

      注意:因内核版本不同,可能没有部分选项。

    4. 设置VFS的数量(三种方式,任选其一)

      echo 4 > /sys/class/infiniband/mlx5_0/device/mlx5_num_vfs
      cat /sys/class/infiniband/mlx5_0/device/mlx5_num_vfs
      
      echo 4 > /sys/class/net/ib0/device/sriov_numvfs
      cat /sys/class/net/ib0/device/sriov_numvfs
      
      echo 4 > /sys/class/net/ib0/device/mlx5_num_vfs
      cat /sys/class/net/ib0/device/mlx5_num_vfs
      

      4

      如出现错误信息

      echo: write error: Cannot allocate memory

      修改 /etc/default/grub并重新生成/boot/grub2/grub.cfg:

      vim /etc/default/grub
      

      GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet intel_iommu=on iommu=pt pci=realloc"

      grub2-mkconfig -o /boot/grub2/grub.cfg
      

      更新配置后,重启。

      注意

      1.更改VFS的数量是临时的,服务器重新启动后,设置的值会丢失。

      2.写入sysfs文件时,适用以下规则:

      • 如果未分配VFS,则VFS的数量可以更改为任何有效值(0-固件设置步骤中设置的最大VFS);
      • 如果有分配给虚拟机的VFS,则无法更改VFS的数量;
      • 如果在未分配VFS的情况下,管理员在PF上卸载驱动程序,则驱动程序将卸载并禁用SRI-OV;
      • 如果在卸载PF驱动程序时分配了VFS,则不会禁用SR-IOV。这意味着VF在VM上可见,但它们将无法运行。这适用于使用pci_stub而非vfio内核的操作系统。
        • VF驱动程序将发现这种情况并关闭其资源;
        • 重新加载PF上的驱动程序后,VF可以运行。 VF的管理员将需要重新启动驱动程序才能继续使用VF。
    5. 查看PCI设备

      lspci -D | grep Mellanox
      

      0000:02:00.0 Infiniband controller: Mellanox Technologies MT27800 Family [ConnectX-5]

      0000:02:00.1 Infiniband controller: Mellanox Technologies MT27800 Family [ConnectX-5 Virtual Function]

      0000:02:00.2 Infiniband controller: Mellanox Technologies MT27800 Family [ConnectX-5 Virtual Function]

      0000:02:00.3 Infiniband controller: Mellanox Technologies MT27800 Family [ConnectX-5 Virtual Function]

      0000:02:00.4 Infiniband controller: Mellanox Technologies MT27800 Family [ConnectX-5 Virtual Function]

      0000:81:00.0 Infiniband controller: Mellanox Technologies MT27800 Family [ConnectX-5]

      注意:带 Virtual Function 的四个PCI设备就是通过SR-IOV虚拟化出来的RDMA网卡。

      ibdev2netdev -v
      

      0000:02:00.0 mlx5_0 (MT4119 - MCX555A-ECAT) CX555A - ConnectX-5 QSFP28 fw 16.26.4012 port 1 (ACTIVE) ==> ib0 (Up)

      0000:81:00.0 mlx5_1 (MT4119 - MCX555A-ECAT) CX555A - ConnectX-5 QSFP28 fw 16.27.2008 port 1 (ACTIVE) ==> ib1 (Up)

      0000:02:00.1 mlx5_2 (MT4120 - NA) fw 16.26.4012 port 1 (DOWN ) ==> ib2 (Down)

      0000:02:00.2 mlx5_3 (MT4120 - NA) fw 16.26.4012 port 1 (DOWN ) ==> ib3 (Down)

      0000:02:00.3 mlx5_4 (MT4120 - NA) fw 16.26.4012 port 1 (DOWN ) ==> ib4 (Down)

      0000:02:00.4 mlx5_5 (MT4120 - NA) fw 16.26.4012 port 1 (DOWN ) ==> ib5 (Down)

      此时,你可以看到PF上有4个VF:

      PCI 编号 VF 编号
      0000:02:00.1 0
      0000:02:00.2 1
      0000:02:00.3 2
      0000:02:00.4 3

      注意:这个时候,我们看到通过SR-IOV虚拟出来的4个网卡的状态还是DOWN:

      0000:02:00.1 mlx5_2 (MT4120 - NA) fw 16.26.4012 port 1 (DOWN ) ==> ib2 (Down)

      0000:02:00.2 mlx5_3 (MT4120 - NA) fw 16.26.4012 port 1 (DOWN ) ==> ib3 (Down)

      0000:02:00.3 mlx5_4 (MT4120 - NA) fw 16.26.4012 port 1 (DOWN ) ==> ib4 (Down)

      0000:02:00.4 mlx5_5 (MT4120 - NA) fw 16.26.4012 port 1 (DOWN ) ==> ib5 (Down)

      可以通过以下命令来查看:

      ibstatus
      

      ......

      Infiniband device 'mlx5_2' port 1 status:

      ​ default gid: fe80:0000:0000:0000:0000:0000:0000:0000

      ​ base lid: 0xffff

      ​ sm lid: 0x2

      ​ state: 1: DOWN

      ​ phys state: 5: LinkUp

      ​ rate: 100 Gb/sec (4X EDR)

      ​ link_layer: InfiniBand

      ......

    6. 在ip池查看VFS

      ip link show
      

      ......

      4: ib0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 2044 qdisc mq state UP mode DEFAULT group default qlen 256

      link/infiniband 20:00:0a:12:fe:80:00:00:00:00:00:00:ec:0d:9a:03:00:c0:41:d4 brd 00:ff:ff:ff:ff:12:40:1b:ff:ff:00:00:00:00:00:00:ff:ff:ff:ff

      vf 0 MAC 00:00:00:00:00:00, spoof checking off, link-state disable, trust off, query_rss off

      vf 1 MAC 00:00:00:00:00:00, spoof checking off, link-state disable, trust off, query_rss off

      vf 2 MAC 00:00:00:00:00:00, spoof checking off, link-state disable, trust off, query_rss off

      vf 3 MAC 00:00:00:00:00:00, spoof checking off, link-state disable, trust off, query_rss off

      ......

    7. 为每个VF设置GUID和PORT

      要添加GUID和PORT,需要先取消绑定该网卡

      echo 0000:02:00.1 > /sys/bus/pci/drivers/mlx5_core/unbind
      

      设置GUID和PORT:

      echo 11:22:33:44:77:66:77:60 > /sys/class/infiniband/mlx5_0/device/sriov/0/node
      echo 11:22:33:44:77:66:77:61 > /sys/class/infiniband/mlx5_0/device/sriov/0/port
      
      cat /sys/class/infiniband/mlx5_0/device/sriov/0/node
      cat /sys/class/infiniband/mlx5_0/device/sriov/0/port
      

      /sys/class/infiniband/mlx5_0/device/sriov/0/node 中的 0 是VF的编号。

      重新绑定该网卡:

      echo 0000:02:00.1 > /sys/bus/pci/drivers/mlx5_core/bind
      
    8. 为每个VF设置管理状态为 "Follow"(设置完成后,状态为DOWN的网卡将会开始初始化,并改为ACTIVE

      cat /sys/class/infiniband/mlx5_0/device/sriov/0/policy
      

      Down

      echo Follow > /sys/class/infiniband/mlx5_0/device/sriov/0/policy
      cat /sys/class/infiniband/mlx5_0/device/sriov/0/policy
      

      Follow

      验证网卡的端口状态:

      Infiniband device 'mlx5_2' port 1 status:

      ​ default gid: fe80:0000:0000:0000:1122:3344:7766:7761

      ​ base lid: 0x1d

      ​ sm lid: 0x2

      ​ state: 4: ACTIVE

      ​ phys state: 5: LinkUp

      ​ rate: 100 Gb/sec (4X EDR)

      ​ link_layer: InfiniBand

    4.3 为qemu添加SR-IOV虚拟化的网卡

    1. 查看PCI设备信息

      lshw -c network -businfo
      

      Bus info Device Class Description

      ========================================================

      ......

      pci@0000:02:00.1 ib2 network MT27800 Family [ConnectX-5 Virtual Function]

      pci@0000:02:00.2 ib3 network MT27800 Family [ConnectX-5 Virtual Function]

      pci@0000:02:00.3 ib4 network MT27800 Family [ConnectX-5 Virtual Function]

      pci@0000:02:00.4 ib5 network MT27800 Family [ConnectX-5 Virtual Function]

      ......

      这一步看到的信息,其实在刚才通过 "ibdev2netdev -v" 命令已经得到了。

    2. 将设备从宿主机deattach

      virsh nodedev-detach pci_0000_02_00_1
      

      命令中,pci_0000_02_00_1 是根据上面由SR-IOV虚拟化出来的PCI设备编号拼接起来的:

      0000:02:00.1 --> pci_0000_02_00_1

      也可以直接通过如下命令查看:

      virsh nodedev-list --tree | grep pci
      

      ......

      | +- pci_0000_02_00_1

      | +- pci_0000_02_00_2

      ......

      如果该虚拟设备不再被使用,需要在 virt-manager 中首先将该设备移除,然后在主机上重新挂载该设备:

      virsh nodedev-reattach pci_0000_02_00_1
      
    3. 配置VF直通

      • 方法1(interface):在devices段落里加入(该方法未成功

        virsh edit ubuntu14_04
        

        内容如下:

        <interface type='hostdev' managed='yes'>
          <mac address='52:54:00:ad:ef:8d'/>
          <source>
            <address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x1'/>
          </source>
          <vlan>
            <tag id='4010'/>
          </vlan>
        </interface>
        

        如不需要设置mac和vlan,可以去掉相应标签。

        其中,address中的参数是根据 "lshw -c network -businfo" 获得的信息配置的,例如,我要配置的PCI设备编号是:

        pci@0000:02:00.1 ib2

        注意对应关系,domain: 0x0000, bus: 0x02, slot: 0x00, function: 0x1.

      • 方法2(hostdev):在devices段落里加入(本文测试中,该方法有效)

        <hostdev mode='subsystem' type='pci' managed='yes'>
          <source>
            <address domain='0x0000' bus='0x02' slot='0x00' function='0x1'/>
          </source>
         </hostdev>
        
      • 方法选择

        • 方法1:功能多,可以配置mac和vlan;
        • 方法2:mac和vlan需要自己在宿主上敲ip命令设置。
    4. 连接虚拟机,验证是否有RDMA网卡

       lspci | grep Mellanox
      

      00:06.0 Infiniband controller: Mellanox Technologies MT28800 Family [ConnectX-5 Virtual Function]

      可以看到,在虚拟机中有RDMA网卡,接下来就是安装驱动等操作了。

      安装驱动可参考:https://www.cnblogs.com/sctb/p/13179542.html

      安装驱动后,通过以下命令查看网卡状态:

      ibstatus
      

      Infiniband device 'mlx5_0' port 1 status:

      ​ default gid: fe80:0000:0000:0000:1122:3344:7766:7761

      ​ base lid: 0x1d

      ​ sm lid: 0x2

      ​ state: 4: ACTIVE

      ​ phys state: 5: LinkUp

      ​ rate: 100 Gb/sec (4X EDR)

      ​ link_layer: InfiniBand

    5. 每次重启之后需要进行的操作:

      echo 4 > /sys/class/infiniband/mlx5_0/device/mlx5_num_vfs
      ibdev2netdev -v
      
      echo 0000:02:00.1 > /sys/bus/pci/drivers/mlx5_core/unbind
      
      echo 11:22:33:44:77:66:77:60 > /sys/class/infiniband/mlx5_0/device/sriov/0/node
      echo 11:22:33:44:77:66:77:61 > /sys/class/infiniband/mlx5_0/device/sriov/0/port
      
      cat /sys/class/infiniband/mlx5_0/device/sriov/0/node
      cat /sys/class/infiniband/mlx5_0/device/sriov/0/port
      
      echo 0000:02:00.1 > /sys/bus/pci/drivers/mlx5_core/bind
      
      cat /sys/class/infiniband/mlx5_0/device/sriov/0/policy
      
      echo Follow > /sys/class/infiniband/mlx5_0/device/sriov/0/policy
      cat /sys/class/infiniband/mlx5_0/device/sriov/0/policy
      

      注意:为多个虚拟虚拟网卡配置的node和port不能一样,不然会一直处于 INIT 状态,不能变成 ACTIVE 状态!

    RDMA配置SR-IOV参考资料:https://community.mellanox.com/s/article/howto-configure-sr-iov-for-connect-ib-connectx-4-with-kvm--infiniband-x

    另一个资料,缺少activate步骤:https://community.mellanox.com/s/article/HowTo-Configure-SR-IOV-for-ConnectX-4-ConnectX-5-ConnectX-6-with-KVM-Ethernet

  • 相关阅读:
    176. Second Highest Salary
    175. Combine Two Tables
    172. Factorial Trailing Zeroes
    171. Excel Sheet Column Number
    169. Majority Element
    168. Excel Sheet Column Title
    167. Two Sum II
    160. Intersection of Two Linked Lists
    个人博客记录
    <meta>标签
  • 原文地址:https://www.cnblogs.com/sctb/p/13848201.html
Copyright © 2011-2022 走看看