KVM虚拟化

1、什么是虚拟化?

虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。

虚拟化使用软件的方法重新定义划分IT资源,可以实现IT资源的动态分配、灵活调度、跨域共享,提高IT资源利用率,使IT资源能够真正成为社会基础设施,服务于各行各业中灵活多变的应用需求。

2、为什么要用虚拟化?

服务器的资源很多,同一台服务器上运行的服务数量却有限制,因为运行的服务越多,服务与服务之间产生冲突的几率就越大;所以在服务器的系统中避免安装过多的服务,但是这样就浪费了服务器大量的资源。使用虚拟化技术就可以通过模拟计算机的硬件,来实现在同一台计算机上同时运行多个不同的操作系统,操作系统与操作系统之间隔离,服务之间就不会产生冲突,从而提高资源利用率。

虚拟化的好处:服务的安全隔离性,提高资源利用率,绿色环保,企业节省成本,机房迁移变得简单(操作系统系统和硬件解耦),业务快速部署。

3、KVM实现虚拟化

3.1 安装和程序介绍

KVM:Kernel-based Virtual Machine
libvirt:虚拟化的管理软件
virt,virt-install,virt-clone:虚拟机的安装和克隆
qemu-kvm,qemu-img:管理虚拟机和虚拟机磁盘

虚拟化软件:libvirt虚拟化管理软件。
qemu:软件纯模拟,全虚拟化软件,性能差,兼容性好,能跑各种操作系统。
xen:半虚拟化软件,性能好,兼容性差,需要使用专门修改之后的内核。
kvm:硬件辅助虚拟化,基于内核,兼容性好,虚拟操作系统不需要使用专门的内核。

#安装KVM虚拟化程序
[root@kvm ~]# yum -y install libvirt* virt-* qemu-*

#启动服务
[root@kvm ~]# systemctl start libvirtd
[root@kvm ~]# systemctl status libvirtd

#关闭防火墙
[root@kvm ~]# iptables -F
[root@kvm ~]# systemctl stop firewalld ebtables
[root@kvm ~]# systemctl disable firewalld ebtables
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

#物理机安装VNC用来连接虚拟机
    TightVNC 或者 VNC viewer软件

#准备好一个镜像,放到系统中

#使用创建一台Centos虚拟机
[root@kvm ~]# virt-install --virt-type kvm --os-type=linux --os-variant rhel7 --name centos7 --memory 1024 --vcpus 1 --disk /opt/centos7.raw,format=raw,size=10 --cdrom /opt/centos7.iso --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole

#磁盘的两种格式
raw        不支持做快照,性能好
qcow2      支持快照


#创建完虚拟机使用VNC进行连接,连接前使用netstat或者ss命令查看,虚拟机监听端口号
#虚拟机开启后会产生qemu-kvm的进程,查看此进程所监听的端口号,然后使用宿主机的IP加端口即可连接
[root@kvm ~]# netstat -anltup | grep "qemu"
tcp        0      0 0.0.0.0:5900            0.0.0.0:*               LISTEN      23549/qemu-kvm

#连接成功后,安装Centos操作系统,安装完成即可使用

3.2 KVM虚拟机管理命令

  • 虚拟机的开启和关闭
#KVM虚拟机virsh日常管理和配置
list        列表
start       开机
shutdown    关机
destroy     断电关机

#list查看虚拟机列表
#virsh list 查看正在运行的虚拟机
[root@kvm ~]# virsh list
 Id    名称                         状态
----------------------------------------------------

#virsh list --all 查看所有虚拟机
[root@kvm ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 2     centos7                        shut off

#start开启虚拟机
#virsh start centos7 开启centos7虚拟机
[root@kvm ~]# virsh start centos7
Domain centos7 started

#查看虚拟机状态已经开启
[root@kvm ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 3     centos7                        running

#shutdown关闭虚拟机
#virsh shutdown centos7 关闭centos7虚拟机
[root@kvm ~]# virsh shutdown centos7
Domain centos7 is being shutdown

#查看虚拟机状态已经关闭
[root@kvm ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 -     centos7                        shut off

#destroy断电关机
#先开启centos7虚拟机
[root@kvm ~]# virsh start centos7
Domain centos7 started

#virsh destroy centos7 断电关机
[root@kvm ~]# virsh destroy centos7
Domain centos7 destroyed

#查看虚拟机状态已经关闭
[root@kvm ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 -     centos7                        shut off
  • 虚拟机导出和导入

KVM创建的虚拟机配置文件存放目录为:/etc/libvirt/qemu/ ;
dumpxml 命令可以导出虚拟机配置文件。

#dumpxml导出虚拟机配置文件
[root@kvm ~]# virsh dumpxml centos7 > /root/centos7.xml
[root@kvm ~]# ls
anaconda-ks.cfg  centos7.xml

#前面已经导出了虚拟机配置文件,我们可以复制一份其他虚拟机的磁盘文件,可以根据这两个文件导入一台虚拟机
#define导入虚拟机,导入之前确保虚拟机的名称,uuid,磁盘文件不冲突
#virsh define /root/centos7.xml 导入centos7虚拟机
[root@kvm ~]# virsh define /root/centos7.xml
Domain centos7 defined from /root/centos7.xml

#查看虚拟机centos7导入成功,/etc/libvirt/qemu/ 目录下会多一个导入的虚拟机的配置文件
[root@kvm ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 -     centos7                        shut off
 -     centos7-1                      shut off

#在导入导出时,虚拟机磁盘的位置至关重要,当虚拟机磁盘的位置发生改变后,需要更改虚拟机配置文件指定位置
#edit 修改虚拟机配置文件,使用此命令会修改配置文件会检查语法
[root@kvm ~]# virsh edit centos7
<domain type='kvm'>
  <name>centos7</name>
  <uuid>5234ea3a-2ccf-4f89-8bb8-9d2ec52be8ec</uuid>
  <memory unit='KiB'>1048576</memory>
  <currentMemory unit='KiB'>1048576</currentMemory>
  <vcpu placement='static'>1</vcpu>
  <os>
    <type arch='x86_64' machine='pc-i440fx-rhel7.0.0'>hvm</type>
    <boot dev='hd'/>
  </os>
......
    <source file='/opt/centos7.raw'/>    //找到此行,将路径修改为磁盘文件的路径
......

#undefine删除虚拟机
#虚拟机必须处于关闭状态才能删除
[root@kvm ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 -     centos7                        shut off

#virsh undefine centos7 删除centos7虚拟机
[root@kvm ~]# virsh undefine centos7
Domain centos7 has been undefined

#查看虚拟机已经被删除,但是仅仅只是删除配置文件,磁盘文件依然存在
[root@kvm ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
  • 虚拟机重命名
#domrename虚拟机重命名
#虚拟机重命名时,虚拟机必须处于关闭状态
[root@kvm ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 -     centos7                        shut off

#virsh domrename centos7 hzz 将虚拟机centos7改名为hzz
[root@kvm ~]# virsh domrename centos7 hzz
Domain successfully renamed

#查看虚拟机,名称修改成功
[root@kvm ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 -     hzz                            shut off
  • 虚拟机挂起与恢复
#suspend虚拟机挂起
#虚拟机必须处于开启状态才能挂起
[root@kvm ~]# virsh start hzz
Domain hzz started

[root@kvm ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 6     hzz                            running

#virsh suspend hzz 挂起hzz虚拟机
[root@kvm ~]# virsh suspend hzz
Domain hzz suspended

#查看虚拟机,已经处于暂停状态
[root@kvm ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 6     hzz                            paused

#resume恢复挂起状态的虚拟机
#virsh resume hzz 恢复处于挂起状态的hzz虚拟机
[root@kvm ~]# virsh resume hzz
Domain hzz resumed

#查看虚拟机,恢复运行状态
[root@kvm ~]# virsh list --all
 Id    名称                         状态
----------------------------------------------------
 6     hzz                            running
  • 虚拟机端口号查询
#当有多台虚拟机时,不同的虚拟机会使用不同的端口号来提供服务
#当一台虚拟机关闭之后再重启,端口号就不一定是原来的端口号,所以需要进行查询

#vncdisplay查看虚拟机VNC端口号,虚拟机必须处于运行状态
#virsh vncdisplay hzz 查看hzz虚拟机的端口号
[root@kvm ~]# virsh vncdisplay hzz
:0

#查询出来的端口号是短格式,我们可以直接使用这种短格式的端口号进行连接虚拟机