虚拟化

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

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

虚拟化分类

虚拟化技术可分为:全虚拟化和半虚拟化。

  • 全虚拟化:最流行的虚拟化方法使用名为Hypervisor的一种软件,在虚拟服务器和底层硬件之间建立一个抽象层。VMware和微软的VirtualPC是代表该方法的两个商用产品,而基于核心的虚拟机(KVM)是面向Linux系统的开源产品。Hypervisor可以捕获CPU指令,为指令访问硬件控制器和外设充当中介。因而,完全虚拟化技术几乎能让任何一款操作系统不用改动就能安装到虚拟服务器上,而它们不知道自己运行在虚拟化环境下。主要缺点是,Hypervisor 给处理器带来的负荷会很大。
  • 半虚拟化:完全虚拟化是处理器密集型技术,因为它要求Hypervisor管理各个虚拟服务器,并让它们彼此独立。减轻这种负担的一种方法就是,改动客户端操作系统,让它以为自己运行在虚拟环境下,能够与Hypervisor 协同工作。这种方法就叫准虚拟化(para-virtualization)Xen。它是开源准虚拟化技术的一个例子。操作系统作为虚拟服务器在Xen hypervisor上运行之前,它必须在核心层面进行某些改变。因此,Xen适用于BSD、Linux、Solaris及其他开源操作系统,但不适合像Windows这些专有的操作系统进行虚拟化处理,因为它们无法改动。准虚拟化技术的优点是性能高,经过准虚拟化处理的服务器可与Hypervisor协同工作,其响应能力几乎不亚于未经过虚拟化处理的服务器。准虚拟化与完全虚拟化相比优点明显,以至于微软和VMware都在开发这项技术,以完善各自的产品。

虚拟化架构

Hypervisor直接安装在物理机上,多个虚拟机在 Hypervisor 上运行。Hypervisor 实现方式一般是一个特殊定制的Linux系统。Xen和VMWare的ESXi 都属于这个类型。(Type-I型)

虚拟化(KVM)_linux

物理机上首先安装常规的操作系统,比如 RedHat、Ubuntu和Windows。Hypervisor作为OS上的一个程序模块运行,并对管理虚拟机进行管理。KVM、VirtualBox和 VMWare Workstation 都属于这个类型。(Type-II型)

虚拟化(KVM)_xml_02

KVM

KVM(Kernel-Based Virtual Machines)是一个基于Linux内核的虚拟化技术, 可以直接将Linux内核转换为Hypervisor(系统管理程序)从而使得Linux内核能够直接管理虚拟机, 直接调用Linux内核中的内存管理、进程管理子系统来管理虚拟机。KVM的虚拟化需要硬件支持(如Intel VT技术或者AMD V技术)。是基于硬件的完全虚拟化。

KVM架构

虚拟化(KVM)_xml_03

KVM的安装搭建

基础环境

​ Centos7-1804系统,内存至少设置成2 GB,在“硬件”选项卡中单击“处理器”, 勾选虚拟化引擎,并且添加一块50G大小的新硬盘

检查cpu参数

启动虚拟机,查看以下内容

[root@kvm ~]#  grep -Ei 'vmx|svm' /proc/cpuinfo
//vmx为英特尔的cpu;svm为AMD的cpu。
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw arat npt svm_lock nrip_save vmcb_clean flushbyasid decodeassists fsgsbase bmi1 avx2 smep bmi2 rdseed adx smap clflushopt xsaveopt xsavec xsaves
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl tsc_reliable nonstop_tsc eagerfpu pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw arat npt svm_lock nrip_save vmcb_clean flushbyasid decodeassists fsgsbase bmi1 avx2 smep bmi2 rdseed adx smap clflushopt xsaveopt xsavec xsaves
挂载新硬盘
[root@kvm ~]# lsblk 
NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda               8:0    0   20G  0 disk 
├─sda1            8:1    0  500M  0 part /boot
└─sda2            8:2    0 19.5G  0 part 
  ├─centos-root 253:0    0 17.5G  0 lvm  /
  └─centos-swap 253:1    0    2G  0 lvm  [SWAP]
sdb               8:16   0   50G  0 disk
sr0              11:0    1    4G  0 rom  
[root@kvm~]# mkfs.ext4 /dev/sdb
······
Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done   //格式化完成
[root@kvm ~]# blkid /dev/sdb   //查看磁盘信息
/dev/sdb: UUID="68535868-50f7-44a7-b180-504efe67298a" TYPE="ext4" 
[root@kvm ~]# mkdir /kvm_data     //创建挂载目录
[root@kvm ~]# mount /dev/sdb /kvm_data/      //进行挂载
[root@tomcat ~]# cat /etc/fstab       //编辑自动挂载文件,启动自动挂载
#
# /etc/fstab
# Created by anaconda on Wed Sep 29 07:20:13 2021
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=581fc9d2-b7c9-41e3-9ab2-17996ea601fa /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
/dev/sdb     /kvm_data                          ext4    defaults        0 0
关闭Selinux和防火墙
[root@kvm ~]# systemctl stop firewalld &&systemctl disable firewalld
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
Removed symlink /etc/systemd/system/basic.target.wants/firewalld.service.
[root@kvm ~]# setenforce 0
[root@kvm ~]# cat /etc/selinux/config    //关闭selinux
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled 
//修改这一位置的内容
# SELINUXTYPE= can take one of three two values:
#     targeted - Targeted processes are protected,
#     minimum - Modification of targeted policy. Only selected processes are protected. 
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
[root@kvm ~]# getenforce 
Disabled
安装KVM
[root@kvm ~]# yum install -y  virt-*  libvirt  bridge-utils qemu-img
创建桥接网卡
[root@kvm ~]# cd /etc/sysconfig/network-scripts/
[root@kvm network-scripts]# cp ifcfg-eno16777736 ifcfg-br0
//配置文件名称根据网卡命名规则命名,ip a可以查看

修改桥接网卡ifcfg-br0的内容,命令如下:

[root@kvm network-scripts]# cat ifcfg-br0 
TYPE=Bridge
BOOTPROTO=none
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.200.10
NETMASK=255.255.255.0
GATEWAY=192.168.200.2
DNS1=114.114.114.114
DNS2=8.8.8.8
[root@kvm network-scripts]# cat ifcfg-eno16777736
TYPE=Ethernet
BOOTPROTO=none
NAME=eno16777736
DEVICE=eno16777736
ONBOOT=yes
BRIDGE=br0
[root@kvm network-scripts]# service network restart    //重启网络服务
启动libvirtd服务

检查kvm模块是否加载:

[root@tomcat ~]# lsmod | grep kvm
kvm_amd                65035  0 
kvm                   525259  1 kvm_amd

启动libvirtd并检查是否成功启动:

[root@tomcat ~]# ps -ef |grep libvirt
root       1200      1  0 19:04 ?        00:00:00 /usr/sbin/libvirtd
nobody     1634      1  0 19:04 ?        00:00:00 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper
root       1635   1634  0 19:04 ?        00:00:00 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/libexec/libvirt_leaseshelper
root       1917   1719  0 19:21 pts/0    00:00:00 grep --color=auto libvirt
[root@kvm ~]# brctl show      //查看两块网卡
bridge name	bridge id		STP enabled	interfaces
br0		8000.000c29cb607e	no		eno16777736
virbr0		8000.000000000000	yes		
KVM安装Centos7虚拟机

上传Centos7-1804镜像到/tmp下:

[root@tomcat ~]# ll /tmp/
total 4365316
-rw-r--r--. 1 qemu qemu 4470079488 Sep  2 22:17 CentOS-7-x86_64-DVD-1804.iso

使用virt-install进行CentOS 7的安装:

[root@tomcat ~]# virt-install --name=test --memory=512,maxmemory=1024 --vcpus=1,maxvcpus=2 --os-type=linux --os-variant=rhel7 --location=/tmp/CentOS-7-x86_64-DVD-1804.iso --disk path=/kvm_data/test.img,size=10 --bridge=br0 --graphics=none --console=pty,target_type=serial --extra-args="console=tty0 console=ttyS0"

命令解释:

  • --name:指定虚拟机的名称。
  • --memory:指定分配给虚拟机的内存资源大小。
  • maxmemory:指定可调节的最大内存资源大小,因为KVM支持热调整虚拟机的资源。
  • --vcpus:指定分配给虚拟机的CPU核心数量。
  • maxvcpus:指定可调节的最大CPU核心数量。
  • --os-type:指定虚拟机安装的操作系统类型。
  • --os-variant:指定系统的发行版本。
  • --location:指定ISO镜像文件所在的路径,支持使用网络资源路径,也就是说可以使用URL。
  • --disk path:指定虚拟硬盘所存放的路径及名称,size则是指定该硬盘的可用大小,单位是G。
  • --bridge:指定使用哪一个桥接网卡,也就是说使用桥接的网络模式。
  • --graphics:指定是否开启图形。
  • --console:定义终端的属性,target_type 则是定义终端的类型。
  • --extra-args:定义终端额外的参数。

配置虚拟机基础设置,带[!]基本都是需要配置的

Starting installer, one moment...
anaconda 21.48.22.134-1 for CentOS 7 started.
 * installation log files are stored in /tmp during the installation
 * shell is available on TTY2
 * when reporting a bug add logs from /tmp as separate text/plain attachments
23:30:35 Not asking for VNC because we don't have a network
================================================================================
================================================================================
Installation

 1) [x] Language settings                 2) [!] Time settings
        (English (United States))                (Timezone is not set.)
 3) [!] Installation source               4) [!] Software selection
        (Processing...)                          (Processing...)
 5) [!] Installation Destination          6) [x] Kdump
        (No disks selected)                      (Kdump is enabled)
 7) [ ] Network configuration             8) [!] Root password
        (Not connected)                          (Password is not set.)
 9) [!] User creation
        (No user will be created)
  Please make your choice from above ['q' to quit | 'b' to begin installation |
  'r' to refresh]: 

配置2和5还有8就可以开始输入b开始安装虚拟机了,安装成功后输入root和设置的密码进入

    Installation complete.  Press return to quit 
//按回车
……………………
CentOS Linux 7 (Core)
Kernel 3.10.0-327.el7.x86_64 on an x86_64
localhost login: root
Password: 123456
[root@localhost ~]# 
//按“Ctrl+]”键,退出终端,回到宿主机。
[root@kvm ~]# 

KVM基本管理

常用命令

查看虚拟机列表,只能看到正在运行的虚拟机:

[root@kvm ~]# virsh list
 Id    Name                           State
----------------------------------------------------
 2     test                           running

进入指定的虚拟机:

[root@kvm ~]# virsh console test
Connected to domain test
Escape character is ^]
//如果迟迟未动敲下回车就ok,下面就是正常登录时需要输入的用户名密码
CentOS Linux 7 (Core)
Kernel 3.10.0-327.el7.x86_64 on an x86_64

localhost login: 
//如果报错error: operation failed: Active console session exists for this domain,将进程kill再进入

其他常用命令:

virsh shutdown test 
//关闭虚拟机
virsh start test 
//开启虚拟机
virsh destroy test
//类似stop,这个是强制停止
virsh undefine test
//彻底销毁虚拟机,会删除虚拟机配置文件,virsh list --all就看不到
virsh autostart test
//宿主机开机该虚拟机也开机
virsh autostart --disable test
//解除开机启动
virsh suspend test
//挂起
virsh resume test
//恢复
克隆虚拟机

克隆虚拟机之前,要关闭虚拟机

[root@kvm ~]# virt-clone  --original test --name test02 --file /kvm_data/test02.img
Allocating 'test02.img'                        3% 
[=                    ]  20 MB/s | 365 MB  00:08:23 ETA
//开始克隆
[root@kvm ~]# virt-clone  --original test --name test02 --file 
/kvm_data/test02.img
Allocating 	'test02.img'         |  10 GB  00:00:35     
Clone 'test02' created successfully.    //克隆完成且成功
  • --original:指定克隆源虚拟机。
  • --name:指定克隆后的虚拟机名字。
  • --file:指定目标虚拟机的虚拟磁盘文件。

查看虚拟机配置文件/etc/libvirt/qemu/,看是否增加test02.xml文件:

[root@kvm ~]# ls /etc/libvirt/qemu/
networks  test02.xml  test.xml

启动克隆的虚拟机:

[root@kvm ~]# virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     test                           shut off
 -     test02                         shut off

[root@kvm ~]# virsh start test02
Domain test02 started
快照管理

创建快照:

[root@kvm ~]# virsh snapshot-create test
Domain snapshot 1634514681 created

查看test.img信息,同时会查看到快照列表:

[root@kvm ~]# qemu-img info /kvm_data/test.img 
image: /kvm_data/test.img
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 1.3G
cluster_size: 65536
Snapshot list:
ID        TAG                 VM SIZE                DATE       VM CLOCK
1         1634514681                0 2021-10-17 19:51:21   00:00:00.000
Format specific information:
    compat: 1.1
    lazy refcounts: true

列出所有快照:

[root@kvm ~]# virsh snapshot-list test
 Name                 Creation Time             State
------------------------------------------------------------
 1634514681           2021-10-17 19:51:21 -0400 shutoff

查看所有快照配置文件:

[root@kvm ~]# ls /var/lib/libvirt/qemu/snapshot/test/
1634514681.xml

恢复指定快照:

[root@kvm ~]# virsh snapshot-revert test 1634514681

删除指定快照:

[root@kvm ~]# virsh snapshot-delete test 1634514681
Domain snapshot 1634514681 deleted
迁移虚拟机

首先关闭虚拟机:

[root@kvm ~]# virsh shutdown test
Domain test is being shutdown

查看虚拟机磁盘所在目录:

[root@tomcat ~]# virsh domblklist test
Target     Source
------------------------------------------------
vda        /kvm_data/test.img
hda        -
[root@kvm ~]# virsh dumpxml test > /etc/libvirt/qemu/test03.xml 
//如果是远程机器,需要把该配置文件拷贝到远程机器上
[root@kvm ~]# rsync -av /kvm_data/test.img  /kvm_data/test03.img
//-bash: rsync: command not found则yum install -y rsync
//如果是迁移到远程,则需要把该磁盘文件拷贝到远程机器上
sending incremental file list
test.img
sent 10,742,006,844 bytes  received 35 bytes  60,179,310.25 bytes/sec
total size is 10,739,384,832  speedup is 1.00

如果迁移到本机,需要修改配置文件:

[root@kvm ~]# vim /etc/libvirt/qemu/test03.xml 
 <name>test03</name>    //修改domname: 
 <uuid>c57da9f4-5cf3-4efc-86c7-62a1d9a160a9</uuid>   //修改uuid(随便改一下数字,位数不要变)
    <disk type='file' device='disk'>
      <driver name='qemu' type='qcow2'/>
      <source file='/kvm_data/test03.img'/>    //修改磁盘路径
      <target dev='vda' bus='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
    </disk>

定义新虚拟机:

[root@kvm ~]# virsh define /etc/libvirt/qemu/test03.xml  
Domain test03 defined from /etc/libvirt/qemu/test03.xml

查看虚拟机列表,会发现新迁移的虚拟机test03:

[root@kvm ~]#  virsh list --all
 Id    Name                           State
----------------------------------------------------
 -     test                           shut off
 -     test03                         shut off