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 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-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可以是以下几种形式:
如果出现错误:
出现这种错误是因为qemu用户没有权限访问当前用户的家目录,修改权限为其他用户可以访问当前用户目录即可解决:
cd /home
chmod 755 user
3. 使用虚拟机
配置桥接网络:
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配置:
grub2-mkconfig -o /boot/grub2/grub.cfg
更新配置后,重启。
为RDMA网卡设置SR-IOV之前,确认已安装好网卡驱动。
4.1 在固件上开启SR-IOV
运行 mst(以下命令均是在root账户执行)
mst start
查看PCI插槽中的HCA设备
mst status
查询设备的SRIOV是否开启、虚拟化数量
mlxconfig -d /dev/mst/mt4119_pciconf0 q | grep -E "SRIOV_EN|NUM_OF_VFS"
开启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"
注意:此时,无法通过lspci看到VFS,只有在MLNX OFED驱动程序上启用SR-IOV后,你才能看到它们。
4.2 在MLNX_OFED驱动上开启SR-IOV
找到设备,本示例中,有两个设备处于激活动态:mlx5_0对应接口 "ib0",mlx5_1对应接口 "ib1",我们只配对 "mlx5_0" 配置。
ibstat
ibdev2netdev
查看固件中配置的VFS数量
cat /sys/class/net/ib0/device/sriov_totalvfs
注意:这是一个查看操作,配置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
注意:如果命令执行失败,可能意味着未加载驱动程序。
注意: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
如出现错误信息:
修改 /etc/default/grub并重新生成/boot/grub2/grub.cfg:
vim /etc/default/grub
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
注意:带 Virtual Function 的四个PCI设备就是通过SR-IOV虚拟化出来的RDMA网卡。
ibdev2netdev -v
此时,你可以看到PF上有4个VF:
在ip池查看VFS
ip link show
4.3 为qemu添加SR-IOV虚拟化的网卡
查看PCI设备信息
lshw -c network -businfo
这一步看到的信息,其实在刚才通过 "ibdev2netdev -v" 命令已经得到了。
将设备从宿主机deattach
virsh nodedev-detach pci_0000_02_00_1
命令中,pci_0000_02_00_1 是根据上面由SR-IOV虚拟化出来的PCI设备编号拼接起来的:
也可以直接通过如下命令查看:
virsh nodedev-list --tree | grep pci
如果该虚拟设备不再被使用,需要在 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设备编号是:
注意对应关系,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
可以看到,在虚拟机中有RDMA网卡,接下来就是安装驱动等操作了。