KVM虚拟化基础

关于虚拟化

什么是虚拟化

在计算机技术中,虚拟化(技术)或虚拟技术(英语:Virtualization)是一种资源管理技术,是将计算机的各类实体资源(CPU、内存、磁盘空间、网络适配器等),予以抽象、转换后呈现出来并可供分区、组合为一个或多个电脑配置环境。

由此,打破实体结构间的不可切割的障碍,使用户能够比本来的配置更好的方式来应用这些电脑硬件资源。这些资源的新虚拟部分是不受现有资源的架设方式,地域或物理配置所限制。linux

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

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

为何用虚拟化

同一台物理机运行多个不一样版本应用软件
硬件依赖性较低和便于数据迁移

windows

虚拟化技术的优点

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

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系发行版支持极佳。
bash

关于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。


其余虚拟化软件

🍪 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虚拟机管理操做

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功能。

如下操做都在虚拟机中进行
一、添加ttyS0的许可,容许root登录

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

二、编辑/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

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

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

四、以上操做都完成后,重启虚拟机

[root@centos6 ~]# reboot

如下操做在kvm宿主机上执行
一、检查虚拟机的状态

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

二、进行链接测试

[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 qcow二、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 
修改前:
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw'/>
      <source file='/data/nfsnobody.raw'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>
修改后:
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/data/nfsnobody.qcow2'/>
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>

删除原磁盘文件

[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)启动测试
相关文章
相关标签/搜索