一、安装kvm虚拟化

#如果本身是图形化界面可忽略
[root@kvm-test ~]# yum -y groupinstall "GNOME Desktop"          #安装GNOME桌面环境
[root@kvm-test ~]# yum -y install qemu-kvm           # KVM模块
[root@kvm-test ~]# yum -y install qemu-kvm-tools      # KVM调试工具,可不安装
[root@kvm-test ~]# yum -y install virt-install           # 构建虚拟机的命令行工具
[root@kvm-test ~]# yum -y install qemu-img         # qemu组件,创建磁盘、启动虚拟机等
[root@kvm-test ~]# yum -y install bridge-utils          # 网络支持工具
[root@kvm-test ~]# yum -y install libvirt           # 虚拟机管理工具 
[root@kvm-test ~]# yum -y install virt-manager           # 图形界面管理虚拟机
[root@kvm-test ~]# yum -y install libguestfs-tools          # 用来管理虚拟机磁盘格式
#如果本身就是图形化界面可忽略下一步
[root@kvm-test ~]# ls -sf /lib/systemd/system/graphical.target /etc/systemd/system/default.target
#将系统默认运行的target更改为graphical.target,若不执行该命令,重启时可能会报错。

2、安装完毕后,需重启系统,执行下面命令对系统进行检查:

[root@kvm-test ~]# cat /proc/cpuinfo | grep vmx
#查看Intel的CPU是否支持虚拟化,若是AMD的CPU,需 “cat /proc/cpuinfo | grep  smv”
[root@kvm-test ~]# lsmod | grep kvm             #检查KVM模块是否安装
kvm_intel             188688  0 
kvm                   636965  1 kvm_intel
irqbypass              13503  1 kvm
[root@kvm-test ~]# systemctl start libvirtd          # 启动libvirtd服务
[root@kvm-test ~]# systemctl enable libvirtd        # 设置该服务为开机自启

3、在命令行模式中创建虚拟机(图形化创建虚拟机可参考博文:图形化桌面新建虚拟机

[root@kvm-test ~]# mkdir -p /kvm/{iso,disk}
[root@kvm-test ~]# ls /kvm/iso/            #准备要安装的虚拟机操作系统文件
CentOS-7-x86_64-DVD-1611.iso
[root@kvm-test ~]# qemu-img create -f raw /kvm/disk/test1.raw 10G             # 创建虚拟机磁盘
Formatting '/kvm/disk/test1.raw', fmt=raw size=10737418240 
[root@kvm-test ~]# virt-install --os-type=linux --os-variant centos7.0 --name test1 --ram 1024 --vcpus 1 --disk /kvm/disk/test1.raw,format=raw,size=10 --location /kvm/iso/CentOS-7-x86_64-DVD-1611.iso --network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
Starting install...
Retrieving file .treeinfo...                                                    |  366 B  00:00:00     
Retrieving file vmlinuz...                                                      | 5.1 MB  00:00:00     
Retrieving file initrd.img...                                                   |  41 MB  00:00:00     
Domain installation still in progress. You can reconnect to 
the console to complete the installation process.
#根据上面的提示打开图形化控制台
[root@kvm-test ~]# virt-manager 

输入打开控制台的命令后,便会弹出以下窗口:
Centos 7之KVM虚拟化基础管理
单击“打开”后,会出现以下界面,和我们自己安装系统一样了(自行操作即可):
Centos 7之KVM虚拟化基础管理
至此,命令行创建虚拟机就完成了,接下来使用手动更改配置文件的方式,克隆test1,生成新的虚拟机test2(在我博文前面的那个博文链接中有专用于克隆的命令工具的使用方法,这里只是为了来了解虚拟机的配置文件)
二、手动更改配置文件的方式,克隆web01,生成新的虚拟机web02

[root@kvm-test ~]# virsh list --all           #确保要克隆的虚拟机在关闭状态下
 Id    Name                           State
----------------------------------------------------
 -     test1                          shut off

[root@kvm-test ~]# cd /kvm/disk/         # 切换至虚拟机的虚拟磁盘存放目录
[root@kvm-test disk]# cp test1.raw test2.raw             # 将要克隆的虚拟机磁盘复制一份,并更改名称
[root@kvm-test disk]# cd /etc/libvirt/qemu/           # 切换至KVM虚拟机配置文件的目录
[root@kvm-test qemu]# ls           # 查看当前目录下的文件
networks  test1.xml
[root@kvm-test qemu]# virsh dumpxml test1 > ./test2.xml     # 将test1的配置文件使用dumpxml工具进行备份为当前目录下的test1.xml
[root@kvm-test qemu]# ls          # 确保已经备份成功
networks  test1.xml  test2.xml
[root@kvm-test qemu]# vim test2.xml            
<domain type='kvm'>
  <name>test2</name>           # 更改名字为test2
  <uuid>3f90fb61-b84c-4946-885f-e2827275e107</uuid>            # 删除UUID这行配置,防止冲突
  <memory unit='KiB'>1048576</memory>
           .............#省略部分内容
  <devices>                 # 定位到此标签
    <emulator>/usr/libexec/qemu-kvm</emulator>
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw'/>
      <source file='/kvm/disk/test2.raw'/>      #将这里的路径更改为刚才使用cp命令复制的test2.raw文件
      <target dev='vda' bus='virtio'/>
[root@kvm-test qemu]# virsh define test2.xml       # 定义此配置文件
#(可以理解为载入该虚拟机,此时,需要注意当前的工作路径)
Domain test2 defined from test2.xml
[root@kvm-test qemu]# virsh list --all             # 查看是否克隆成功
 Id    Name                           State
----------------------------------------------------
 -     test1                          shut off
 -     test2                          shut off
# OK!查看到了,可以自行运行test2,测试是否运行正常。
[root@kvm-test qemu]# virsh start test2        # 启动test2
Domain test2 started

[root@kvm-test qemu]# virsh list --all           # 可以看到已经成功启动
 Id    Name                           State
----------------------------------------------------
 2     test2                          running
 -     test1                          shut off

三、将web01加入开机自启,与web02对比有何异同

[root@kvm-test ~]# virsh dominfo test1          # 查看指定虚拟机的信息
Id:             -
Name:           test1
UUID:           3f90fb61-b84c-4946-885f-e2827275e107
OS Type:        hvm
State:          shut off
CPU(s):         1
Max memory:     1048576 KiB
Used memory:    1048576 KiB
Persistent:     yes
Autostart:      disable          # 默认此处为禁用状态
Managed save:   no
Security model: none
Security DOI:   0
[root@kvm-test ~]# virsh autostart test1        # 设置test1为开机自启
Domain test1 marked as autostarted

[root@kvm-test ~]# virsh dominfo test1          # 查看是否为开机自启
Id:             -
Name:           test1
UUID:           3f90fb61-b84c-4946-885f-e2827275e107
OS Type:        hvm
State:          shut off
CPU(s):         1
Max memory:     1048576 KiB
Used memory:    1048576 KiB
Persistent:     yes
Autostart:      enable         # OK  已经开启
Managed save:   no
Security model: none
Security DOI:   0
[root@kvm-test ~]# virsh dominfo test2      # 查看test2是否为开机自启
Id:             2
Name:           test2
UUID:           375ec9f8-83ba-4c8f-bdcd-cd91bcc327f7
OS Type:        hvm
State:          running
CPU(s):         1
CPU time:       35.0s
Max memory:     1048576 KiB
Used memory:    1048576 KiB
Persistent:     yes
Autostart:      disable          # 目前是禁用状态
Managed save:   no
Security model: none
Security DOI:   0

#此时可以重启宿主机,然后查看虚拟机的状态(需要确保libvirtd服务的状态为开机自启,否则会出现问题)
[root@kvm-test ~]# reboot           # 重启
[root@kvm-test ~]# virsh list        # 重启后查看正在运行的虚拟机
 Id    Name                           State
----------------------------------------------------
 1     test1                          running
#此时,只有test1处于运行状态,因为它设置了开机自启,在libvirtd服务开机自启的前提下,它会随着宿主机的启动而启动

四、远程连接虚拟机的两种方法
(1)使用VNC软件
VNC的安装比较简单,这里就不脏各位老板的眼了

[root@kvm-test ~]# virsh vncdisplay test1
:0
    <!--
查看出的结果是“:0”,解释如下:
“:0”表示监听5900端口;
“:1”表示监听5901端口;
以此类推......
                        -->

打开vnc进行连接(注意防火墙相关配置):
Centos 7之KVM虚拟化基础管理
Centos 7之KVM虚拟化基础管理
为了方便接下来使用console进行连接,此时需要调整虚拟机(test1)的内核参数,如下:

[root@test1 ~]# grubby --update-kernel=ALL --args="console=ttyS0"    #在虚拟机中执行此命令
[root@test1 ~]# init 6     #重启此虚拟机,以便更改生效

(2)使用console登陆web02
在KVM宿主机上执行以下命令即可登陆成功(前提是在使用vnc登陆时已经更改了web02的内核参数)

[root@kvm-test ~]# virsh console test1
Connected to domain test1
Escape character is ^]
#敲一下回车

CentOS Linux 7 (Core)
Kernel 3.10.0-514.el7.x86_64 on an x86_64

test1 login: root                           # 输入test1 的用户及密码即可登录
密码:
Last login: Tue Jul 28 11:31:28 on tty1
[root@test1 ~]# 

五、使用默认的NAT网络类型使test1可以ping通外网
这里就进行ping百度的测试,务必保证KVM宿主机可以ping通百度。
(1)检查相关配置

[root@kvm-test ~]# virsh net-list --all           # 检查当前的网络设置
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 default              active     yes           yes

[root@kvm-test ~]# ifconfig        # 检查当前网络接口
virbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 52:54:00:87:53:59  txqueuelen 1000  (Ethernet)
#virbr0是由宿主机虚拟机支持模块安装时产生的虚拟网络接口,
也是一个switch和bridge,负责把内容分发到各虚拟机。
virbr0是一个桥接器,接收所有到网络192.168.122.*的内容。
从下面命令可以验证:  
[root@kvm-test ~]# brctl show
bridge name bridge id       STP enabled interfaces
virbr0      8000.525400875359   yes     virbr0-nic
                            vnet0
[root@kvm-test ~]# route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    100    0        0 ens33
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
192.168.171.0   0.0.0.0         255.255.255.0   U     100    0        0 ens33

(2)接下来开始配置nat网络

[root@kvm-test ~]# virsh net-define /usr/share/libvirt/networks/default.xml 
#如果没有上面指定的文件,可以使用该命令定义一个虚拟网络,也可以修改该文件,创建自己的虚拟网络
[root@kvm-test ~]# virsh net-autostart default          # 网络default标记为自动启动
[root@kvm-test ~]# virsh net-start default           # 启动网络,若已启动,此处会报错 
[root@kvm-test ~]# vim /etc/sysctl.conf            # 修改此配置文件
                                            ............省略部分内容
net.ipv4.ip_forward=1       #在文件末尾加入该行,以便允许IP转发
[root@kvm-test ~]# sysctl -p
[root@kvm-test ~]# vim /etc/libvirt/qemu/test1.xml 
    <interface type='network'>
      <mac address='52:54:00:40:21:38'/>
      <source network='default'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>
#定位“interface”关键字,确定有上述内容

(3)连接到虚拟机web02,更改网卡的配置:

[root@test1 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0

Centos 7之KVM虚拟化基础管理
更改网卡后,保存退出。

[root@test1 ~]# systemctl restart network

进行ping测试:
Centos 7之KVM虚拟化基础管理
若要使用静态IP,配置文件可更改如下(更改完成后自行重启网卡,可以增加DNS配置):
Centos 7之KVM虚拟化基础管理
六、KVM虚拟机管理命令汇总

[root@kvm ~]# virsh start 虚拟机名称   #开启虚拟机
[root@kvm ~]# virsh list    #仅查看运行的虚拟机列表
[root@kvm ~]# virsh list --all       #查看所有虚拟机列表
[root@kvm ~]# virsh shutdown 虚拟机名称    #正常的关闭虚拟机
[root@kvm ~]# virsh destroy    虚拟机名称   #强制关闭虚拟机(类似于拔电源)
[root@kvm ~]# virsh dumpxml 虚拟机名称 > /root/test01-dum.xml             #虚拟机备份
[root@kvm ~]# virsh undefine 虚拟机名称  #删除虚拟机(注意:取消定义之后,磁盘文件需要手动删除)
[root@kvm ~]# virsh define 备份的.xml虚拟机文件    #还原虚拟机
[root@kvm ~]# virsh edit 虚拟机名称  #编辑虚拟机的配置文件
[root@kvm ~]# virsh domrename 原名字 要更改的名字 
#  如:([root@kvm ~]# virsh domrename test01 test03)    更改虚拟机名称
[root@kvm qemu]# virsh dominfo test02           #查看虚拟机的详细信息
[root@kvm ~]# virsh autostart test02              #设置虚拟机为开机自启
[root@kvm ~]# virsh autostart --disable test02    #取消开机自启
[root@kvm ~]# virsh vncdisplay test02           #查看对应的VNC连接端口号;默认第一个端口号为:5900(用“:0”表示)
[root@kvm ~]# virsh suspend test02         #挂起虚拟机
[root@kvm ~]# virsh resume test02               #取消挂起虚拟机
[root@kvm ~]# virsh console test02           #console登陆虚拟机
[root@kvm ~]# qemu-img info /kvm/disk/test01.raw      #查看虚拟机的磁盘信息
[root@kvm disk]# qemu-img create test.raw 2G        #创建虚拟机使用的磁盘
[root@kvm disk]# qemu-img create -f qcow2 21.qcow2 2G      #创建qcow2格式的虚拟机磁盘
[root@kvm disk]# qemu-img convert -f raw -O qcow2 test.raw test.qcow2   #将test.raw磁盘格式raw转换为qcow2
[root@kvm qemu]# virsh snapshot-create test02        #创建虚拟机快照
[root@kvm disk]# virsh snapshot-list test02             #查看虚拟机快照
[root@kvm disk]# virsh snapshot-revert test02 1570692304     #恢复快照
[root@kvm disk]# virt-clone --auto-clone -o test01  -n 指定要克隆的名字(可选)        #自动克隆虚拟机
[root@kvm disk]# virt-clone -o test01 -n test04 -f /kvm/disk/test04.qcow2    #手动克隆
#上述都是属于完整克隆。
[root@kvm disk]# qemu-img create -f qcow2 -b test01.qcow2 lktest01.qcow2
# -f:指定要克隆为的磁盘格式;
# -b:指定要转换的源文件及目标文件
#上述命令是在克隆虚拟机的磁盘文件

RAW:裸格式。占用空间较大,性能比较好,但不支持快照功能。
qcow:copy on write(写时复制机制)。
qcow2:占用空间较小,性能相比较RAW稍差,,但它支持快照功能。