1. 程式人生 > >qemu-kvm安裝and配置橋接和SR-IOV

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環境安裝: ```shell sudo apt-get install qemu virt-manager ``` centos環境安裝: ```shell 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為例): ```shell wget http://mirrors.163.com/ubuntu-releases/14.04/ubuntu-14.04.6-server-amd64.iso ``` 建立一個虛擬磁碟, -f指定格式, 檔名kvm.qcow2 ,大小為20G ```shell qemu-img create -f qcow2 -o preallocation=metadata ubuntu14_04.qcow2 20G ``` 通過命令列安裝虛擬機器: ```shell 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' | 安裝虛擬機器時指定網橋(需要先配置好橋接,方法在下面): ```shell 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編號): ```shell 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使用者沒有許可權訪問當前使用者的家目錄,修改許可權為其他使用者可以訪問當前使用者目錄即可解決: ```shell 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 | 編輯虛擬機器配置檔案 | 配置橋接網路: ```shell virsh iface-bridge --interface eth0 --bridge br0 ``` eth0是設定橋接的物理網絡卡名稱,br0是橋接網絡卡的名稱。 檢視橋接網路: ```shell brctl show virsh iface-list ``` 刪除橋接網絡卡: ```shell virsh iface-unbridge br0 ``` OR 通過修改配置檔案配置橋接網路: ```shell virsh edit ubuntu14_04 ``` 修改的內容如下: ```xml ###這一行修改介面模式為"bridge"
###這一行修改源為"bridge='br0'"
``` ## 4. qemu配置SR-IOV使用RDMA網絡卡 檢視物理機是否開啟VT: ```shell cat /proc/cpuinfo | grep vmx ``` 如果輸出內容中有 vmx,僅僅說明CPU支援 VT,還需要通過如下命令檢視是否開啟: ```shell lsmod |grep kvm ``` 如果已經開啟VT,會顯示 kvm_intel 和 kvm,如果沒開啟,需要進BIOS設定。 已經開啟的顯示示例: 在啟動選單的核心CMDLINE中開啟iommu,/boot/grub2/grub.cfg不能直接修改,需通過修改 /etc/default/grub: ```shell 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配置: ```shell grub2-mkconfig -o /boot/grub2/grub.cfg ``` 更新配置後,重啟。 為RDMA網絡卡設定SR-IOV之前,確認已安裝好網絡卡驅動。 ### 4.1 在韌體上開啟SR-IOV 1. 執行 mst(以下命令均是在root賬戶執行) ```shell 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裝置 ```shell 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是否開啟、虛擬化數量 ```shell 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 ```shell mlxconfig -d /dev/mst/mt4119_pciconf0 set SRIOV_EN=1 NUM_OF_VFS=4 ``` 5. 檢視是否設定成功 ```shell 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" 配置。 ```shell ibstat ``` > CA 'mlx5_0' > > ​ ...... > > ​ Port 1: > > ​ State: Active > > ​ Physical state: LinkUp > > ​ ...... > > CA 'mlx5_1' > > ​ ...... > > ​ Port 1: > > ​ State: Active > > ​ Physical state: LinkUp > > ​ ...... ```shell ibdev2netdev ``` > mlx5_0 port 1 ==> ib0 (Up) > > mlx5_1 port 1 ==> ib1 (Up) 2. 檢視韌體中配置的VFS數量 ```shell cat /sys/class/net/ib0/device/sriov_totalvfs ``` > 4 注意:這是一個檢視操作,配置VFS數量應使用上面用到的命令: ```shell mlxconfig -d /dev/mst/mt4119_pciconf0 set SRIOV_EN=1 NUM_OF_VFS=4 ``` 3. 檢視當前裝置的VFS數量(三種方式結果一樣) ```shell 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的數量(三種方式,任選其一) ```shell echo 4 > /sys/class/infiniband/mlx5_0/device/mlx5_num_vfs cat /sys/class/infiniband/mlx5_0/device/mlx5_num_vfs ``` ```shell echo 4 > /sys/class/net/ib0/device/sriov_numvfs cat /sys/class/net/ib0/device/sriov_numvfs ``` ```shell 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: ```shell 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" ```shell 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裝置 ```shell 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網絡卡。 ```shell 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 ```shell ip link show ``` > ...... > > 4: ib0: 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 ```shell 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 也可以直接通過如下命令檢視: ```shell 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段落里加入(該方法未成功) ```shell virsh edit ubuntu14_04 ``` 內容如下: ```xml ``` 如不需要設定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段落里加入(本文測試中,該方法有效) ```xml 方法選擇: 方法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網絡卡,接下來就是安裝驅動等操作了。 > RDMA配置SR-IOV參考資料:https://community.mellanox.com/s/article/HowTo-Configure-SR-IOV-for-ConnectX-4-ConnectX-5-ConnectX-6-with-KVM-E