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-managercentos环境安装:
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创建一个虚拟磁盘, -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 userdrwxr-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 br0eth0是设置桥接的物理网卡名称,br0是桥接网卡的名称。
查看桥接网络:
brctl show virsh iface-list删除桥接网卡:
virsh iface-unbridge br0OR 通过修改配置文件配置桥接网络:
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/grubGRUB_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 startStarting 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 statusMST 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" 配置。
ibstatCA 'mlx5_0'
......
Port 1:
State: Active
Physical state: LinkUp
......
CA 'mlx5_1'
......
Port 1:
State: Active
Physical state: LinkUp
......
ibdev2netdevmlx5_0 port 1 ==> ib0 (Up)
mlx5_1 port 1 ==> ib1 (Up)
查看固件中配置的VFS数量
cat /sys/class/net/ib0/device/sriov_totalvfs4
注意:这是一个查看操作,配置VFS数量应使用上面用到的命令:
mlxconfig -d /dev/mst/mt4119_pciconf0 set SRIOV_EN=1 NUM_OF_VFS=4