kvm虚拟化

实现虚拟化的方式两种:

1、vmm (Virtual Machine Monitor,虚拟机监控器 )直接运行在硬件平台上,控制所有硬件并管理客户的操作系统,如xen,vmware
2、vmm运行在一个传统的操作系统里,在系统之上运行一套软件,在软件之上运行客户的操作系统,如kvm
完全虚拟化:
通过客户机和宿主机直接通过一个虚拟化逻辑层hypervisor来完全模拟底层硬件细节,客户机的操作系统无需任何修改
kvm虚拟化_第1张图片
半虚拟化:
事先修改客户机操作系统内核,共享宿主机底层硬件来实现的,虚拟主机内核能直接管理底层硬件
kvm虚拟化_第2张图片
相比完全虚拟化使用灵活,性能不够强,半虚拟化直接管理底层硬件,性能很好,但需要修改系统内核,使用繁琐

一、 KVM概述

KVM是Kernel-based Virtual Machine的缩写,即基于Linux内核的虚拟机,是一种的完全虚拟化的解决方案,也就是说普通的操作系统不需经过修改就可以在KVM上运行。它使用linux自身的调度器进行管理,所以相对于xen,其核心源码很少。KVM的虚拟化需要硬件的支持(如intel VT技术或者AMD V技术),是基于硬件的完全虚拟化。

准确来说,KVM是Linux的一个模块。可以用modprobe去加载KVM模块。加载了模块后,就可以使用KVM模块创建虚拟机,实现虚拟内存的分配,虚拟CPU寄存器的读写以及管理虚拟CPU的运行。但仅有KVM模块是远远不够的,因为用户无法直接控制内核模块去作事情,所以还必须有一个用户空间的工具才行。这个用户空间的工具,开发者选择了已经成型的开源虚拟化软件 QEMU,使用它来模拟PC硬件的用户空间组件,模拟I/O设备模型以及提供访问外设的途径。后边会详细的介绍QEMU,这里先知道它用了QEMU就好了。

KVM基本架构如下图所示。
kvm虚拟化_第3张图片
其中KVM被加入到标准的Linux内核中,被组织成Linux中标准的字符设备(/dev/kvm)。Qemu利用KVM提供的LibKvm应用程序接口,通过ioctl系统调用创建和运行虚拟机。KVM Driver使得整个Linux成为一个虚拟机监控器。并且在原有的Linux两种执行模式(内核模式和用户模式)的基础上,新增加了客户模式,客户模式拥有自己的内核模式和用户模式。在虚拟机运行下,三种模式的分工如下:

客户模式:执行非I/O的客户代码,虚拟机运行在客户模式下。

内核模式:实现到客户模式的切换,处理因为I/O或者其它指令引起的从客户模式的退出,KVM Driver工作在这种模式下。

用户模式:代表客户执行I/O指令Qemu运行在这种模式下。

## KVM的具体工作流程如下:
kvm虚拟化_第4张图片
用户模式的qemu利用libkvm通过ioctl进入内核模式,kvm模块未虚拟机创建虚拟内存,虚拟CPU后执行VMLAUCH指令进入客户模式。加载Guest OS并执行。如果Guest OS 发生外部中断或者影子页表缺页之类的情况,会暂停Guest OS的执行,退出客户模式出行异常处理,之后重新进入客户模式,执行客户代码。如果发生I/O事件或者信号队列中有信号到达,就会进入用户模式处理。

二、QEMU概述

QEMU(Quick Emulator)是一个独立的开源虚拟机软件,它是通过纯软件来仿真X86平台处理器的取指、解码和执行,虚拟客户机的指令并不在物理平台上直接执行,它利用其中的微型代码生成器模块进行动态翻译,将需要模拟的客户机的代码架构转换成主机代码架构并最终执行。QEMU虚拟机是一个纯软件的实现(KVM需要硬件虚拟化技术支持),所以性能低下。但是,其优点是虚拟机可以与宿主机并不是同一个架构。与KVM不同的是,QEMU的代码中有整套的虚拟机实现,包括处理器虚拟化、内存虚拟化,以及KVM使用到的虚拟设备模拟(比如网卡、显卡、存储控制器和硬盘等)

QEMU具有以下的优点:

默认支持多种架构。可以模拟 IA-32 (x86)个人电脑,AMD 64个人电脑,MIPS R4000, 升阳的SPARCsun3 与PowerPC(PReP 及 Power Macintosh)架构

可扩展,可自定义新的指令集

开源,可移植,仿真速度快

在支持硬件虚拟化的x86构架上可以使用KVM加速配合内核ksm大页面备份内存,速度稳定远超过VMware ESX

增加了模拟速度,某些程序甚至可以实时运行

可以在其他平台上运行Linux的程序

可以储存及还原运行状态(如运行中的程序)

可以虚拟网络卡

kvm安装
yum源配置
[My_share]
name=My_Souce
baseurl=file:///mnt/cdrom/
gpgcheck=0
enabled=1
cost=88
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

systemctl stop firewalld.service
systemctl disable firewalld.service
firewall-cmd --state
sed -i ‘/^SELINUX=./c SELINUX=disabled’ /etc/selinux/config
sed -i 's/^SELINUXTYPE=.
/SELINUXTYPE=disabled/g’ /etc/selinux/config
grep --color=auto ‘^SELINUX’ /etc/selinux/config
setenforce 0

#删除当前的yum源
cd /etc/yum.repos.d/ && rm -rf *

#添加yum源
curl http://10.0.0.240/share/Lan7.repo > /etc/yum.repos.d/Lan7.repo
yum clean all && yum makecache
grep -E ‘(vmx|svm)’ /proc/cpuinfo

#yum -y install qemu-kvm qemu-kvm-tools virt-manager libvirt virt-install

#yum -y upgrade device-mapper-libs
yum install libvirt* virt-* qemu-kvm* -y
libvirt # 虚拟机管理
virt # 虚拟机安装克隆
qemu-kvm # 管理虚拟机磁盘
modprobe kvm
lsmod | grep kvm
systemctl enable libvirtd.service
systemctl start libvirtd.service
创建虚拟机镜像文件的模式有:全镜像模式:raw和稀松模式:qcow2
qemu-img create -f raw /opt/centos7-x86_64.raw 10G  这个raw模式盘就创建多大的磁是多大,而且这个模式是不能对虚拟机做快照的、

ceph df
qemu-img create -f qcow2 /opt/centos7-x86_64.qcow2 10G  这个qcow2模式创建5G磁盘,但会根据使用情况来增加磁盘的使用量,而且这个模式支持虚拟机的快照

创建虚拟机
virt-install --name centos7_1 --virt-type kvm --ram 1024 --cdrom=/opt/CentOS-7.2-x86_64-DVD-1511.iso --disk path=/opt/centos7-x86_64.qcow2 --network network=default --graphics vnc,listen=0.0.0.0,port=5910 --noautoconsole

windows上安装个vnc,去连接虚拟机
安装第一个虚拟机的的端口为5900,第二个端口就为5901.。。。一次类推

virt-install #建立kvm虚拟机
virsh list #查看正在运行的KVM虚拟机
virsh list --all #查看所有KVM虚拟机
virsh start name #启动KVM虚拟机
virsh shutdown name #正常关闭KVM虚拟机
virsh destroy name #强制关闭KVM虚拟机(类似于直接断电)
virsh suspend name #挂起KVM虚拟机
virsh resume name #恢复挂起的KVM虚拟机
virsh dumpxml name #备份虚拟机的xml文件
virsh edit name #编辑KVM虚拟机的xml配置文件
virsh autostart name #随着宿机的开启启动虚拟机
virsh undefine name #彻底删除KVM虚拟机,不可逆,如果想找回来,需要备份/etc/libvirt/qemu的xml文件)

默认情况KVM的网络是NAT模式,但是在生产情况,用的多的都是网桥模式。
添加一个桥接网卡:brctl addbr br0
查看桥接网卡信息
[root@localhost ~]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000000000000 no
virbr0 8000.5254009f0311 yes virbr0-nic

# 查看eno33554960配置文件

[root@kvm ~]# cat /etc/sysconfig/network-scripts/ifcfg-eno33554960
DEVICE= eno33554960
ONBOOT=yes
BRIDGE=“br0”

# 查看 br0 配置文件
[root@kvm ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0
DEVICE=“br0”
ONBOOT=“yes”
TYPE=“Bridge”
BOOTPROTO=“none”
IPADDR=“10.0.1.240”
NETMASK=“255.255.255.0”
GATEWAY=“10.0.0.254”
IPV6INIT=“yes”
IPV6_AUTOCONF=“yes”
DHCPV6C=“no”
STP=“on”
DELAY=“0”

修改虚拟机网络配置
[root@kvm ~]# virsh edit centos7_1 修改前:



  

  

  

  

修改后:



  

  

  

  

查看宿主机网桥

 [root@localhost ~]# brctl show
 bridge id        STP enabled    interfaces
 br0        8000.000c294d551b    yes        eno33554960
 virbr0     8000.5254006aaa40    yes        virbr0-nic

重启虚拟机
virsh destroy centos7_1
virsh start centos7_1

查看宿主机网桥
[root@localhost ~]# brctl show
bridge name bridge id STP enabled interfaces
br0 8000.000c293ddb4f yes eno33554960
virbr0 8000.525400af06d3 yes virbr0-nic

磁盘管理
添加磁盘
qemu-img create -f qcow2 /opt/centos7_bak.qcow2 10G
virsh attach-disk centos7_1 /opt/centos7_bak.qcow2 vdb --live --cache=none --subdriver=qcow2

卸载磁盘
virsh detach-disk centos7_1 vdb
qemu-img resize centos7_bak.qcow2 +1G

虚拟机里格式磁盘mkfs.xfs /dev/vdb

cpu热添加操作

kvm虚拟机热添加cpu 注意。只能添加不能减少,而且不能超过设置的个数

修改虚拟机的xml文件,让其支持cpu热添加

virsh edit centos7_1

3

设置虚拟机cpu数

virsh setvcpus centos7_1 2 --live #意思讲cpu添加到2个

然后登陆虚拟机,验证cpu添加是否成功

grep ‘processor’ /proc/cpuinfo |wc -l

2

内存热添加
内存的设置拥有一个气球(balloon)机制,可以增大减少,但是也要设置一个最大值,默认并没有最大值,也可以在安装时指定。内存热膨胀和压缩,总数不能超过最大内存
virsh edit centos7_1
4194304 #修改最大支持内存扩容为4G
1048576 #当前KVM虚拟机内存为1G

重启虚拟机
virsh qemu-monitor-command centos7_1 --hmp --cmd info balloon
virsh qemu-monitor-command centos7_1 --hmp --cmd balloon 2048

快照
创建快照
virsh snapshot-create centos7_1

查看主机的快照列表
virsh snapshot-list centos7_1

#对虚拟机搞个破坏
还原快照
virsh snapshot-revert centos7_1 --snapshotname 1516607756

删除快照
virsh snapshot-delete centos7_1 --snapshotname 1516607756

快照路径
/var/lib/libvirt/qemu/snapshot

冷迁移
在kvm2中安装kvm组件
yum install libvirt* virt-* qemu-kvm* -y
在kvm2中配置桥接网络
virsh iface-bridge eth0 br0
mkdir -p /data
在kvm1中将虚拟机关机,导出配置文件
virsh dumpxml clsn7 >clsn7.xml
在kvm1中将虚拟机文件传输到kvm2上
scp -rp clsn7.xml clsn.qcow2 10.0.0.201:/data
在kvm2中导入配置文件
virsh define clsn7.xml
在kvm2中启动虚拟机
virsh start clsn7
在kvm2中查看虚拟机状态
virsh list --all Id 名称 状态


5 clsn7 running

你可能感兴趣的:(虚拟化)