qemu-kvm安裝and配置橋接和SR-IOV
kvm和docker的區別:kvm是全虛擬化,需要模擬各種硬體,docker是容器,共享宿主機的CPU,記憶體,swap等。本文安裝的qemu-kvm屬於kvm虛擬化,其中:kvm負責cpu虛擬化和記憶體虛擬化,QEMU模擬IO設備(網卡、磁碟等)。
參考資料:
qemu和docker區別://www.cnblogs.com/boyzgw/p/6807986.html
qemu,kvm,qemu-kvm關係://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. 新建虛擬機
下載系統鏡像(以ubuntu14.04為例):
wget //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 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設置。
已經開啟的顯示示例:
在啟動菜單的內核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
-
運行 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
-
查看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
-
查詢設備的SRIOV是否開啟、虛擬化數量
mlxconfig -d /dev/mst/mt4119_pciconf0 q | grep -E "SRIOV_EN|NUM_OF_VFS"
NUM_OF_VFS 0
SRIOV_EN False(0)
-
開啟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
-
查看是否設置成功
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
-
找到設備,本示例中,有兩個設備處於激活動態: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)
-
查看韌體中配置的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
-
查看當前設備的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文件中。
注意:因內核版本不同,可能沒有部分選項。
-
設置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。
-
查看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 -
在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虛擬化的網卡
-
查看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” 命令已經得到了。
-
將設備從宿主機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
-
配置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命令設置。
-
連接虛擬機,驗證是否有RDMA網卡
lspci | grep Mellanox
00:06.0 Infiniband controller: Mellanox Technologies MT28800 Family [ConnectX-5 Virtual Function]
可以看到,在虛擬機中有RDMA網卡,接下來就是安裝驅動等操作了。
RDMA配置SR-IOV參考資料://community.mellanox.com/s/article/HowTo-Configure-SR-IOV-for-ConnectX-4-ConnectX-5-ConnectX-6-with-KVM-Ethernet