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环境安装:

  1. sudo apt-get install qemu virt-manager

centos环境安装:

  1. 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为例):

  1. wget http://mirrors.163.com/ubuntu-releases/14.04/ubuntu-14.04.6-server-amd64.iso

创建一个虚拟磁盘, -f指定格式, 文件名kvm.qcow2 ,大小为20G

  1. qemu-img create -f qcow2 -o preallocation=metadata ubuntu14_04.qcow2 20G

通过命令行安装虚拟机:

  1. 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'

安装虚拟机时指定网桥(需要先配置好桥接,方法在下面):

  1. 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编号):

  1. 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用户没有权限访问当前用户的家目录,修改权限为其他用户可以访问当前用户目录即可解决:

  1. cd /home
  2. 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 编辑虚拟机配置文件

配置桥接网络:

  1. virsh iface-bridge --interface eth0 --bridge br0

eth0是设置桥接的物理网卡名称,br0是桥接网卡的名称。

查看桥接网络:

  1. brctl show
  2. virsh iface-list

删除桥接网卡:

  1. virsh iface-unbridge br0

OR 通过修改配置文件配置桥接网络:

  1. virsh edit ubuntu14_04

修改的内容如下:

  1. <interface type='network'> ###这一行修改接口模式为"bridge"
  2. <mac address='52:54:00:c6:9f:8a'/>
  3. <source network='default'/> ###这一行修改源为"bridge='br0'"
  4. <model type='virtio'/>
  5. <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
  6. </interface>

4. qemu配置SR-IOV使用RDMA网卡

查看物理机是否开启VT:

  1. cat /proc/cpuinfo | grep vmx

如果输出内容中有 vmx,仅仅说明CPU支持 VT,还需要通过如下命令查看是否开启:

  1. lsmod |grep kvm

如果已经开启VT,会显示 kvm_intel 和 kvm,如果没开启,需要进BIOS设置。

已经开启的显示示例:

在启动菜单的内核CMDLINE中开启iommu,/boot/grub2/grub.cfg不能直接修改,需通过修改 /etc/default/grub:

  1. 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配置:

  1. grub2-mkconfig -o /boot/grub2/grub.cfg

更新配置后,重启。

为RDMA网卡设置SR-IOV之前,确认已安装好网卡驱动。

4.1 在固件上开启SR-IOV

  1. 运行 mst(以下命令均是在root账户执行)

    1. 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设备

    1. 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是否开启、虚拟化数量

    1. 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
    1. mlxconfig -d /dev/mst/mt4119_pciconf0 set SRIOV_EN=1 NUM_OF_VFS=4
  5. 查看是否设置成功

    1. 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" 配置。

    1. ibstat

    CA 'mlx5_0'

    ​ ......

    ​ Port 1:

    ​ State: Active

    ​ Physical state: LinkUp

    ​ ......

    CA 'mlx5_1'

    ​ ......

    ​ Port 1:

    ​ State: Active

    ​ Physical state: LinkUp

    ​ ......

    1. ibdev2netdev

    mlx5_0 port 1 ==> ib0 (Up)

    mlx5_1 port 1 ==> ib1 (Up)

  2. 查看固件中配置的VFS数量

    1. cat /sys/class/net/ib0/device/sriov_totalvfs

    4

    注意:这是一个查看操作,配置VFS数量应使用上面用到的命令:

    1. mlxconfig -d /dev/mst/mt4119_pciconf0 set SRIOV_EN=1 NUM_OF_VFS=4
  3. 查看当前设备的VFS数量(三种方式结果一样)

    1. cat /sys/class/infiniband/mlx5_0/device/mlx5_num_vfs
    2. cat /sys/class/net/ib0/device/sriov_numvfs
    3. 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的数量(三种方式,任选其一)

    1. echo 4 > /sys/class/infiniband/mlx5_0/device/mlx5_num_vfs
    2. cat /sys/class/infiniband/mlx5_0/device/mlx5_num_vfs
    1. echo 4 > /sys/class/net/ib0/device/sriov_numvfs
    2. cat /sys/class/net/ib0/device/sriov_numvfs
    1. echo 4 > /sys/class/net/ib0/device/mlx5_num_vfs
    2. cat /sys/class/net/ib0/device/mlx5_num_vfs

    4

    如出现错误信息:

    echo: write error: Cannot allocate memory

    修改 /etc/default/grub并重新生成/boot/grub2/grub.cfg:

    1. 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"

    1. 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设备

    1. 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网卡。

    1. 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

    1. 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虚拟化的网卡

  1. 查看PCI设备信息

    1. 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

    1. 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

    也可以直接通过如下命令查看:

    1. virsh nodedev-list --tree | grep pci

    ......

    | +- pci_0000_02_00_1

    | +- pci_0000_02_00_2

    ......

    如果该虚拟设备不再被使用,需要在 virt-manager 中首先将该设备移除,然后在主机上重新挂载该设备:

    1. virsh nodedev-reattach pci_0000_02_00_1
  3. 配置VF直通

    • 方法1(interface):在devices段落里加入(该方法未成功)

      1. virsh edit ubuntu14_04

      内容如下:

      1. <interface type='hostdev' managed='yes'>
      2. <mac address='52:54:00:ad:ef:8d'/>
      3. <source>
      4. <address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x1'/>
      5. </source>
      6. <vlan>
      7. <tag id='4010'/>
      8. </vlan>
      9. </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段落里加入(本文测试中,该方法有效)

      1. <hostdev mode='subsystem' type='pci' managed='yes'>
      2. <source>
      3. <address domain='0x0000' bus='0x02' slot='0x00' function='0x1'/>
      4. </source>

```

方法选择:

方法1:功能多,可以配置mac和vlan;

方法2:mac和vlan需要自己在宿主上敲ip命令设置。

  1. 连接虚拟机,验证是否有RDMA网卡

    1. 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-Ethernet

qemu-kvm安装and配置桥接和SR-IOV的更多相关文章

  1. 烂泥:虚拟化KVM安装与配置

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 最近打算把公司的服务器全部做成虚拟化,一是跟有效的利用了服务器,二也是对自己是一个学习的机会. KVM的安装与配置步骤如下: 1. 查看是否支持虚拟化 ...

  2. KVM安装和配置

    [未验证部分] kvm安装前检查 # 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查看物理CPU个数 ca ...

  3. kvm安装及配置

     yum install kvm libvirt python-virtinst qemu-kvm virt-viewer bridge-utils virt-install 修改网卡信息 /etc/ ...

  4. virtualbox 最小化安装centos7 配置双网卡(nat和桥接)记录----已经过期

    该文章已经过期   请参考另一篇文章:virtualbox 安装centos7 配置桥接网卡,实现主机和虚拟机互通,虚拟机可以访问外网,解决无法上网问题   先说明一下为什么要配置双网卡? 配置nat ...

  5. centos7 kvm安装使用

    kvm简介 KVM 全称是 Kernel-Based Virtual Machine.也就是说 KVM 是基于 Linux 内核实现的. KVM有一个内核模块叫 kvm.ko,只用于管理虚拟 CPU ...

  6. Qemu/kvm虚拟化源码解析学习视频资料

    地址链接:tao宝搜索:Linux云计算KVM Qemu虚拟化视频源码讲解+实践​https://item.taobao.com/item.htm?ft=t&id=646300730262 L ...

  7. CentOS 7.5下KVM的安装与配置

    由于没有物理机可用,在自己的VMware Workstation中CentOS 7.5下搭建完成. 首先查看VMware Workstation是否支持虚拟化,把红框内打钩即可. 虚拟化开启并安装Ce ...

  8. KVM安装配置笔记

    系统环境centos6.6 一.KVM安装前系统相关操作: (1)修改内核模式为兼容内核启动 # grep -v "#" /etc/grub.confdevice (hd0) HD ...

  9. Linux KVM 安装配置

    --------------------------一.前言二.环境三.安装与配置四.创建kvm虚拟机 一.前言 KVM,即Kernel-based Virtual Machine的简称,是一个开源的 ...

随机推荐

  1. [LeetCode]1071. 字符串的最大公因子(gcd)

    题目 对于字符串 S 和 T,只有在 S = T + ... + T(T 与自身连接 1 次或多次)时,我们才认定 "T 能除尽 S". 返回最长字符串 X,要求满足 X 能除尽 ...

  2. [算法]求满足要求的进制(辗转相除(欧几里得算法),求最大公约数gcd)

    题目 3在十进制下满足若各位和能被3整除,则该数能被3整除. 5在十六进制下也满足此规律. 给定数字k,求多少进制(1e18进制范围内)下能满足此规律,找出一个即可,无则输出-1. 题解 写写画画能找 ...

  3. 小白的springboot之路(十七)、阿里云OSS 的使用

    0-前言 项目中,文件服务必不可少,常用的有各云服务商的OSS服务(如阿里云OSS,腾讯云OSS,七牛云).自建(fastDFS.minio): 推荐:如果用云服务的话,阿里云OSS很方便,如果自建的 ...

  4. Redis哨兵模式(sentinel)部署

    1 主机环境 我这里使用的操作系统是centos 6.5,安装在vmware上,共三台. 主机名 IP 操作系统 用户名 安装目录 node1 192.168.1.101 centos 6.5 wxy ...

  5. xml的复习

    xml的复习 1.概念:可扩展标记语言 2.功能: *存储数据    1.配置文件     2.在网络中传播 3.xml与html区别: xml语法严格,HTML语法松散 xml存储数据,HTML展示 ...

  6. java之死锁

    转载自 https://www.cnblogs.com/xiaoxi/p/8311034.html 一.死锁的定义 多线程以及多进程改善了系统资源的利用率并提高了系统 的处理能力.然而,并发执行也带来 ...

  7. (jvm调优)一、linux内存查看命令

    转载自https://blog.csdn.net/dongzhongyan/article/details/80067796 开始学习服务器性能查看以及调优 1.整体情况查看(任务管理器):top 第 ...

  8. Elasticsearch(1):基础入门

      1 Elasticsearch¶   在如今数据为王的时代,如何充分高效实现数据检索和分析是数据应用的关键.以电商平台为例,输入一个商品名称,那么就要求系统以最快的速度将所有相关的商品搜索处理.现 ...

  9. 详解如何使用koa实现socket.io官网的例子

    socket.io官网中使用express实现了一个最简单的IM即时聊天,今天我们使用koa来实现一下利用 socket.io 实现消息实时推送 框架准备 1.确保你本地已经安装好了nodejs和np ...

  10. spring @value和@@PropertySource注解简单使用

    @Value注解:可以使用注入基本字符串 EL表达式,从配置文件读取数据@PropertySource用于引入单个配置文件 @PropertySources用于引入多个配置文件 @PropertySo ...