天天看點

ubuntu 安裝GPU黑屏 修改GRUB_qemu-kvm安裝and配置橋接和SR-IOV - 山河故人abin

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
           

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. 建立虛拟機

下載下傳系統鏡像(以為例):

wget 
           

建立一個虛拟磁盤, -f指定格式, 檔案名 ,大小為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:是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: --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.

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_intel 和 kvm,如果沒開啟,需要進BIOS設定。

已經開啟的顯示示例:

ubuntu 安裝GPU黑屏 修改GRUB_qemu-kvm安裝and配置橋接和SR-IOV - 山河故人abin

在啟動菜單的核心CMDLINE中開啟iommu,/boot/grub2/不能直接修改,需通過修改 /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/
           

更新配置後,重新開機。

為RDMA網卡設定SR-IOV之前,确認已安裝好網卡驅動。

在固件上開啟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後,你才能看到它們。

在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
               

    注意:如果指令執行失敗,可能意味着未加載驅動程式。

    注意: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/:
    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/
               

    更新配置後,重新開機。

    注意:

    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: 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: 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:
    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

    ......

為qemu添加SR-IOV虛拟化的網卡

  1. 檢視PCI裝置資訊
    lshw -c network -businfo
               

    Bus info Device Class Description

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

    ......

    [email protected]:02: ib2 network MT27800 Family [ConnectX-5 Virtual Function]

    [email protected]:02:00.2 ib3 network MT27800 Family [ConnectX-5 Virtual Function]

    [email protected]:02:00.3 ib4 network MT27800 Family [ConnectX-5 Virtual Function]

    [email protected]: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裝置編号是:

      [email protected]: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參考資料:

繼續閱讀