qemu-kvm安裝and配置橋接和SR-IOV

kvm和docker的區別:kvm是全虛擬化,須要模擬各類硬件,docker是容器,共享宿主機的CPU,內存,swap等。本文安裝的qemu-kvm屬於kvm虛擬化,其中:kvm負責cpu虛擬化和內存虛擬化,QEMU模擬IO設備(網卡、磁盤等)。html

參考資料:node

qemu和docker區別:http://www.javashuo.com/article/p-eycevsdj-gk.htmlpython

qemu,kvm,qemu-kvm關係:http://www.javashuo.com/article/p-encbcxio-nu.htmldocker

1. 安裝

ubuntu環境安裝:shell

sudo apt-get install qemu virt-manager

centos環境安裝:ubuntu

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

其中,virt-manager是虛擬機管理工具,至關於windows環境下的vmware軟件。vim

2. 新建虛擬機

下載系統鏡像(以ubuntu14.04爲例):windows

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

建立一個虛擬磁盤, -f指定格式, 文件名kvm.qcow2 ,大小爲20Gcentos

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 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 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-IOOV並設置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
  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

    ......

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>

方法選擇

方法1:功能多,能夠配置mac和vlan;

方法2:mac和vlan須要本身在宿主上敲ip命令設置。

  1. 鏈接虛擬機,驗證是否有RDMA網卡

    lspci | grep Mellanox

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

​ 能夠看到,在虛擬機中有RDMA網卡,接下來就是安裝驅動等操做了。

RDMA配置SR-IOV參考資料:https://community.mellanox.com/s/article/HowTo-Configure-SR-IOV-for-ConnectX-4-ConnectX-5-ConnectX-6-with-KVM-Ethernet

相關文章
相關標籤/搜索