KVM详解

虚拟化与KVM

    下载排好版的word文档,点这里php


一、虚拟化简介

1)     系统虚拟化是将底层物理设备与上层操做系统、软件分离的一 种去耦合技术,在一台物理机器上逻辑的划分出多台机器。 html

2)     虚拟化的目标是实现IT资源利用效率和灵活性的最大化。在一台物理主机上虚拟出多个虚拟计算机(虚拟机,Virtual Machine,VM),其上能同时运行多个独立的操做系统,这些客户操做系统(Guest OS)经过虚拟机管理器(Virtual Machine Monitor,VMM,也称做Hypervisor)访问实际的物理资源python

3)     KVM 全称是 基于内核的虚拟机(Kernel-based Virtual Machine),它是Linux 的一个内核模块,该内核模块使得 Linux 变成了一个Hypervisorlinux

二、使用虚拟化的缘由

当公司的服务器愈来愈多,咱们须要充分利用资源,也须要统一运维管理,这时虚拟化能帮助咱们作不少事。总结以下:windows

1)       打破“一台服务器对应一套应用”的模 式,将物理服务器进行整合,提高利用 率后端

2)       服务器和相关IT硬件更少,节省了机房空间,也减小了散热和电力需求centos

3)       具有灵活数据备份和应用迁移机制,保障服务永不中断api

4)       资源动态调配和模板化部署,应用系统快速上线,及时响应业务变化。缓存

image.png

三、虚拟化的分类

1)       全虚拟化(使用二进制翻译的虚拟化,hypervisor将操做系统的指令翻译并将结果缓存,供以后使用。而用户级指令无需修改就运行,具备和物理机同样的执行速度。客户系统不知道本身在虚拟环境中服务器

2)       半虚拟化(半虚拟化指的是虚拟机系统和hypervisor经过交互来改善性能和效率,但须要修改客户机操做系统。客户系统知道本身在虚拟环境中。如Xen)

3)       硬件辅助的虚拟化(Intel虚拟化技术(VT-x)和AMD的AMD-V,经过硬件的辅助实现全虚拟化)

四、三种虚拟化的区别

4.1、cpu的ring

在介绍三种虚拟化的区别前,首先要明白cpu的ring级别。

Intel的CPU将特权级别分为4个级别:RING0,RING1,RING2,RING3。

RING0级别最高,级别依次往降低。

操做系统(内核)的代码运行在最高运行级别ring0上,可使用特权指令,控制中断、修改页表、访问设备等等。

应用程序的代码运行在最低运行级别上ring3上,不能作受控操做。若是要作,好比要访问磁盘,写文件,那就要经过执行系统调用(函数)。

执行系统调用的时候,CPU的运行级别会发生从ring3到ring0的切换,并跳转到系统调用对应的内核代码位置执行,这样内核就为你完成了设备访问,完成以后再从ring0返回ring3。这个过程也称做用户态和内核态的切换。

那么,虚拟化在这里就遇到了一个难题,由于宿主操做系统是工做在ring0的,客户操做系统就不能也在ring0了,可是它不知道这一点,之前执行什么指令,如今仍是执行什么指令,那确定不行啊,没权限啊,玩不转啊。因此这时候虚拟机管理程序(VMM)就要避免这件事情发生。

(VMM在ring0上,通常以驱动程序的形式体现,驱动程序都是工做在ring0上,不然驱动不了设备)

image.png

4.2、全虚拟化

1)       客户操做系统执行特权指令时,会触发异常(CPU机制,没权限的指令,触发异常)

2)       而后VMM捕获这个异常,在异常里面作翻译,模拟。而且会缓存翻译结果

3)       最后返回到客户操做系统内,客户操做系统认为本身的特权指令工做正常,继续运行。

全虚拟化中,虽然用户级指令具备和物理机同样的执行速度。但系统级指令整个过程下来,性能损耗很是的大。由于一条简单的指令在宿主机上直接执行就好了,如今在gues os上却要经过复杂的异常处理过程。

4.3、半虚拟化

半虚拟化的思想是:让客户操做系统知道本身是在虚拟机上跑的,工做在非ring0状态,那么它原先在物理机上执行的一些特权指令,就会修改为其余方式,这种方式是能够和VMM约定好的

这就至关于,我经过修改代码把操做系统移植到一种新的架构上来,就是定制化。因此像XEN这种半虚拟化技术,客户机操做系统都是有一个专门的定制内核版本,和x8六、mips、arm这些内核版本等价。这样以来,就不会有捕获异常、翻译、模拟的过程了,性能损耗很是低。这就是XEN这种半虚拟化架构的优点。这也是为何XEN只支持虚拟化Linux,没法虚拟化windows缘由,由于微软不改代码。

4.4、硬件辅助的虚拟化

因为CPU厂商开始支持虚拟化了,因此出现了硬件辅助的虚拟化。拿X86 CPU来讲,引入了Intel-VT 技术,支持Intel-VT 的CPU,有VMX root operation 和 VMX non-root operation两种模式,两种模式都支持Ring 0 ~ Ring 3 这 4 个运行级别。这下好了,VMM能够运行在VMX root operation模式下,客户OS运行在VMX non-root operation模式下。便是宿主机和虚机是运行在一样硬件上的不一样模式,也就说,在硬件这层作了些区分,这样全虚拟化下,有些靠“捕获异常-翻译-模拟”的实现就不须要了。

4.5、参考文档

全虚拟化和半虚拟化的区别 cpuring0 ring1又是什么概念?  (http://www.cnblogs.com/xusongwei/archive/2012/07/30/2615592.html)

cpuring0ring1ring2ring3 (https://blog.csdn.net/jeason29/article/details/47338441)

 

五、宿主机和虚机对虚拟化的理解

1)       开启了硬件辅助虚拟化后,虚拟化是经过在Guest机器和Host机器中间加一层Hypervisor实现的。

2)       Host机器看虚机像跑在本身上面的程序

3)       因为Hypervisor帮助Guest访问物理资源,Guest机器感受本身运行在真机上

4)       若是Host机器和Guest机器都跑相同的Linux,它们的Kernel都想运行在Ring 0。

六、虚拟化技术

虚拟化技术很常见的有VMWareVirtualBoxCitrix Xenkvm

6.1、桌面虚拟化

将本来在本地电脑安装的桌面系统,统一在后端数据中心进行部署和管理; 用户能够经过任何设备,在任何地点,任什么时候间访问属于本身的桌面系统环境。

6.2、服务器虚拟化

1)         全虚拟化(Full-Virtulization)

无需修改操做系统,VM ESXiLinux KVM

2)         半虚拟化(Para-Virtulization)

集成半虚拟化代码,直接运行特权指令,性能接近物理机,须要修改操做系统, MS Hyper-V Ctrix XenIBM PowerVM

3)         操做系统层虚拟化

开发、测试环境,VM WorkstationVM Server

七、kvmQemuLibvirt的关系

7.1Hypervisor的分类

首先,hypervisor 能够划分为两大类:

1)            类型 1,这种 hypervisor 是直接运行在物理硬件之上的。例子是基于内核的虚拟机(KVM —— 它自己是一个基于操做系统的 hypervisor)。

2)            类型 2,这种 hypervisor 运行在另外一个操做系统中。类型 2 hypervisor 包括 QEMU WINE

7.2kvm,Qemu,Libvirt

先总结:

咱们平时在linux上用到的kvm,实际是Qemu-Kvm组成的HypervisorHypervisor是虚拟机管理器。虚机跑在Hypervisor虚拟出来的环境上。

Libvirt是个工具包。它能够管理Hypervisor。它的virsh命令,调用了它的libvirtd进程。它的libvirtd进程又回去调用Hypervisor。最后由Hypervisor实现对虚机的调控

QEMU

Qemu 是纯软件实现的虚拟化模拟器,几乎能够模拟任何硬件设备,咱们最熟悉的就是可以模拟一台可以独立运行操做系统的虚拟机,虚拟机认为本身和硬件打交道,但实际上是和 Qemu 模拟出来的硬件打交道,Qemu 将这些指令转译给真正的硬件。

正由于 Qemu 是纯软件实现的,全部的指令都要经 Qemu 过一手,性能很是低。

 

KVM

KVMlinux内核的模块。它采用硬件辅助虚拟化技术Intel-VTAMD-V以得到CPU的支持。采用如IntelEPTAMDRVI技术以得到内存的支持。Guest OSCPU指令不用再通过Qemu转译,直接运行,大大提升了速度,KVM经过/dev/kvm暴露接口,用户态程序能够经过ioctl函数来访问这个接口。见以下伪代码:

 


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:

    }

}

KVM内核模块自己只能提供CPU和内存的虚拟化,因此它必须结合QEMU才能构成一个完成的虚拟化技术,这就是下面要说的qemu-kvm

 

Qemu-kvm

QemuKVM整合进来,经过ioctl调用/dev/kvm接口,将有关CPU指令的部分交由内核模块来作。kvm负责cpu虚拟化+内存虚拟化,实现了cpu和内存的虚拟化,但kvm不能模拟其余设备。qemu模拟IO设备(网卡,磁盘等),kvm加上qemu以后就能实现真正意义上服务器虚拟化。由于用到了上面两个东西,因此称之为qemu-kvm

Qemu模拟其余的硬件,如Network, Disk,一样会影响这些设备的性能,因而又产生了pass through半虚拟化设备virtio_blk, virtio_net,提升设备性能。

 

image.png

 

Libvirt

Libvirt是用于管理虚拟化平台的开源的API,后台程序和管理工具。它能够用于管理KVMXenVMware ESXQEMU和其余虚拟化技术。

libvirt包括一个API库,一个守护进程(Libvirtd),和一个命令行实用程序(virsh)。

Libvirtd是一个daemon进程,能够被本地的virsh调用,也能够被远程的virsh调用,Libvirtd调用qemu-kvm操做虚拟机

image.png

 

7.3、参考文档

qemu支持的硬盘格式

(https://www.hongweipeng.com/index.php/archives/1368/)

 

深刻浅出 kvm qemu libvirt

(https://www.cnblogs.com/qiaoyanlin/p/6888408.html)

 

八、kvm配置

8.1、安装软件包

复杂版:yum install qemu-kvm qemu-img virt-manager libvirt libvirt-Python ibvirt-client virt-install virt-viewer bridge-utils

简介版:yum install qemu-kvm qemu-kvm-tools libvirt

qemu-kvm:qemu模拟器

qemu-img:qemu的磁盘管理器

virt-install:用来建立虚拟机的命令行工具

virt-manager:GUI虚拟机管理工具

libvirt:提供libvirtd daemon来管理虚拟机和控制hypervisor

libvirt-Python:基于libvirt API的python语言绑定工具包,经过该包能够实现对KVM平常管理和监控数据的获取

libvirt-client:提供客户端API用来访问server和提供管理虚拟机命令行工具的virsh实体

virt-install:是一个命令行工具,它可以为KVM、Xen或其它支持libvrit API的hypervisor建立虚拟机并完成GuestOS安装

virt-viewer:图形控制台

bridge-utils:建立和管理桥接设备的工具

8.2、检查内核模块嵌入

# 检查嵌入

lsmod | grep kvm

kvm_intel 55496 0 

kvm 337900 1 kvm_intel 

# 嵌入命令

modprobe kvm

modprobe kvm-intel

 

8.3、建立安装盘

qemu支持的硬盘格式

qemu-img create –f qcow2 /xx/xx/name 10G

8.4、建立虚拟机

virt-install --virt-type kvm \

--name CentOS-7 \

--ram 1024 \

--vcpus 1 \

--cdrom=/data/kvmtest/CentOS-7-x86_64-Minimal-1804.iso \

--disk path=/data/kvmtest/CentOS-7.qcow2 \

--network network=default \

--graphics vnc,listen=0.0.0.0 --noautoconsole \

--os-type=linux \

--os-variant=rhel7

virt-install参数详解

--virt-type:使用的hypervisor,如kvm、qemu、xen等

-n NAME, --name=NAME:虚拟机名称,需全局唯一;

-r MEMORY, --ram=MEMORY:虚拟机内在大小,单位为MB;

--vcpus=VCPUS[,maxvcpus=MAX][,sockets=#][,cores=#][,threads=#]:VCPU个数及相关配置;

-c CDROM, --cdrom=CDROM:光盘安装介质;

--disk=DISKOPTS:指定存储设备及其属性;格式为--disk /some/storage/path,opt1=val1,opt2=val2等;

经常使用的选项有:

l  device:设备类型,如cdrom、disk或floppy等,默认为disk;

l  bus:磁盘总结类型,其值能够为ide、scsi、usb、virtio或xen;

l  perms:访问权限,如rw、ro或sh(共享的可读写),默认为rw;

l  size:新建磁盘映像的大小,单位为GB;

l  cache:缓存模型,其值有none、writethrouth(缓存读)及writeback(缓存读写);

l  format:磁盘映像格式,如raw、qcow二、vmdk等;

l  sparse:磁盘映像使用稀疏格式,即不当即分配指定大小的空间;

l  --nodisks:不使用本地磁盘,在LiveCD模式中经常使用;

 

--network=NETWORK:将虚拟机连入宿主机的网络中,其中NETWORK能够为:

l  bridge=BRIDGE:链接至名为“BRIDEG”的桥设备;

l  network=NAME:链接至名为“NAME”的网络;

--graphics TYPE,opt1=val1,opt2=val2:指定图形显示相关的配置,此选项不会配置任何显示硬件(如显卡),而是仅指定虚拟机启动后对其进行访问的接口;

TYPE:指定显示类型,能够为vnc、sdl、spice或none等,默认为vnc; 若是选择spice,则须要linux图形界面的支持

port: TYPE为vnc或spice时其监听的端口;

listen:TYPE为vnc或spice时所监听的IP地址,默认为127.0.0.1,能够经过修改/etc/libvirt/qemu.conf定义新的默认值;

password:TYPE为vnc或spice时,为远程访问监听的服务进指定认证密码;

--noautoconsole:禁止自动链接至虚拟机的控制台;

--os-type=DISTRO_TYPE:操做系统类型,如Linux、unix或windows等;

--os-variant=DISTRO_VARIANT:某类型操做系统的变体,如rhel五、fedora8等

# 不经常使用的,了解

--cpu=CPU:CPU模式及特性,如coreduo等;可使用qemu-kvm -cpu ?来获取支持的CPU模式;

-l LOCATION, --location=LOCATION:安装源URL,支持FTP、HTTP及NFS等,如ftp://172.16.0.1/pub;

--pxe:基于PXE完成安装; --livecd: 把光盘看成LiveCD;

-x EXTRA, --extra-args=EXTRA:根据--location指定的方式安装GuestOS时,用于传递给内核的额外选项,例如指定kickstart文件的位置,

--extra-args "ks=http://172.16.0.1/class.cfg"

--boot=BOOTOPTS:指定安装过程完成后的配置选项,如指定引导设备次序、使用指定的而非安装的kernel/initrd来引导系统启动等 ;例如: --boot cdrom,hd,network:指定引导次序;

--boot kernel=KERNEL,initrd=INITRD,kernel_args=”console=/dev/ttyS0”:指定启动系统的内核及initrd文件;

 

8.5VNC安装

由于上面指定的是用VNC显示图形界面。因此下载一个VNC viewer,连上IP:5900,进行图形化安装。安装完成后就能够正常操做了

8.6、安装电源模块

yum install acpid

ACPIAdvanced Configuration and PowerInterface缩写,高级配置和电源管理接口。

acpid中的d则表明daemonAcpid是一个用户空间的服务进程,它充当linux内核与应用程序之间通讯的接口,负责将kernel中的电源管理事件转发给应用程序。

若是没有这个服务,是不能virsh shutdown 掉虚机的

8.7KVMxml文件

xml文件是虚机的配置文件。里面有虚机名,磁盘大小,vcpuramnetwor等等的信息。咱们经过xml文件能够了解到虚机的整个基础配置。还能够经过复制xml文件,用define命令生成新的虚机

<domain type = 'kvm'>        //虚拟机类型,kvm

  <name>demo</name>        //虚拟机名称

  <memory>1048576</memory> //分配内存,单位kb

  <vcpu>1</vcpu>           //分配vcpu,单位个数

  <os>

    <type arch = 'x86_64'machine = 'pc'>hvm</type>

    <bootdev = 'cdrom'/> //cd 启动

    <bootdev = 'hd'/>    //硬盘启动

  </os>

  <features>

    <acpi/>

    <apic/>

    <pae/>

  </features>

  <clock offset = 'localtime'/>

  <on_poweroff>destroy</on_poweroff>

  <on_reboot>restart</on_reboot>

  <on_crash>destroy</on_crash>

  <devices>

    <emulator>/usr/bin/kvm</emulator>

    <disk type = 'file'device = 'disk'>  //对应的镜像,就是以前使用qemu-img命令新建的img文件,注意路径要正确

      <driver name = 'qemu'type = 'raw'/>

      <sourcefile = '/var/lib/lynn/img/template.img'/>

      <target dev = 'hda'bus = 'ide'/>

    </disk>

    <disk type = 'file'device = 'cdrom'> //可选项,iso一般是操做系统的安装光盘

      <source file = '/var/lib/lynn/img/template.iso'/>

      <target dev = 'hdb'bus = 'ide'/>

    </disk>

    <interface type = 'bridge'>           //libvirt默认虚拟机的网络配置是NAT模式,就是虚拟机与宿主机的网络拓扑是NAT形式。实际中,许多开发者更但愿使用网桥模式。

      <source bridge = 'br0'/>

    </interface>

    <input type ='tablet'bus='usb'/>

    <input type = 'mouse'bus = 'ps2'/>

    <graphics type = 'vnc'port = '-1'listen = '0.0.0.0'keymap = 'en-us'/> //vnc端口系统自动配置

  </devices>

</domain>

 

8.8、网络配置

1、将网络由vibr0桥接,变为br0桥接

在最初建立虚机时,设置虚机的网络是“network=default”。让虚机连入名为default的网络。当时咱们也可设置“network=bridge_name,让虚机连入桥设备。但咱们没有这样作,因此如今虚机是连在virbr0桥设备上的。

1)vibr0是什么

vibr0KVM默认建立的一个Bridge,它为链接其上的虚机网卡提供NAT访问外网的功能。virbr0默认会被分配一个IP地址,并为链接其上的其余KVM虚拟网卡提供DHCP服务(dnsmasq服务)。此时,虚机网络为NAT模式,访问外部网络简单,但外部网络不能访问进来

2)br0桥接

这里的br0桥接,就是将虚机的网络模式变为桥接模式。这样虚机与宿主机处于同一网络环境,相似于一台真实的宿主机。操做以下:

(1)      宿主机操做

brctl show  #查看桥接链接

brctl addbr br0  #新建桥接链接

brctl addif br0 eth0  #将eth0网卡,绑到br0桥设备上

ip addr del dev eth0 192.168.56.11/24 #删除eth0网卡的IP地址

ifconfig br0 192.168.56.11/24  up #将eth0网卡的IP,配到br0上

route add default gw 192.168.56.2  #配置默认网关

修改KVM的xml文件(把端口类型改成bridge,源端口改成br0)

image.png

(2)      进入KVM虚机,为其配置网卡IP

BOOTPROTO=staic

 IPADDR=192.168.56.111 (与宿主机同网段)

 NETMASK=255.255.255.0

 GATEWAY=192.168.56.2

 

2、建立VLAN

vconfig add eth0 10  # 建立VLAN  (/proc/net/vlan/config)10,并将eth0加入VLAN

brctl addbr br10     # 建立网桥

brctl addif br10 eth0.10 # 将eth0绑到网桥

brctl addif br10 vnet0   # 将KVM虚机的网卡 加入网桥br10

3、参考文档

Linux系统配置kvm+vlan

(https://blog.51cto.com/fklinux/2045498)

 

KVM虚拟机网络配置 Bridge方式,NAT方式

(https://blog.csdn.net/hzhsan/article/details/44098537/)

 

KVM 虚拟机的网络模式学习及配置

(https://www.baidu.com/link?url=Cs-jCTF5gY6F3T73jhTWpR129jJwRnG2JqdsLZQSs2amaVgk8lf2LVjV9jevyzMdA1NpVzHja6-0riqJJZ7ZgK7AUj92XFzATOo48O441wy&wd=&eqid=b8fdc22300032726000000055b053d6f)

 

8.7KVM与宿主机的关系

KVMLinux中是一个进程的表现形式,它受的到CPU的调度

Libvirt是管理kvm的工具,关掉Libvird服务,不影响KVM虚机的正常运行,只是没法用libvirt管理而已

九、virsh命令

virsh命令,调用libvidLibvirtd调用qemu-kvm操做虚拟机。经过virsh命令,咱们能够实如今CLI对虚拟机的管理

 

virsh有命令模式和交互模式。

u  命令模式:直接在virsh后面接参数

u  交互模式:直接写virsh

u  事实上交互模式和命令的参数都是同样的

9.1、经常使用命令

命令(前缀 virsh)

含义

list

显示显示本地活动虚拟机

-all:显示本地全部的虚拟机

creat KVM_name.xml

建立虚机(建立后,虚机当即执行。虚机关机后自动消失)

define KVM_name.xml

经过配置文件定义一个虚机。(定之后虚机不是活动的)

start KVM_name

启动虚机

console KVM_name

链接虚机 【KVM 经过virsh console连入虚拟机

suspend KVM_name

暂停虚机,虚拟机处于paused暂停状态

可是仍然消耗资源,只不过不被超级管理程序调度而已。

resume KVM_name

唤醒虚机

shutdown KVM_name

正常关闭虚机

destroy KVM_name

强制关闭虚机,并删除

libvirt直接销毁demo,取消demo的定义

undefine KVM_name

移除虚拟机

在虚拟机处于Running状态时,调用该指令,该指令暂时不生效

可是当虚拟机被关闭后,该指令生效移除该虚拟机,也能够在该指令生效以前调用define+TestKVM.xml取消该指令

 

9.2、显示虚机信息命令

命令(前缀为 virsh)

含义

dominfo KVM_name

显示虚机的基本信息

dumpxml KVM_name

显示虚机的当前配置文件

dump KVM_name file

将虚机的配置文件重定向到file

domiflist KVM_name

列出虚机网卡接口

domifstat KVM_name vnet0

显示网卡信息

domuuid KVM_name

显示虚机UUID

domid KVM_name/UUID

显示虚机ID

cpu-stats KVM_name

显示虚机CPU状态

vncdisplay

显示虚机的IP

 

9.3、更改虚机

命令(前缀为 virsh)

含义

exit KVM_name

编辑虚机的配置文件

setmen KVM_name size

设置虚机内存。要求虚机不活动

setvcpus KVM_name num

设置虚机的虚拟CPU个数。要求虚机不活动

autostart KVM_name

虚机将随宿主机一块儿启动

--disable   KVM_name:取消自动启动

9.4、参考文档

virsh的详细命令解析 (https://blog.csdn.net/xxoo00xx00/article/details/49802367)

相关文章
相关标签/搜索