2017-03-03 14:33:47 daiominribao 阅读数 1673

KVM网络虚拟化(二)

KVM网卡虚拟化除了全虚拟化、Virtio外,还可以利用网卡PCI透传技术,SR-IOV技术,提供更高性能的虚拟化网卡。

PCI透传

前面介绍的虚拟化技术本质上都是共享设备,带来的代价就是性能的降低,在追求性能的场景中并不适用。设备透传技术提供了虚拟机独占设备的方法,这在网卡PCI Passthrough可以将物理网卡直接交给虚拟机使用。虚拟机独占网卡,使用性能接近物理网卡。
PCI-Passthrough

设备透传需要硬件支持,Intel 和 AMD 都在它们的新一代处理器架构中提供对设备透传的支持(以及辅助管理程序的新指令)。Intel 将这种支持称为 Virtualization Technology for Directed I/O (VT-d),而 AMD 称之为 I/O Memory Management Unit (IOMMU)。不管是哪种情况,新的 CPU 都提供将 PCI 物理地址映射到客户虚拟系统的方法。

因为PCI透传虚机要独占网卡,所以对宿主的网卡数也是有要求的。同时设备透传在虚机热迁移时还会遇到问题。

SR-IOV

SR-IOV全称Single-Root I/O Virtualization,是一个将PCI-E设备共享给虚拟机的使用方案,多用在网络设备。SR-IOV从硬件上绕过系统和虚拟化层,使每个虚机能有单独的内存地址、中断、DMA流。

通过 SR-IOV,一个 PCIe 设备不仅可以导出多个 PCI 物理功能,还可以导出共享该 I/O 设备上的资源的一组虚拟功能。。在这个模型中,不需要任何透传,因为虚拟化在终端设备上发生,从而允许管理程序简单地将虚拟功能映射到 VM 上以实现本机设备性能和隔离安全。

SR-IOV
SR-IOV有两个功能模型:

Physical Functions(PFs):拥有权功能PCI-E功能,拥有配置管理SR-IOV
Virtual Function (VFs):轻量PCI-E功能,包含数据传输必要的资源

参考

https://www.ibm.com/developerworks/cn/linux/l-pci-passthrough/
《深度实践KVM》

2019-08-19 15:47:11 Jmilk 阅读数 598

目录

前文列表

虚拟化技术实现 — 虚拟化技术发展编年史

KVM

KVM(Kernel-based Virtual Machine,基于内核的虚拟机)是一种用于 Linux 内核中的虚拟化基础设施。本质是一个嵌入到 Linux 内核中的虚拟化功能模块 kvm.ko(kvm-intel.ko/kvm-AMD.ko),该模块在利用 Linux 内核所提供的部分操作系统能力(e.g. 任务调度、内存管理、硬件设备交互)的基础上,再加入了处理器和内存虚拟化的能力,使得 Linux 内核具备了成为 VMM 的条件。KVM 于 2007 年 2 月 5 日被集成到 Linux 2.6.20 内核中。使用 KVM 的前提是宿主机必须拥有支持硬件虚拟化拓展特性(Intel VT 或者 AMD-V)的处理器。

在这里插入图片描述

KVM 的功能清单

  • 支持 CPU 和 Memory 超分(Overcommit)
  • 支持半虚拟化 I/O(virtio)
  • 支持热插拔 (CPU、块设备、网络设备等)
  • 支持 SMP(Symmetric Multi-Processing,对称多处理)处理器架构
  • 支持 NUMA (Non-Uniform Memory Access,非一致存储访问)处理器架构
  • 支持实时迁移(Live Migration)
  • 支持 PCI 设备直接分配(Pass-through)和单根 I/O 虚拟化 (SR-IOV)
  • 支持合并相同内存页 (KSM )

以 Intel VT 为例,当启动 Linux 操作系统并加载 KVM 内核模块时:

  1. 初始化 KVM 模块内部的数据结构;
  2. KVM 模块检测当前的 CPU 体系结构,然后打开 CPU 控制器以及存取 CR4 寄存器的虚拟化模式开关,并通过执行 VMXON 指令将 Host OS/VMM(在 KVM 环境中,Host OS 即是 VMM)置于虚拟化模式的根模式(Root Mode);
  3. 最后,KVM 模块创建特殊的接口设备文件 /dev/kvm 并等待来自用户空间(QEMU)的指令。

但需要注意的是,KVM 是运行在内核态的且本身不能进行任何设备的模拟。所以,KVM 还必须借助于一个运行在用户态的应用程序来模拟出虚拟机所需要的虚拟设备(e.g. 网卡、显卡、存储控制器和硬盘)同时为用户提供操作入口。目前这个应用程序的最佳选择就是 QEMU。

QEMU

QEMU(Quick Emulator)是一款免费的、开源的、纯软件实现的、可执行硬件虚拟化的 VMM。与 Bochs,PearPC 等模拟器相比,QEMU 具有高速(配合 KVM)以及跨平台的特性。

在这里插入图片描述

事实上,QEMU 本身作为一套完整的 VMM 实现,包括了处理器虚拟化,内存虚拟化,以及模拟各类虚拟设备的功能。QEMU 4.0.0 版本甚至几乎可以模拟任何硬件设备,但由于这些模拟都是纯软件实现的,所以其性能低下。在 KVM 开发者在对 QEMU 进行稍加改造后,QEMU 可以通过 KVM 对外暴露的 /dev/kvm 接口来对其进行调用。从 QEMU 角度来看,也可以说是 QEMU 使用了 KVM 的处理器和内存虚拟化功能,为自己的虚拟机提供了硬件辅助虚拟化加速。除此以外,虚拟机的配置和创建、虚拟机运行所依赖的虚拟设备、虚拟机运行时的用户环境和用户交互,以及一些虚拟机的特定技术,比如:动态迁移,都是交由 QEMU 来实现的。

在这里插入图片描述

总的来说,QEMU 具有以下几种使用方式:

  1. 纯软件(二进制翻译)实现的全虚拟化虚拟机
  2. 基于硬件辅助虚拟化(KVM)的全虚拟化虚拟机
  3. 仿真器:为用户空间的进程提供 CPU 仿真,让在不同处理器结构体系上编译的程序得以跨平台运行。例如:让 SPARC 架构上编译的程序在 x86 架构上运行(借由 VMM 的形式)。

QEMU-KVM

KVM 官方提供的软件包下载包含了 KVM 内核模块、QEMU、qemu-kvm 以及 virtio 四个文件。其中,qemu-kvm 本质是专门针对 KVM 的 QEMU 分支代码包(一个特殊的 QEMU 版本)。

QEMU-KVM 相比原生 QEMU 的改动:

  • 原生的 QEMU 通过指令翻译实现 CPU 的完全虚拟化,但是修改后的 QEMU-KVM 会调用 ICOTL 命令来调用 KVM 模块。
  • 原生的 QEMU 是单线程实现,QEMU-KVM 是多线程实现。

然而在 QEMU 1.3 版本之后两者又保持一致了,但我们能仍习惯在 KVM 语境中将其称之为 QEMU-KVM。

NOTE:在 RHEL6/CentOS6 中,qemu-kvm 存放在 /usr/libexec 目录下。不过 PATH 环境变量缺省是不包含此目录的,所以用户无法直接使用 qemu-kvm,这样做是为了防止 QEMU 替代了 KVM 作为 VMM 的角色。如果希望启用 QEMU 作为 VMM 的话,可以通过将 /usr/libexec/qemu-kvm 链接为 /usr/bin/qemu 来完成。

在这里插入图片描述
在 QEMU-KVM 中,KVM 运行在内核空间,提供 CPU 和内存的虚级化,以及 Guest OS 的 I/O 拦截。QEMU 运行在用户空间,提供硬件 I/O 虚拟化,并通过 ioctl 调用 /dev/kvm 接口将 KVM 模块相关的 CPU 指令传递到内核中执行。当 Guest OS 的 I/O 被 KVM 拦截后,就会将 I/O 请求交由 QEMU 处理。例如:

open("/dev/kvm", O_RDWR|O_LARGEFILE)    = 3
ioctl(3, KVM_GET_API_VERSION, 0)        = 12
ioctl(3, KVM_CHECK_EXTENSION, 0x19)     = 0
ioctl(3, KVM_CREATE_VM, 0)              = 4
ioctl(3, KVM_CHECK_EXTENSION, 0x4)      = 1
ioctl(3, KVM_CHECK_EXTENSION, 0x4)      = 1
ioctl(4, KVM_SET_TSS_ADDR, 0xfffbd000)  = 0
ioctl(3, KVM_CHECK_EXTENSION, 0x25)     = 0
ioctl(3, KVM_CHECK_EXTENSION, 0xb)      = 1
ioctl(4, KVM_CREATE_PIT, 0xb)           = 0
ioctl(3, KVM_CHECK_EXTENSION, 0xf)      = 2
ioctl(3, KVM_CHECK_EXTENSION, 0x3)      = 1
ioctl(3, KVM_CHECK_EXTENSION, 0)        = 1
ioctl(4, KVM_CREATE_IRQCHIP, 0)         = 0
ioctl(3, KVM_CHECK_EXTENSION, 0x1a)     = 0

QEMU-KVM 调用 KVM 内核模块启动虚拟机的流程概要

  1. 获取 /dev/kvm fd(文件描述符)
kvmfd = open("/dev/kvm", O_RDWR);
  1. 创建虚拟机,获取虚拟机的句柄。KVM_CREATE_VM 时,可以理解成 KVM 为虚拟机创建了对应的数据结构,然后,KVM 会返回一个文件句柄来代表该虚拟机。针对这个句柄执行 ioctl 调用即可完成对虚拟机执行相应的管理,比如:创建用户空间虚拟地址(Virtual Address)、客户机物理地址(Guest Physical Address)以及主机物理地址(Host Physical Address)之间的映射关系;
vmfd = ioctl(kvmfd, KVM_CREATE_VM, 0);
  1. 为虚拟机映射内存和其他的 PCI 设备,以及信号处理的初始化。
ioctl(kvmfd, KVM_SET_USER_MEMORY_REGION, &mem);
  1. 将虚拟机镜像数据映射到内存,相当于物理机的 boot 过程,把操作系统内核映射到内存。

  2. 创建 vCPU,并为 vCPU 分配内存空间。KVM_CREATE_VCPU 时,KVM 为每一个 vCPU 生成对应的文件句柄,对其执行相应的 ioctl 调用,就可以对 vCPU 进行管理。

ioctl(kvmfd, KVM_CREATE_VCPU, vcpuid);
vcpu->kvm_run_mmap_size = ioctl(kvm->dev_fd, KVM_GET_VCPU_MMAP_SIZE, 0);
  1. 创建 vCPU 个数的线程并运行虚拟机。
ioctl(kvm->vcpus->vcpu_fd, KVM_RUN, 0);
  1. 线程进入循环,监听并捕获虚拟机退出原因,做相应的处理。这里的退出并不一定指的是虚拟机关机,虚拟机如果遇到 I/O 操作,访问硬件设备,缺页中断等都会执行退出。执行退出可以理解为将 CPU 执行上下文返回到 QEMU。
open("/dev/kvm")

ioctl(KVM_CREATE_VM)
ioctl(KVM_CREATE_VCPU)

for (;;) {
     ioctl(KVM_RUN)
     switch (exit_reason) {  /* 分析退出原因,并执行相应操作 */
     case KVM_EXIT_IO:  /* ... */
     case KVM_EXIT_HLT:  /* ... */
     }
}
2016-03-18 06:56:17 CloudMan6 阅读数 3759

网络虚拟化是虚拟化技术中最复杂的部分,学习难度最大。
但因为网络是虚拟化中非常重要的资源,所以再硬的骨头也必须要把它啃下来。

为了让大家对虚拟化网络的复杂程度有一个直观的认识,请看下图

这是 OpenStack 官网上给出的计算节点(可以理解为 KVM 的宿主机)虚拟网络的逻辑图,上面的网络设备很多,层次也很复杂。
我第一次看到这张图,也着实被下了一跳。

不过大家也不要怕,万丈高楼从地起,虚拟网络再复杂,也是由一些基础的组件构成的。只要我们将这些基础组件的概念和它们之间的逻辑关系搞清楚了,就能深刻理解虚拟网络的架构,那么云环境下的虚拟化网络也就不在话下了。

下面我们来学习网络虚拟化中最重要的两个东西:Linux Bridge 和 VLAN

Linux Bridge 基本概念

假设宿主机有 1 块与外网连接的物理网卡 eth0,上面跑了 1 个虚机 VM1,现在有个问题是:
如何让 VM1 能够访问外网?

至少有两种方案

  1. 将物理网卡eth0直接分配给VM1,但随之带来的问题很多:
    宿主机就没有网卡,无法访问了;
    新的虚机,比如 VM2 也没有网卡。
    下面看推荐的方案

  2. 给 VM1 分配一个虚拟网卡 vnet0,通过 Linux Bridge br0 将 eth0 和 vnet0 连接起来,如下图所示

Linux Bridge 是 Linux 上用来做 TCP/IP 二层协议交换的设备,其功能大家可以简单的理解为是一个二层交换机或者 Hub。多个网络设备可以连接到同一个 Linux Bridge,当某个设备收到数据包时,Linux Bridge 会将数据转发给其他设备。

在上面这个例子中,当有数据到达 eth0 时,br0 会将数据转发给 vnet0,这样 VM1 就能接收到来自外网的数据;
反过来,VM1 发送数据给 vnet0,br0 也会将数据转发到 eth0,从而实现了 VM1 与外网的通信。

现在我们增加一个虚机 VM2,如下图所示

VM2 的虚拟网卡 vnet1 也连接到了 br0 上。
现在 VM1 和 VM2 之间可以通信,同时 VM1 和 VM2 也都可以与外网通信。

有了上面的基础知识,下一节将演示如何在实验环境中实现这套虚拟网络。

2017-05-05 09:41:47 wuji3390 阅读数 183

 

网络虚拟化是虚拟化技术中最复杂的部分,学习难度最大。 但因为网络是虚拟化中非常重要的资源,所以再硬的骨头也必须要把它啃下来。

为了让大家对虚拟化网络的复杂程度有一个直观的认识,请看下图

这是 OpenStack 官网上给出的计算节点(可以理解为 KVM 的宿主机)虚拟网络的逻辑图,上面的网络设备很多,层次也很复杂。
我第一次看到这张图,也着实被下了一跳。

不过大家也不要怕,万丈高楼从地起,虚拟网络再复杂,也是由一些基础的组件构成的。只要我们将这些基础组件的概念和它们之间的逻辑关系搞清楚了,就能深刻理解虚拟网络的架构,那么云环境下的虚拟化网络也就不在话下了。

下面我们来学习网络虚拟化中最重要的两个东西:Linux Bridge 和 VLAN

Linux Bridge 基本概念

假设宿主机有 1 块与外网连接的物理网卡 eth0,上面跑了 1 个虚机 VM1,现在有个问题是: 如何让 VM1 能够访问外网?

至少有两种方案

  1. 将物理网卡eth0直接分配给VM1,但随之带来的问题很多: 宿主机就没有网卡,无法访问了; 新的虚机,比如 VM2 也没有网卡。 下面看推荐的方案

  2. 给 VM1 分配一个虚拟网卡 vnet0,通过 Linux Bridge  br0 将 eth0 和 vnet0 连接起来,如下图所示

Linux Bridge 是 Linux 上用来做 TCP/IP 二层协议交换的设备,其功能大家可以简单的理解为是一个二层交换机或者 Hub。多个网络设备可以连接到同一个 Linux Bridge,当某个设备收到数据包时,Linux Bridge 会将数据转发给其他设备。

在上面这个例子中,当有数据到达 eth0 时,br0 会将数据转发给 vnet0,这样 VM1 就能接收到来自外网的数据;反过来,VM1 发送数据给 vnet0,br0 也会将数据转发到 eth0,从而实现了 VM1 与外网的通信。

现在我们增加一个虚机 VM2,如下图所示

VM2 的虚拟网卡 vnet1 也连接到了 br0 上。现在 VM1 和 VM2 之间可以通信,同时 VM1 和 VM2 也都可以与外网通信。

有了上面的基础知识,下一节将演示如何在实验环境中实现这套虚拟网络。

2018-02-23 14:03:40 z619193774 阅读数 474

注意该配置的系统镜像为centos6.9!!!

安装虚拟环境

yum install kvm libvirt libvirt-python virt-manager bridge-utils

修改 网络环境为 bridge 模式。手动修改 /etc/sysconfig/network-scripts/下的

ifcfg-em1 对应 ifcfg-br0 对应 外网
ifcfg-em2 对应 ifcfg-br1 对应 内网

br0
DEVICE=”br0″
ONBOOT=”yes”
TYPE=”Bridge”
BOOTPROTO=”none”
STP=”off”
DELAY=”0″
IPV6INIT=”no”

br1
DEVICE=”br1″
ONBOOT=”yes”
TYPE=”Bridge”
BOOTPROTO=”none”
IPADDR=”192.168.1.247″
GATEWAY=”192.168.1.3″
NETMASK=”255.255.255.0″
STP=”off”
DELAY=”0″
IPV6INIT=”no”

em1
HWADDR=”20:47:47:8D:01:BE”
NM_CONTROLLED=”yes”
ONBOOT=”yes”
BRIDGE=”br0″
BOOTPROTO:=”none”
DEVICE=”em1″

em2
DEVICE=”em2″
BOOTPROTO=”none”
NM_CONTROLLED=”yes”
ONBOOT=”yes”
BRIDGE=”br1″

安装vncviewer ,便于管理
yum install tigervnc-server* xterm xorg-x11-xinit xorg-x11-twm xorg-x11-font*

修改/etc/sysconfig/vncserver为
VNCSERVERS=”1:root”
VNCSERVERARGS[1]=”-geometry 1920×1080″

启动 vncserver , 会提示输入密码,输入密码即可
以后可以使用 vncpasswd 来进行修改
用ntsysv 或者 chkconfig 安装此服务

===========================================================

常用管理命令
virt-manager 通过图形界面管理虚拟机
virsh suspend TestKVM 虚拟机处于paused暂停状态,一般情况下是被admin运行了virsh suspend才会处于这种状态,但是仍然消耗资源,只不过不被超级管理程序调度而已。
virsh resume TestKVM 把虚拟机唤醒,使其恢复到running状态
virsh shutdown TestKVM 关闭指令,是虚拟机进入shutoff状态,系统提示虚拟机正在被关闭,却未必能成功
virsh destroy TestKVM 强制关闭该虚拟机,但并非真的销毁该虚拟机,只是关闭而已。
virsh start TestKVM 启动该虚拟机。
virsh reboot TestKVM 重启虚拟机
virsh save TestKVM a 将该虚拟机的运行状态存储到文件a中
virsh restore a 根据文件a恢复被存储状态的虚拟机的状态,即便虚拟机被删除也可以恢复(如果虚拟机已经被undefine移除,那么恢复的虚拟机也只是一个临时的状态,关闭后自动消失)

虚拟机运行状态:running 虚拟机正在运行在cpu上
idel 虚拟机是闲置的,没有在运行,在等待IO或者休眠时虚拟机会进入这种状态
paused 虚拟机处于暂停状态,一般情况下是被admin运行了virsh suspend才会处于这种状态,但是仍然消耗资源,只不过不被超级管理程序调度而已。
shutdown 虚拟机在关闭过程中
shutoff 虚拟机没有运行,已经完全关闭
crashed 虚拟机崩溃
dying 虚拟机处于垂死的状态,但是又没完全关闭或崩溃

===========================================================

kvm迁移
定义迁出的服务器为 Host1, 迁入的Host2
虚拟机为 kvmtest
拷贝
Host1 上 的 /etc/libvirt/qemu/ 下的 kvmtest.xml 到 host2 /etc/libvirt/qemu 下。
host1 上 的 /var/lib/libvirt/images/ 下的 kvmtest.img 到 host2 /var/lib/libvirt/images 下。
然后使用 命令行 virsh
virsh define /etc/libvirt/qemu/kvmtest.xml 即可。

===========================================================

kvm快照
我们之前使用的虚拟机均采用 RAW格式作为磁盘格式,如果要使用快照的话,需要转换为qcow2格式
使用
qemu-img convert -f raw -O qcow2 xxx.img xxx.qcow2
的命令行进行转换
转换之后,挂载 qcow2 的磁盘作为 虚拟机主磁盘。
这时候就可以使用 快照了。

创建快照

virsh snapshot-create-as 192.168.1.1 快照名称
Domain snapshot 192.168.1.1 created

查看快照列表

virsh snapshot-list 1192.168.1.1
Name Creation Time State
————————————————————
快照名称 2015-05-29 11:47:42 +0800 running

如果要恢复快照的话,那么
virsh snapshot-revert 192.168.1.1 快照名称

删除快照
virsh snapshot-delete 192.168.1.1 快照名称

===========================================================

kvm拓展虚拟硬盘

以241为例
1、停机。
2、由于 241 使用的是 qcow2 磁盘,不能直接改变大小,所以首先转换格式
qemu-img convert -f qcow2 -O raw 192.168.1.241_win7x64.qcow2 192.168.1.241_win7x64.img
3、然后改变大小
qemu-img resize 192.168.1.241_win7x64.img +80G
4、备份原有的 qcow2,再把 改变大小后的 磁盘文件转换为 qcow2
qemu-img convert -f raw -O qcow2 192.168.1.241_win7x64.img 192.168.1.241_win7x64.qcow2
5、重新启动
然后进入 windows控制面板,系统管理 , 磁盘管理, 右键点击C盘,扩展卷,就直接扩展了。

===========================================================

kvm虚拟机出现IO错误修复虚拟机

1.进入所在路径
2qemu-img check -r all 【服务器的名称】

kvm虚拟化网络

博文 来自: u013908944

KVM 虚拟化技术

阅读数 81

kvm网络虚拟化

阅读数 6

没有更多推荐了,返回首页