关于虚拟化

什么是虚拟化

在计算机技术中,虚拟化(技术)或虚拟技术(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配器等),予以抽象、转换后呈现出来并可供分区、组合为一个或多个电脑配置环境。
KVM虚拟化基础_KVM虚拟化
由此,打破实体结构间的不可切割的障碍,使用户可以比原本的配置更好的方式来应用这些电脑硬件资源。这些资源的新虚拟部分是不受现有资源的架设方式,地域或物理配置所限制。

一般所指的虚拟化资源包括计算能力和数据存储。

由于目前信息技术领域的很多企业都曾在宣传中将该企业的某种技术称为虚拟化技术,这些技术涵盖的范围可以从Java虚拟机技术到系统管理软件,这就使得准确的界定虚拟技术变得困难。因此各种相关学术论文在谈到虚拟技术时常常提到的便是如前面所提到的那个不严格的定义。

为什么用虚拟化

同一台物理机运行多个不同版本应用软件
硬件依赖性较低和便于数据迁移
KVM虚拟化基础_KVM虚拟化_02

虚拟化技术的优势

1.降低运营成本
服务器虚拟化降低了IT基础设施的运营成本,令系统管理员摆脱了繁重的物理服务器、OS、中间件及兼容性的管理工作,减少人工干预频率,使管理更加强大、便捷。
2.提高应用兼容性
服务器虚拟化提供的封装性和隔离性使大量应用独立运行于各种环境中,管理人员不需频繁根据底层环境调整应用,只需构建一个应用版本并将其发布到虚拟化后的不同类型平台上即可。
3.加速应用部署
采用服务器虚拟化技术只需输入激活配置参数、拷贝虚拟机、启动虚拟机、激活虚拟机即可完成部署,大大缩短了部署时间,免除人工干预,降低了部署成本。
4.提高服务可用性
用户可以方便地备份虚拟机,在进行虚拟机动态迁移后,可以方便的恢复备份,或者在其他物理机上运行备份,大大提高了服务的可用性。
5.提升资源利用率
通过服务器虚拟化的整合,提高了CPU、内存、存储、网络等设备的利用率,同时保证原有服务的可用性,使其安全性及性能不受影响。
6.动态调度资源
在服务器虚拟化技术中,数据中心从传统的单一服务器变成了统一的资源池,用户可以即时地调整虚拟机资源,同时数据中心管理程序和数据中心管理员可以灵活根据虚拟机内部资源使用情况灵活分配调整给虚拟机的资源。
7.降低能源消耗
通过减少运行的物理服务器数量,减少CPU以外各单元的耗电量,达到节能减排的目的。

KVM简介

KVM,基于内核的虚拟机(英语:Kernel-based Virtual Machine,缩写为 KVM),是一种用于Linux内核中的虚拟化基础设施,可以将Linux内核转化为一个hypervisor。KVM在2007年2月被导入Linux 2.6.20核心中,以可加载核心模块的方式被移植到FreeBSD及illumos上。

KVM在具备Intel VT或AMD-V功能的x86平台上运行。它也被移植到S/390,PowerPC与IA-64平台上。在Linux内核3.9版中,加入ARM架构的支持。

KVM目前由Red Hat等厂商开发,对CentOS/Fedora/RHEL等Red Hat系发行版支持极佳。

关于KVM

  1. KVM是开源软件,全称是kernel-based virtual machine(基于内核的虚拟机)。

  2. 是x86架构且硬件支持虚拟化技术(如 intel VT 或 AMD-V)的Linux全虚拟化解决方案。

  3. 它包含一个为处理器提供底层虚拟化 可加载的核心模块kvm.ko(kvm-intel.ko或kvm-AMD.ko)。

  4. KVM还需要一个经过修改的QEMU软件(qemu-kvm),作为虚拟机上层控制和界面。

  5. KVM能在不改变linux或windows镜像的情况下同时运行多个虚拟机,(它的意思是多个虚拟机使用同一镜像)并为每一个虚拟机配置个性化硬件环境(网卡、磁盘、图形适配器……)同时KVM还能够使用ksm技术帮助宿主服务器节约内存。

  6. 在主流的Linux内核,如2.6.20以上的内核均已包含了KVM核心。

关于Virtual Machine Manager

电脑运算中,红帽公司的Virtual Machine Manager是一个虚拟机管理员,可以让用户管理多个虚拟机。
基于内核的虚拟机libvirt与Virtual Machine Manager。 
Virtual Machine Manager可以让用户:

创建、编辑、引导或停止虚拟机。
查看并控制每个虚拟机的控制台。
查看每部虚拟机的性能以及使用率。
查看每部正在运行中的虚拟机以及主控端的即时性能及使用率信息。
不论是在本机或远程,皆可使用KVM、Xen、QEMU。

KVM虚拟化基础_KVM虚拟化_03

其他虚拟化软件

???? Xen
  Xen是一个开放源代码虚拟机监视器,由XenProject开发。它打算在单个计算机上运行多达128个有完全功能的操作系统。
  在旧(无虚拟硬件)的处理器上执行Xen,操作系统必须进行显式地修改(“移植”)以在Xen上运行(但是提供对用户应用的兼容性)。这使得Xen无需特殊硬件支持,就能达到高性能的虚拟化。

???? QEMU
  QEMU是一套由Fabrice Bellard所编写的模拟处理器的自由软件。它与Bochs,PearPC近似,但其具有某些后两者所不具备的特性,如高速度及跨平台的特性。经由KVM(早期为kqemu加速器,现在kqemu已被KVM取代)这个开源的加速器,QEMU能模拟至接近真实电脑的速度。QEMU有两种主要运作模式:

  User mode模拟模式,亦即是用户模式。
  QEMU能引导那些为不同中央处理器编译的Linux程序。而Wine及Dosemu是其主要目标。

  System mode模拟模式,亦即是系统模式。
  QEMU能模拟整个电脑系统,包括中央处理器及其他周边设备。它使得为系统源代码进行测试及除错工作变得容易。其亦能用来在一部主机上模拟数部不同虚拟电脑。

KVM部署与使用

系统环境说明

[root@kvm01 ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)
[root@kvm01 ~]# uname -r
3.10.0-693.el7.x86_64
[root@kvm01 ~]# sestatus
SELinux status:                 disabled
[root@kvm01 ~]# systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
[root@kvm01 ~]# hostname -I
10.0.0.11
# kvm主机内存不能低于4GB

安装KVM虚拟化软件

安装依赖包(可以使用本地yum源)

[root@kvm01 ~]# yum install libvirt* virt-* qemu-kvm* -y

# libvirt   # 作用:虚拟机的管理软件
# virt      # virt-install virt-clone   作用:虚拟机的安装和克隆
# qemu-kvm  # qemu-img 作用:复制管理虚拟机的磁盘  管理虚拟机磁盘

启动服务

[root@kvm01 ~]# systemctl start libvirtd.service
[root@kvm01 ~]# systemctl status libvirtd.servic

安装VNC软件(windows版):

下载vnc软件方法,tightvnc官网:  http://www.tightvnc.com

  VNC软件,用于VNC(Virtual Network Computing),为一种使用RFB协议的显示屏画面分享及远程操作软件。此软件借由网络,可发送键盘与鼠标的动作及即时的显示屏画面。
  VNC与操作系统无关,因此可跨平台使用,例如可用Windows连接到某Linux的电脑,反之亦同。甚至在没有安装客户端程序的电脑中,只要有支持JAVA的浏览器,也可使用。
  安装VNC时,使用默认安装即可,无需安装server端。(只安装客户端)

配置第一台KVM虚拟机

virt-install --virt-type kvm --os-type=linux --os-variant rhel7 \
--name centos7 --memory 1024 --vcpus 1 --disk /opt/centos2.raw,format=raw,size=10 \
--cdrom /opt/CentOS-7.4-x86_64-DVD-1708.iso --network network=default \
--graphics vnc,listen=0.0.0.0 --noautoconsole

注意:
需要先将镜像文件拷贝到 /opt/目录下。xshell下使用xftp  默认的rz sz不行
VMware需要在配置内开启虚拟化

使用参数说明

参数参数说明
--virt-type HV_TYPE要使用的管理程序名称 (kvm, qemu, xen, ...)
--os-type系统类型
--os-variant DISTRO_VARIANT在客户机上安装的操作系统,例如:'fedora18'、'rhel6'、'winxp' 等。
-n NAME, --name NAME客户机实例名称
--memory MEMORY配置客户机虚拟内存大小
--vcpus VCPUS配置客户机虚拟 CPU(vcpu) 数量。
--disk DISK指定存储的各种选项。
-cdrom CDROM光驱安装介质
-w NETWORK, --network NETWORK配置客户机网络接口。
--graphics GRAPHICS配置客户机显示设置。
虚拟化平台选项:
-v, --hvm这个客户机应该是一个全虚拟化客户机
-p, --paravirt这个客户机应该是一个半虚拟化客户机
--container这个客户机应该是一个容器客户机
--virt-type HV_TYPE要使用的管理程序名称 (kvm, qemu, xen, ...)
--arch ARCH模拟 CPU 架构
--machine MACHINE机器类型为仿真类型
其它选项:
--noautoconsole不要自动尝试连接到客户端控制台
--autostart主机启动时自动启动域。
--noreboot安装完成后不启动客户机。
以上信息通过 " virt-install --help " 获得。

在启动的同时使用vnc连接
KVM虚拟化基础_KVM虚拟化_04

然后开始安装系统

KVM虚拟机管理操作

virsh命令常用参数总结

参数参数说明
基础操作
list查看虚拟机列表,列出域
start启动虚拟机,开始一个(以前定义的)非活跃的域
shutdown关闭虚拟机,关闭一个域
destroy(危险)强制关闭虚拟机,销毁(停止)域
vncdisplay查询虚拟机vnc端口号
reboot重启(有些版本不支持)
配置管理操作
dumpxml导出主机配置信息
undefine删除主机
define导入主机配置
domrename对虚拟机进行重命名
挂起与恢复
suspend挂起虚拟机
resume恢复虚拟机
自启动管理
autostart虚拟机开机启动
autostart --disable取消虚拟机开机启动
以上参数通过  “virsh  --help” 获得。

KVM虚拟机配置文件位置

[root@kvm ~]# ll /etc/libvirt/qemu/centos7.xml

修改KVM配置文件

修改KVM虚拟机配置的方法

[root@kvm ~]# virsh edit centos7

使用该命令修改可以对文件进行语法校验。(如crontable -e)

备份与恢复

备份虚拟机配置(关机时备份):

[root@kvm ~]# virsh dumpxml centos7  > centos7.xml

删除虚拟机配置

# 查看
[root@kvm ~]# virsh list --all 
 Id    名称                         状态
----------------------------------------------------
 -     centos7                        关闭
 # 删除
[root@kvm ~]# virsh undefine centos7 
域 centos7 已经被取消定义
[root@kvm ~]# virsh list --all 
 Id    名称                         状态
----------------------------------------------------

导入虚拟机

# 导入  备份(dumpxml)
[root@kvm ~]# virsh define centos7.xml 
定义域 centos7(从 centos7-off.xml)
# 查看
[root@kvm ~]# virsh list --all 
 Id    名称                         状态
----------------------------------------------------
 -     centos7                        关闭

修改虚拟机名称

# 重命名
[root@kvm ~]# virsh domrename centos7 web01
Domain successfully renamed
# 查看
[root@kvm ~]# virsh list
 Id    名称                         状态
----------------------------------------------------
 9     web01                          关闭

虚拟机挂起与恢复

挂起虚拟机

[root@kvm01 ~]# virsh suspend centos7
域 centos7 被挂起
# 查看状态
[root@kvm01 ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 9     centos7                          暂停

恢复虚拟机

[root@kvm01 ~]# virsh resume centos7
域 centos7 被重新恢复

查询虚拟机vnc端口

[root@kvm ~]# virsh vncdisplay centos7 
:0  
# :0 即 为 5900 端口,以此类推 :1为5901 。

开机自启动设置

# 设置 libvirtd 服务开机自启动。
[root@kvm ~]# systemctl enabled libvirtd.service 
enabled

设置宿主机开机虚拟机在其他

[root@kvm ~]# virsh autostart centos7 
域 nfsnobody标记为自动开始
# 实质为创建软连接
[root@kvm ~]# ll /etc/libvirt/qemu/autostart/centos7.xml 
lrwxrwxrwx 1 root root 27 1月  22 12:17 /etc/libvirt/qemu/autostart/centos7.xml -> /etc/libvirt/qemu/centos7.xml

取消开机自启动

[root@kvm ~]# virsh autostart --disable centos7 
域 centos7取消标记为自动开始

kvm虚拟机console登录

CentOS 7.X 版本console登录

配置console登录

在centos7虚拟机内操作(该操作仅限centos7):

[root@kvm01 ~]# grubby --update-kernel=ALL --args="console=ttyS0,115200n8"
[root@kvm01 ~]# reboot
# 115200n8:能显示虚拟机的启动过程

重启完成后,使用virsh console 连接虚拟机。

[root@kvm ~]# virsh console centos7 
连接到域 centos7
换码符为 ^]
CentOS Linux 7 (Core)
Kernel 3.10.0-327.el7.x86_64 on an x86_64

centos7 login: root
Password: 
Last login: Mon Jan 22 12:24:48 from 192.168.122.1
[root@centos7 ~]# w
 12:26:11 up 0 min,  1 user,  load average: 0.09, 0.03, 0.01
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     ttyS0                     12:26    3.00s  0.02s  0.01s w

CentOS 6.X 版本console登录

使用virsh console连接CentOS 6虚拟主机方法:

  安装一台centos6的kvm虚拟机

virt-install --virt-type kvm --os-type=linux --os-variant rhel6 \
--name centos6 --memory 1124 --vcpus 1 \
--disk /data/centos6/centos6.raw,format=raw,size=10 \
--cdrom /data/CentOS-6.9-x86_64-bin-DVD1.iso \
--network network=default --graphics vnc,listen=0.0.0.0,port=5901 \
--noautoconsole

新安装一台虚拟机后,是无法通过virsh console 命令连入虚拟机中的,这时我们需要开启虚拟机的console功能。

以下操作都在虚拟机中进行
1、添加ttyS0的许可,允许root登陆

[root@centos6 ~]# echo "ttyS0" >> /etc/securetty

2、编辑/etc/grub.conf中加入console=ttyS0
在该文件的第16行。kernel选项后添加

[root@centos6 ~]# sed -i '/\tkernel/s#.*#& console=ttyS0#g' /etc/grub.conf
[root@centos6 ~]# sync  # 同步配置到 /boot/grub/grub.conf
[root@centos6 ~]# cat -n  /etc/grub.conf 
     1    # grub.conf generated by anaconda
     2    #
     3    # Note that you do not have to rerun grub after making changes to this file
     4    # NOTICE:  You have a /boot partition.  This means that
     5    #          all kernel and initrd paths are relative to /boot/, eg.
     6    #          root (hd0,0)
     7    #          kernel /vmlinuz-version ro root=/dev/vda3
     8    #          initrd /initrd-[generic-]version.img
     9    #boot=/dev/vda
    10    default=0
    11    timeout=5
    12    splashimage=(hd0,0)/grub/splash.xpm.gz
    13    hiddenmenu
    14    title CentOS 6 (2.6.32-696.el6.x86_64)
    15        root (hd0,0)
    16        kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=48532582-c271-4c0a-b55f-395fe16cd8aa rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet console=ttyS0
    17        initrd /initramfs-2.6.32-696.el6.x86_64.img

3、编辑/etc/inittab
  在最后一行加入内容 S0:12345:respawn:/sbin/agetty ttyS0 115200

[root@centos6 ~]# echo 'S0:12345:respawn:/sbin/agetty ttyS0 115200' >>/etc/inittab

4、以上操作都完成后,重启虚拟机

[root@centos6 ~]# reboot

以下操作在kvm宿主机上执行
1、检查虚拟机的状态

[root@kvm ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 11    nfsnobody                          running
 21    nfsnobody6                          running

2、进行连接测试

[root@kvm ~]# virsh console nfsnobody6 
连接到域 nfsnobody6
换码符为 ^]  # 注:退出virsh console连接的方法,使用组合键Ctrl+]即可

CentOS release 6.9 (Final)
Kernel 2.6.32-696.el6.x86_64 on an x86_64

nfsnobody6 login: root
Password: 
Last login: Mon Jan 22 05:44:25 on ttyS0
[root@nfsnobody6 ~]# who
root     ttyS0        2018-01-22 05:50
# 登陆成功,查看登陆接口为之前设置的ttyS0

KVM虚拟机磁盘、快照与克隆

磁盘管理

KVM qcow2、raw、vmdk等镜像格式说明:

http://blog.csdn.net/zhengmx100/article/details/53887162
# 创建一块qcow2的虚拟硬盘(仅测试使用,无实际意义)
[root@kvm01 data]# qemu-img create -f qcow2 nfsnobody.qcow2 2G

查看当前虚拟机硬盘信息

[root@kvm01 ~]# qemu-img info /data/nfsnobody.raw 
image: /data/nfsnobody.raw
file format: raw
virtual size: 10G (10737418240 bytes)
disk size: 1.1G

raw转qcow2格式:

# 参数说明
[root@kvm01 data]# qemu-img  --help |grep convert 
qemu-img convert [-f fmt] [-O output_fmt] filename  output_filename

转换原有磁盘格式

[root@kvm01 data]# qemu-img convert -f raw -O qcow2 nfsnobody.raw nfsnobody.qcow2

修改nfsnobody 虚拟机配置文件

[root@kvm01 data]# virsh edit nfsnobody 
修改前:修改后:

删除原磁盘文件

[root@kvm01 data]# \rm nfsnobody.raw

启动虚拟机

[root@kvm01 data]# virsh start nfsnobody 

[root@kvm01 data]# virsh list --all 
 Id    名称                         状态
----------------------------------------------------
 22    nfsnobody                          running

KVM链接克隆

链接克隆脚本

#!/bin/bash
# kvm link clone scripts  
# user nfsnobody 
# blog: https://www.nfsnobody.com
# 2018-02-06
###

# init
if [ $# -ne 2 ]
  then 
    echo "Usage: $0 OLD_VMNAME NEW_VMNAME"
    exit 2
fi
LOG=/var/log/messages
old_vm=$1
new_vm=$2
new_xml="/tmp/${new_vm}.xml"
. /etc/init.d/functions

# dump old xmlfile 
virsh dumpxml $old_vm >$new_xml
old_disk=`awk -F "'" '/source file/{print $2}'  $new_xml`
tmp_dir=`dirname $old_disk`
new_disk=${tmp_dir}/${new_vm}.qcow2

# make link disk 
qemu-img create -f qcow2 -b $old_disk $new_disk &>> $LOG

# make over xml info 
sed -i '/uuid/d' $new_xml
sed -i '/mac address/d' $new_xml
sed -i '2s#'$old_vm'#'$new_vm'#' $new_xml
sed -i "s#$old_disk#$new_disk#g" $new_xml
sed -i '/source mode/d' $new_xml

# import new xml file
virsh define $new_xml &>> $LOG

# start new vm 
virsh start $new_vm &>> $LOG
if [ $? -eq 0 ]
  then 
   action "vmhost $new_vm start"  /bin/true 
else 
   action "vmhost $new_vm start"  /bin/false
   echo "log info : $LOG"
fi

# END
\rm $new_xml

说明:

手动克隆

第一步:复制虚拟磁盘文件
第二步:修改xml配置文件
  1)name
  2)uuid
  3)虚拟磁盘存储路径
  4)mac地址

脚本实现思路

1) 备份old_vm的配置文件,并重定向生成一个新的虚拟机配置文件
2)取出old_vm的磁盘路径
3)创建新的链接磁盘文件
4) 修改xml配置文件
5) 导入新虚拟机
6)启动测试