运维工程师必备技能:部署KVM虚拟化平台

技能目标:

· 了解KVM原理

· 学会部署虚拟化架构

· 学会创建虚拟机实例

1.1 案例分析

1.1.1 案例概述

公司部分Linux服务器利用率不高,为充分利用这些Linux服务器,可以部署KVM,在物理机上运行多个业务系统。例如,在运行Nginx的服务器上部署KVM,然后在虚拟机上运行Tomcat。

1.1.2 案例前置知识点

KVM自Linux 2.6.20版本后就直接整合到Linux内核,它依托CPU虚拟化指令集(如Intel-VT、AMD-V)实现高性能的虚拟化支持。由于与Linux内核高度整合,因此在性能、安全性、兼容性、稳定性上都有很好的表现。

图1.1简单描绘了KVM虚拟化架构,在KVM环境中运行的每一个虚拟化操作系统都将表现为单个独立的系统进程。因此它可以很方便地与Linux系统中的安全模块进行整合(SELinux),可以灵活地实现资源的管理及分配。

运维工程师必备技能:部署KVM虚拟化平台

图1.1 KVM虚拟化架构

1. KVM原理简介

广义的KVM实际上包含两部分,一部分是基于LINUX内核支持的KVM内核模块,另一部分就是经过简化和修改的Qemu。

KVM内核模块模拟处理器和内存以支持虚拟机的运行,Qemu主要处理I/O以及为用户提供一个用户空间工具来进行虚拟机的管理。两者相互结合,相辅相成,构成了一个完整的虚拟化平台。

请注意:Qemu本身并不是KVM的一部分,Qemu是一套完整的虚拟化解决方案,是纯软件实现虚拟化,包括处理器虚拟化、内存虚拟化以及各种虚拟设备的模拟,但因为是纯软件模拟出来的,所以Qemu的性能比较低。

2. KVM运行时的三种模式

客户模式:可以简单理解成客户机在操作系统运行中的模式,客户模式又分为内核模式和用户模式。

· 用户模式:为用户提供虚拟机管理的用户空间工具以及代表用户执行I/O,Qemu运行在这个模式之下。

· 内核模式:模拟CPU以及内存,实现客户模式的切换,处理从客户模式的退出。KVM内核模块运行在这个模式下。

三种模式层次关系图如图1.2所示。

运维工程师必备技能:部署KVM虚拟化平台

图1.2 三种模式层次关系图

3. KVM工作原理

用户模式的Qemu利用接口libkvm通过ioctl系统调用进入内核模式。KVMDriver为虚拟机创建虚拟CPU和虚拟内存,然后执行VMLAUNCH指令进入客户模式,装载Guest OS并运行。Guest OS运行过程中如果发生中断或者影子缺页等异常,将暂停Guest OS的运行并保存当前上下文退出到内核模式来处理这些异常。内核模式处理这些异常时如果不需要I/O则处理完成后重新进入客户模式,如果需要I/O则进入到用户模式,由Qemu来处理I/O,处理完成后进入内核模式,再进入客户模式。工作原理如图1.3所示

运维工程师必备技能:部署KVM虚拟化平台

图1.3 工作原理图

1.1.3 案例环境

1.本案例实验环境

采用centos7.3操作系统,并开启虚拟化支持,案例环境如表1-1所示。

运维工程师必备技能:部署KVM虚拟化平台

表1-1 KVM虚拟化

2. 案例需求

1)安装KVM。

2)完成基本的KVM操作管理(创建、启动、停止等)。

3)完成KVM命令行操作虚拟机。

3. 案例实现思路

1)准备kvm安装环境。

2)安装kvm。

3)设置kvm网络。

4)创建kvm存储池并安装虚拟机。

5)命令行操作虚拟机。

1.2 搭建KVM虚拟化平台

1.2.1 准备kvm虚拟化环境

1.安装方式

1)在CentOS的系统光盘镜像中,已经提供了安装KVM所需软件。通过部署基于光盘镜像的本地yum源,直接使用yum安装所需软件即可,安装KVM所需软件具体包含以下几个。

yum groupinstall -y “GNOME Desktop” //安装GNOME桌面环境

yum -y install qemu-kvm //KVM模块

yum -y install qemu-kvm-tools //KVM调试工具,可不安装

yum -y install virt-install //构建虚拟机的命令行工具

yum -y install qemu-img //qemu组件,创建磁盘、启动虚拟机等

yum -y install bridge-utils //网络支持工具

yum -y install libvirt //虚拟机管理工具

yum -y install virt-manager //图形界面管理虚拟机

2)验证。重启系统后,查看CPU是否支持虚拟化,对于Intel的服务器可以通过以下命令查看,只要有输出就说明CPU支持虚拟化;AMD服务器可用cat/proc/cpuinfo | grep smv命令查看。

[root@bdqn ~]# cat /proc/cpuinfo | grep vmx

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 ida arat epb pln pts dtherm tpr_shadow vnmi ept vpid tsc_adjust

检查KVM模块是否安装:

[root@bdqn ~]# lsmod | grep kvm

kvm_intel 170181 0

kvm 554609 1 kvm_intel

irqbypass 13503 1 kvm

注意:在使用yum安装完桌面后执行ln -sf /lib/systemd/system/graphical.target /etc/systemd/system/default.target 命令,将系统的默认运行target更改为graphical.targe。重启后系统将进入图形化界面。若不执行上述命令更改系统的默认运行target,重启时可能报错。

2)开启服务

安装完成后还需要开启libvirtd服务,以开启相关支持。

[root@bdqn ~]# systemctl start libvirtd

[root@bdqn ~]# systemctl enable libvirtd

2.设置KVM网络

宿主服务器安装完成KVM,首先要设定网络,在libvirt中运行KVM网络有两种方法:NAT和Bridge,默认是NAT。

关于两种模式的说明:

1)用户模式,即NAT方式,这种方式是默认网络,数据包由NAT方式通过主机的接口进行传送,可以访问外网,但是无法从外部访问虚拟机网络。

2)桥接模式,这种模式允许虚拟机像一台独立的主机一样拥有网络,外部的机器可以直接访问到虚拟机内部,但需要网卡支持,一般有线网卡都支持。

这里以Bridge(桥接)为例。

注:宿主机IP地址为192.168.10.1

[root@bdqn ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33

TYPE=Ethernet

BOOTPROTO=none

DEFROUTE=yes

PEERDNS=yes

PEERROUTES=yes

IPV4_FAILURE_FATAL=no

IPV6INIT=yes

IPV6_AUTOCONF=yes

IPV6_DEFROUTE=yes

IPV6_PEERDNS=yes

IPV6_PEERROUTES=yes

IPV6_FAILURE_FATAL=no

IPV6_ADDR_GEN_MODE=stable-privacy

NAME=ens33

UUID=58b0765c-572c-4f63-89a7-1bf720b1fab0

DEVICE=ens33

ONBOOT=yes

BRIDGE=br0

[root@bdqn ~]#

[root@bdqn ~]# vim /etc/sysconfig/network-scripts/ifcfg-br0

TYPE=Bridge

BOOTPROTO=static

DEFROUTE=yes

PEERDNS=yes

PEERROUTES=yes

IPV4_FAILURE_FATAL=no

IPV6INIT=yes

IPV6_AUTOCONF=yes

IPV6_DEFROUTE=yes

IPV6_PEERDNS=yes

IPV6_PEERROUTES=yes

IPV6_FAILURE_FATAL=no

IPV6_ADDR_GEN_MODE=stable-privacy

NAME=br0

DEVICE=br0

ONBOOT=yes

IPADDR=192.168.10.1

NETMASK=255.255.255.0

GATEWAY=192.168.10.254

重启network服务:

[root@bdqn ~]# /etc/init.d/network restart

Restarting network (via systemctl): [ OK ]

确认IP地址信息:

[root@bdqn ~]# ifconfig

br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500

inet 192.168.10.1 netmask 255.255.255.0 broadcast 192.168.10.255

inet6 fe80::3362:2f44:ebd1:62e prefixlen 64 scopeid 0x20<link>

ether 00:0c:29:3a:81:cc txqueuelen 1000 (Ethernet)

RX packets 3 bytes 234 (234.0 B)

RX errors 0 dropped 0 overruns 0 frame 0

TX packets 19 bytes 2613 (2.5 KiB)

TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500

ether 00:0c:29:3a:81:cc txqueuelen 1000 (Ethernet)

RX packets 200 bytes 17407 (16.9 KiB)

RX errors 0 dropped 0 overruns 0 frame 0

TX packets 184 bytes 24024 (23.4 KiB)

TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536

inet 127.0.0.1 netmask 255.0.0.0

inet6 ::1 prefixlen 128 scopeid 0x10<host>

loop txqueuelen 1 (Local Loopback)

RX packets 550 bytes 47778 (46.6 KiB)

RX errors 0 dropped 0 overruns 0 frame 0

TX packets 550 bytes 47778 (46.6 KiB)

TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500

inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255

ether 52:54:00:64:3e:58 txqueuelen 1000 (Ethernet)

RX packets 0 bytes 0 (0.0 B)

RX errors 0 dropped 0 overruns 0 frame 0

TX packets 0 bytes 0 (0.0 B)

TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

出现以上信息,说明网卡桥接成功了。

3.KVM管理

[root@bdqn ~]# virt-manager

virt-manager是基于libvirt的图像化虚拟机管理软件。请注意,不同的发行版上 virt-manager 的版本可能不同,图形界面和操作方法也可能不同。本文使用了CentOS 7.3。创建KVM虚拟机最简单的方法是通过virt-manager接口。从控制台窗口启动这个工具,以root身份输入virt-manager命令,出现如图1.4所示窗口。

运维工程师必备技能:部署KVM虚拟化平台

图1.4 虚拟机管理界面

虚拟化管理步骤如下。

1)创建存储池,双击QEMU/KVM,选择”存储”选项卡,然后单击”+”按钮新建存储池。如图1.5所示,单击”前进”按钮,根据提示输入或浏览用以设置存储目录,如/data_kvm/store,最后单击”完成”按钮即可。

运维工程师必备技能:部署KVM虚拟化平台

图1.5 创建存储池

2)以同样的操作创建一个镜像存储池,命名为bdqn_iso,目录为/data_kvm/iso即可。在安装操作系统时,我们把镜像上传到服务器目录/data_kvm/iso,如图1.6所示。

运维工程师必备技能:部署KVM虚拟化平台

图1.6 创建镜像存储池

3)创建存储卷,单击刚创建好的”bdqn”,单击对话框中”卷”右边的 “+”按钮建立一个存储卷,并设置最大容量,如图1.7所示。

运维工程师必备技能:部署KVM虚拟化平台

图1.7 创建存储卷

4)单击”完成”按钮后,回到虚拟系统管理器。右击”QEMU/KVM”,然后选择”新建”选项,在弹出的对话框中按图1.8所示选择”本地安装介质”,然后单击”前进”按钮。

单击”浏览”按钮选择镜像文件,再选择操作系统型及版本,如图1.9所示。

单击”前进”按钮,在图1.10所示的对话框中适当分配内存和CPU资源,如1核CPU、1GB内存。

单击”前进”按钮,在如图1.11所示的对话框中点选”选择或创建自定义存储”单选按钮,单击”管理”按钮选择文件,然后单击”前进”按钮。

在如图1.12所示将虚拟机名称命名为”CentOS 7.3″,并勾选话框中 的”在安装前自定义配置”复选框,单击”完成”按钮,弹出如图1.13所示的对话框。

运维工程师必备技能:部署KVM虚拟化平台

图1.12 新建虚拟机(5)

运维工程师必备技能:部署KVM虚拟化平台

图1.13 新建虚拟机(6)

在”引导选项”视图中勾选”主机引导时启动虚拟机”复选框,这样在物理宿主机启动后,这个VM也会启动,最后单击”应用”按钮,如图1.14所示。

运维工程师必备技能:部署KVM虚拟化平台

图1.14 新建虚拟机(7)

最后单击”开始安装”按钮即可,整个虚拟化配置过程完成。下面就是安装操作系统的工作,和平时安装Linux系统一样,如图1.15所示。

运维工程师必备技能:部署KVM虚拟化平台

图1.15 CentOS安装界面

1.2.2 使用KVM命令集管理虚拟机

1. 安装Linux虚拟机

安装过程同上一案例,使用Xshell远程控制bdqn主机。

2. KVM基本功能管理

1)查看命令帮助

[root@bdqn ~]# virsh -h

…… //省略输出内容

2)查看KVM的配置文件存放目录(test01.xml是虚拟机系统实例的配置文件)

[root@bdqn ~]# ls /etc/libvirt/qemu/

autostart networks test01.xml

3)查看虚拟机状态

[root@bdqn ~]# virsh list –all

Id 名称 状态

—————————————————-

4 test01 running

4)虚拟机关机与开机

[root@bdqn ~]# virsh shutdown test01

[root@bdqn ~]# virsh start test01

5)强制实例系统关闭电源

[root@bdqn ~]# virsh destroy test01

6)通过配置文件启动虚拟机系统实例

[root@bdqn ~]# virsh create /etc/libvirt/qemu/test01.xml

[root@bdqn ~]# virsh list –all

Id 名称 状态

—————————————————-

7 test01 running

7)挂起虚拟机

[root@bdqn ~]# virsh suspend test01

查看虚拟机状态:

[root@bdqn ~]# virsh list –all

Id 名称 状态

—————————————————-

7 test01 暂停

8)恢复虚拟机

[root@bdqn ~]# virsh resume test01

[root@bdqn ~]# virsh list –all

Id 名称 状态

—————————————————-

7 test01 running

9)配置虚拟机实例伴随宿主机自动启动

[root@bdqn ~]# virsh autostart test01

上述命令将创建/etc/libvirt/qemu/autostart/目录,目录内容为开机自动启动的系统。

10)导出虚拟机配置

[root@bdqn ~]# virsh dumpxml test01 > /etc/libvirt/qemu/test02.xml

11)虚拟机的删除与添加

删除虚拟机:

[root@bdqn ~]# virsh shutdown test01

[root@bdqn ~]# virsh undefine test01

查看删除结果,test01的配置文件被删除,但是磁盘文件不会被删除。

[root@bdqn ~]# ls /etc/libvirt/qemu/

autostart networks test02.xml

通过virsh list –all查看不到test01的信息,说明此虚拟机被删除。

[root@bdqn ~]# virsh list –all

Id 名称 状态

———————————-

通过备份的配置文件重新定义虚拟机:

[root@bdqn ~]# cd /etc/libvirt/qemu

[root@bdqn qemu]# mv test02.xml test01.xml

重新定义虚拟机:

[root@bdqn qemu]# virsh define test01.xml

查看虚拟机信息:

[root@bdqn qemu]# virsh list –all

Id 名称 状态

—————————————————-

– test01 关闭

12)修改虚拟机配置信息(用来修改系统内存大小、磁盘文件等信息)

直接通过vim命令修改:

[root@bdqn ~]# vim /etc/libvirt/qemu/test01.xml

通过virsh命令修改:

[root@bdqn ~]# virsh edit test01

3. KVM文件管理

通过文件管理可以直接查看、修改、复制虚拟机的内部文件。例如,当系统因为配置问题无法启动时,可以直接修改虚拟机的文件。虚拟机磁盘文件有raw、 qcow2与qed格式, KVM虚拟机默认使用qcow2格式。这里介绍本地YUM安装libguestfs-tools后产生的命令行工具,这个工具可以直接读取qcow2格式的磁盘文件。

1)查看当前磁盘格式:

[root@bdqn ~]# qemu-img info /data_kvm/store/test01.qcow2

image: /data_kvm/store/test01.qcow2

file format: qcow2

virtual size: 10G (10737418240 bytes)

disk size: 1.3G

cluster_size: 65536

Format specific information:

compat: 1.1

lazy refcounts: true

如果虚拟机磁盘文件不是qcow2格式,可以通过qemu-img命令转换磁盘文件格式,如执行以下操作可以将test01虚拟机raw格式磁盘转换至qcow2格式。

[root@bdqn ~]# virsh shutdown test01

[root@bdqn ~]# qemu-img convert -f raw -O qcow2 /data_kvm/store/test01.img /data_kvm/store/test01.qcow2

执行转换磁盘格式的命令后还需要修改test01的xml配置文件中磁盘的类型与磁盘文件名。

[root@bdqn ~]# virsh edit test01

…… //省略部分内容

<disk type=’file’ device=’disk’>

<driver name=’qemu’ type=’qcow2‘ cache=’none’/>

<source file=’/data_KVM/store/test01.qcow2‘/>

<target dev=’vda’ bus=’virtio’/>

<address type=’pci’ domain=’0x0000′ bus=’0x00′ slot=’0x04′ function=’0x0’/>

</disk>

…… //省略部分内容

2)virt-cat命令,类似于cat命令。使用这个命令需要安装libguestfs-tools-c工具包

[root@bdqn ~]# yum -y install libguestfs-tools-c

[root@bdqn ~]# virt-cat -a /data_kvm/store/test01.qcow2 /etc/sysconfig/grub

GRUB_TIMEOUT=5

GRUB_DISTRIBUTOR=”$(sed ‘s, release .*$,,g’ /etc/system-release)”

GRUB_DEFAULT=saved

GRUB_DISABLE_SUBMENU=true

GRUB_TERMINAL_OUTPUT=”console”

GRUB_CMDLINE_LINUX=”crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet”

GRUB_DISABLE_RECOVERY=”true”

3)virt-edit命令,用于编辑文件,用法与vim基本一致。

[root@bdqn ~]# virt-edit -a /data_kvm/store/test01.qcow2 /etc/resolv.conf

nameserver 8.8.8.8

4)virt-df命令用于查看虚拟机磁盘信息。

[root@bdqn ~]# virt-df -h test01

文件系统 大小 已用空间 可用空间 使用百分比%

test01:/dev/sda1 1014M 106M 908M 11%

test01:/dev/cl/root 8.0G 917M 7.1G 12%

4. 虚拟机克隆

1)查看虚拟机状态

[root@bdqn ~]# virsh list –all

Id 名称 状态

———————————-

– test01 关闭

2)从test01克隆test02

[root@bdqn ~]# virt-clone -o test01 -n test02 -f /data_kvm/store/test02.qcow2

3)查看虚拟机状态

[root@bdqn ~]# virsh list –all

Id 名称 状态

———————————-

– test01 关闭

– test02 关闭

4)启动虚拟机

[root@bdqn ~]# virsh start test02

5. 虚拟机快照

KVM虚拟机要使用镜像功能,磁盘格式必须为qcow2。

下面介绍KVM虚拟机快照备份的过程。

1)对test01创建快照

[root@bdqn ~]# virsh snapshot-create test01

已生成域快照 1503494464

2)查看虚拟机快照版本信息

[root@bdqn ~]# virsh snapshot-current test01

<domainsnapshot>

<name>1503494464</name> //快照版本号

<state>shutoff</state>

…… //省略部分输出

3)查看快照信息

[root@bdqn ~]# virsh snapshot-list test01

名称 生成时间 状态

————————————————————

1503494464 2017-08-23 09:21:04 -0400 shutoff

4)创建新快照

[root@bdqn ~]# virsh snapshot-create test01

已生成域快照 1503494564

5)查看快照信息

[root@bdqn ~]# virsh snapshot-list test01

名称 生成时间 状态

————————————————————

1503494464 2017-08-23 09:21:04 -0400 shutoff

1503494564 2017-08-23 09:22:44 -0400 shutoff

6)恢复虚拟机状态至1503494464

[root@bdqn ~]# virsh snapshot-revert test01 1503494464

7)查看虚拟机快照版本信息

[root@bdqn ~]# virsh snapshot-current test01

<domainsnapshot>

<name>1503494464</name> //快照版本号

<state>shutoff</state>

…… //省略部分输出

8)删除快照

[root@bdqn ~]# virsh snapshot-delete test01 1503494464

已删除域快照 1503494464

原文始发于:运维工程师必备技能:部署KVM虚拟化平台