KVM虚拟化技术(一)

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

概述:


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

虚拟化技术基础

1.介绍

cpu虚拟化:

模拟:emulation

虚拟:virtulization

  • 完全虚拟化(full-virtulization)

       BT: 二进制翻译 (软件)

       HVM:硬件辅助的虚拟化 (硬件)

  • 半虚拟化(para-virtulization)

Memory虚拟化

image.png

I/O虚拟化

image.png

2.实现方式

两种实现方式

Type-I:

  • hypervisor --> vm

  • xen, vmware ESX/ESXi

            xen:hypervisor, Dom0(实现I/O操作)

Type-II:

  • host(宿主机) --> vmm(虚拟机监控器) --> vm

  • kvm, vmware workstation, virtualbox

3.Inter硬件辅助的虚拟化

image.png


QEMU,virtio

1.虚拟化技术的分类

模拟

  • 著名的模拟器,PearPC, Bochs, QEMU

完全虚拟化:也称为native virtulization

两种加速方式:

  • BT

  • HVM

应用的技术:

  • VMware Workstation, VMware Server, Parallels Desktop, KVM, Xen(HVM)

半虚拟化:para-virtualization

  • 解决方案:xen, uml(user-mode linux)

OS级别的虚拟化:

将用户空间分隔为多个,彼此间互相隔离;

容器级虚拟化

  • OpenVZ, lxc

  • Solaris Containers     

  • FreeBSD jails

库虚拟化:

  • wine

应用程序虚拟化:

  • jvm

2.虚拟化网络

虚拟化网络:

  • nat mode:NAT模型

  • bridge mode:桥接模型

  • routed mode:路由模型

  • isolation mode:隔离模型

TUN与TAP

在计算机网络中,TUN与TAP是操作系统内核中的虚拟网络设备。不同于普通靠硬件网路板卡实现的设备,这些虚拟的网络设备全部用软件实现,并向运行于操作系统上的软件提供与硬件的网络设备完全相同的功能。

  • TAP等同于一个以太网设备,它操作第二层数据包如以太网数据帧。TUN模拟了网络层设备,操作第三层数据包比如IP数据封包。

  • 操作系统通过TUN/TAP设备向绑定该设备的用户空间的程序发送数据,反之,用户空间的程序也可以像操作硬件网络设备那样,通过TUN/TAP设备发送数据。在后种情况下,TUN/TAP设备向操作系统的网络栈投递(或“注入”)数据包,从而模拟从外部接受数据的过程。

KVM

1.介绍

KVM: Kernel-based Virtual Machine, Qumranet公司

依赖于HVM(要求cpu必须支持硬件虚拟化)

  • Intel:VT-x(表现为vmx)

  • ADM: ADM-V (表现为svm)

内核模块(整体表现为一个内核模块):

  • kvm:核心模块

  • kvm-intel(专用于intel的模块);kvm-amd(专用于amd的模块)

KVM模块载入后的系统的运行模式:

  • 内核模式:GuestOS(虚拟机操作系统)执行I/O类操作,或其它的特殊指令的操作;称作“来宾-内核”模式;

  • 用户模式:代表GuestOS请求I/O类操作;

  • 来宾模式:GuestOS的非I/O类操作;事实上,它被称作“来宾-用户”模式;

  • kvm hypervisor:host上的内核

2.kvm组件

两类组件

/dev/kvm:

  • 工作于hypervisor,在用户空间可通过ioctl()系统调用来完成VM创建、启动等管理功能;它是一个字符设备

  • 功能:创建VM、为VM分配内存、读写VCPU的寄存器、向VCPU注入中断、运行VCPU等等;

qemu进程:

  • 工作于用户空间,主要用于实现模拟PC机的IO设备;

3.kvm特性

特性

内存管理:

  • 将分配给VM的内存交换至SWAP;

  • 支持使用Huge Page(大内存页); 

  • 支持使用Intel EPT或AMD RVI技术完成内存地址映射;(GVA-->GPA-->HPA 过渡到 GVA->HPA)

  • 支持KSM (Kernel Same-page Merging) 内核相同页面合并技术

硬件支持:

  • 取决于Linux内核;

存储:

  • 本地存储

  • 网络附加存储:

  • 存储区域网络:

  • 分布式存储:例如GlustFS

实时迁移:

支持的GuestOS(x86系统的服务器):

  • Linux, Windows, OpenBSD, FreeBSD, OpenSolaris;

设备驱动:

  • IO设备的完全虚拟化:模拟硬件

  • IO设备的半虚拟化:在GuestOS中安装驱动;virtio

          virtio-blk, virtio-net, virtio-pci, virtio-console, virtio-ballon

4.kvm局限性

一般局限性

  • CPU overcommit

  • 时间记录难以精确,依赖于时间同步机制

MAC地址:

  • VM量特别大时,存在冲突的可能性;

  • 实时迁移:

  • 性能局限性:

5.kvm工具栈

qemu:

  • qemu-kvm:主要作用是实现进程管理

  • qemu-img:用来管理磁盘映像文件

libvirt(cs架构)

kvm hypervisor:

  • 运行libvirtd守护进程

客户端工具管理接口

  • GUI:virt-manager, virt-viewer

  • CLI:virt-install, virsh

QEMU主要提供了以下几个部分:

  • 处理器模拟器

  • 仿真IO设备

  • 关联模拟的设备至真实设备;

  • 调试器

  • 与模拟器交互的用户接口

KVM安装及使用

1.安装前提

(1)确保CPU支持HVM

  • # grep -E --color=auto "(vmx|svm)" /proc/cpuinfo

(2)查看内核编译是否提供了kvm模块

  • # modinfo kvm

(3)装载模块

  • # modprobe kvm

  • # modprobe kvm-intel

(4)验正:

  • /dev/kvm 或者 lsmod |grep kvm

演示:

[[email protected] ~]# grep -E --color=auto "(vmx|svm)" /proc/cpuinfo
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer xsave avx hypervisor lahf_lm arat epb pln pts dtherm tpr_shadow vnmi ept vpid tsc_adjust
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer xsave avx hypervisor lahf_lm arat epb pln pts dtherm tpr_shadow vnmi ept vpid tsc_adjust
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts nopl xtopology tsc_reliable nonstop_tsc aperfmperf pni pclmulqdq vmx ssse3 cx16 pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer xsave avx hypervisor lahf_lm arat epb pln pts dtherm tpr_shadow vnmi ept vpid tsc_adjust

[[email protected] ~]# modinfo kvm
filename:       /lib/modules/3.18.41-1.0-Taolinux/kernel/arch/x86/kvm/kvm.ko
license:        GPL
author:         Qumranet
srcversion:     2C2D9EC3889CB033C504EAE
depends:        
intree:         Y
vermagic:       3.18.41-1.0-Taolinux SMP mod_unload modversions 
signer:         Magrathea: Glacier signing key
sig_key:        13:F4:F1:CE:0F:1F:64:52:F0:D6:39:73:5A:ED:94:84:A4:DB:4B:20
sig_hashalgo:   sha256
parm:           ignore_msrs:bool
parm:           min_timer_period_us:uint
parm:           tsc_tolerance_ppm:uint
[[email protected] ~]# 
[[email protected] ~]# modprobe kvm
[[email protected] ~]# lsmod |grep kvm
kvm_intel             148404  0 
kvm                   466442  1 kvm_intel

[[email protected] ~]# ll /dev |grep kvm
crw------- 1 root root     10, 232 Mar 21 21:53 kvm


2.为KVM虚拟机配置桥接网络

方法一:

  • 直接在/etc/sysconfig/network-scripts 目录中创建桥接接口 ifcfg-br0

方法二:

  • 通过 virsh iface-bridge  命令创建桥接接口

virsh:

image.png


注意:

创建物理桥需要关闭NetworkManager服务,使用network服务来管理网络;

  • systemctl stop NatworkManager

  • systemctl disable NatworkManager

演示一:

1.编辑/etc/sysconfig/network-scripts 创建ifcfg-br0,然后修改相关配置如下:

[[email protected] network-scripts]# cp ifcfg-eno16777736 ifcfg-br0

#修改原来的网卡 eno16777736 作为交换机使用
# Generated by parse-kickstart
IPV6INIT=yes
IPV6_AUTOCONF=yes
BOOTPROTO=none
DEVICE=eno16777736
ONBOOT=yes
UUID=71d191d3-7396-4336-879d-a5c3deab705f
TYPE=Ethernet
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME="System eno16777736"
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
BRIDGE=br0  # 添加项

# 修改ifcfg-br0作为网卡使用
# Generated by parse-kickstart
IPV6INIT=yes
IPV6_AUTOCONF=yes
BOOTPROTO=none
DEVICE=br0   # 设备为br0
ONBOOT=yes
TYPE=Bridge  # 网卡类型为 Bridge
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
DNS1=192.168.1.1
DNS2=114.114.114.114
IPADDR=192.168.1.112
PREFIX=24
GATEWAY=192.168.1.1
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes

2.重启网络,ifconfig查看如下

[[email protected] ~]# ifconfig
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.112  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::20c:29ff:fe21:c943  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:21:c9:43  txqueuelen 0  (Ethernet)
        RX packets 31  bytes 3591 (3.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 39  bytes 6221 (6.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether 00:0c:29:21:c9:43  txqueuelen 1000  (Ethernet)
        RX packets 1816  bytes 143756 (140.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 799  bytes 109966 (107.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

演示2:使用virsh 配置网络

[[email protected] network-scripts]# virsh iface-list   # 查看当前网卡
 Name                 State      MAC Address
---------------------------------------------------
 eno16777736          active     00:0c:29:21:c9:43
 lo                   active     00:00:00:00:00:00

[[email protected] network-scripts]# virsh iface-bridge eno16777736 br0 #创建物理桥eno16777736为br0
Created bridge br0 with attached device eno16777736

[[email protected] ~]# ifconfig
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.112  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 fe80::20c:29ff:fe21:c943  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:21:c9:43  txqueuelen 0  (Ethernet)
        RX packets 66  bytes 7319 (7.1 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 66  bytes 11370 (11.1 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::20c:29ff:fe21:c943  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:21:c9:43  txqueuelen 1000  (Ethernet)
        RX packets 3954  bytes 335609 (327.7 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 2648  bytes 417462 (407.6 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        
[[email protected] ~]# virsh iface-list
 Name                 State      MAC Address
---------------------------------------------------
 br0                  active     00:0c:29:21:c9:43
 lo                   active     00:00:00:00:00:00


3.管理工具栈

# yum grouplist | grep -i "virtualization"

Virtualization:

  • qemu-kvm

Virtualization Client:

  • python-virtinst, virt-manager, virt-viewer

Virtualization Platform:

  • libvirt, libvirt-client

Virtualization Tools

  • libguestfs

libvirt工具栈

libvirt

  • 支持的虚拟化技术:KVM, XEN, VMWARE, Qemu,LXC, OpenVZ; 

libvirt中的术语:

  • node: 指物理节点

  • hypervisor:支持虚拟机的运行环境

  • domain: 虚拟机

        dom0:特权域

        domU:非特权域

如下图:

timg (1).jpgtimg.jpg

安装并启动 libvirtd.service

  • # yum install libvirt libvirt-client python-virtinst virt-manager

  • centos 7: # yum install libvirt libvirt-client virt-install virt-manager virt-viewer

启动守护进程:

  • ~]# systemctl start libvirtd.service

libvirt和libvirtd的配置文件:

  • libvirt配置文件:/etc/libvirt/libvirt.conf

  • 守护进程配置文件:/etc/libvirt/libvirtd.conf

Hypervisor的访问路径:

本地URL:

  • driver[+transport]:///[path][?extral-param]

       driver: 驱动名称,例如 qemu, xen, lxc

       transport:传输方式

  • kvm使用qemu驱动,使用格式qemu:///system, 例如qemu:///system

远程URL:

例如:

  • qemu://172.16.100.6/system

  • qemu+ssh://[email protected]/system

  • qemu+tcp://172.16.100.6/system

演示:virt-manager创建虚拟机

1.安装及启动守护进程 libvirtd.service

#安装
[[email protected] ~]# yum install libvirt libvirt-client virt-install virt-manager virt-viewer

#启动守护进程libvirtd.service
[[email protected] ~]# systemctl start libvirtd.service

2.执行 virt-manager启动图形化管理界面,此操作可以通过vnc或者xhell的xmanager实现,如下:

image.png

安装qemu-kvm(yum install qemu-kvm -y)并重启libvirtd.service(systemctl restart libvirtd.service)服务,再次执行virt-manager可以看到如下界面:

image.png

3.这里选择使用本地镜像安装

image.png

4.设置虚拟机的内存和cpu的核心数,这里要注意内存要大于等于1024M,如果小于的话在安装的时候会提示错误。

image.pngimage.png

5.设定磁盘大小

image.png

6.选择安装前自定义,并且选择物理桥br0

image.png

7.确认是否链接到本地镜像

image.png

选择Display 为VNC ,否则的话进入安装界面鼠标和键盘都不能用(这里针对xshell跳转的xmanager说明),如果是使用的vnc远程桌面,可以不设置

image.png

选择我 Device model 为virtio

image.png

选择引导分区为CDROM

image.png

8.点击 Begin Installation开始安装,如下:image.png


如上,就是通过virt-manager图形化工具安装KVM虚拟机的整个过程!