虚拟化(KVM)
任务1 虚拟化介绍
1. 简介
虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率
虚拟化使社会基础设施,服务于各行各业中灵活多变的应用需求。用软件的方法重新定义划分IT资源,可以实现IT资源的动态分配、灵活调度、跨域共享,提高IT资源利用率,使IT资源能够真正成为
2. 虚拟化分类
虚拟化技术可分为:全虚拟化和半虚拟化。
l 全虚拟化:最流行的虚拟化方法使用名为Hypervisor的一种软件,在虚拟服务器和底层硬件之间建立一个抽象层。Hypervisor可以捕获CPU指令,为指令访问硬件控制器和外设充当中介。因而,完全虚拟化技术几乎能让任何一款操作系统不用改动就能安装到虚拟服务器上,而它们不知道自己运行在虚拟化环境下。主要缺点是,Hypervisor 给处理器带来的负荷会很大。
l 半虚拟化:完全虚拟化是处理器密集型技术,因为它要求Hypervisor管理各个虚拟服务器,并让它们彼此独立。减轻这种负担的一种方法就是,改动客户端操作系统,修改guestos内核,让guestos可以直接使用CPU资源,而不需要翻译指令了,从而节省了资源,同时让它以为自己运行在虚拟环境下,能够与Hypervisor 协同工作。这种方法就叫准虚拟化(para-virtualization)Xen。
3. 虚拟化架构
Type-I型
Hypervisor直接安装在物理机上,多个虚拟机在 Hypervisor 上运行。Xen和VMWare的ESXi 都属于这个类型。
Type-II型
物理机上首先安装常规的操作系统,比如 RedHat、Ubuntu和Windows。Hypervisor作为OS上的一个程序模块运行,并对虚拟机进行管理。KVM、VirtualBox和 VMWare Workstation 都属于这个类型。
任务2 KVM介绍
1. 简介
KVM(Kernel-Based Virtual Machines)是一个基于Linux内核的虚拟化技术, KVM是Linux内核的一个模块,可以直接将Linux内核转换为Hypervisor(系统管理程序)从而使得Linux内核能够直接管理虚拟机, 直接调用Linux内核中的内存管理、进程管理子系统来管理虚拟机。
KVM的虚拟化需要硬件支持(如Intel VT技术或者AMD V技术)。是基于硬件的完全虚拟化。
KVM是完全开源的,RedHat基于KVM的虚拟化解决方案叫做RHEV
KVM在Linux操作系统里面以进程的形式出现,由标准的Linux调度程序进行调度,这使得KVM能够使用Linux内核的已有功能
只有一个KVM内核模块还不能实现虚拟化的全部功能,就好比操作系统只有内核还不能成为一个完整的操作系统一样
QEMU是一个开源的虚拟化软件,纯软件,可以虚拟化所以的硬件,性能不强
KVM基于QEMU开发了一个能够运行在用户空间的工具QEMU-KVM
磁盘、网络设备等都是通过QEMU-KVM这个工具模拟出来的
KVM和QEMU-KVM通信是通过/dev/kvm实现的
libvirt是用来管理KVM虚拟机的API,其命令为virsh
2. 架构

任务3 安装KVM
1. 调整虚拟机
修改虚拟机内存,至少设置成2 GB,双击“编辑虚拟机设置”按钮,如下图所示:

将虚拟机的内存修改为“2048”,如图所示:

在“硬件”选项卡中单击“处理器”, 在虚拟化引擎中勾选如红框内所示选项,如下图所示:

接下来,我们添加硬盘,单击“添加”,如下图所示:

然后选择硬盘,单击“下一步”按钮,如下图所示:
 
选择“SCSI”,单击“下一步”按钮,如下图所示:
 
选中“创建新虚拟磁盘”选项,单击“下一步”按钮,如下图所示:
 
将最大磁盘大小修改为“50”,然后点击“下一步”按钮,如下图所示:
 
单击“完成”按钮,磁盘添加完成。如下图所示:
 
单击“确定”按钮,如下图所示:
 
至此,虚拟机设置完成。如图所示:

启动虚拟机
2. 检查CPU参数
启动虚拟机,我们查看以下,内存是否更改成功,命令如下:
[root@kvm ~]# free

检查CPU是否开启虚拟化支持,命令如下:
[root@kvm ~]# grep -Ei 'vmx|svm' /proc/cpuinfo

如果显示为空,就要检查你虚拟机设置,是否打“√”,如图:

3. 挂载新磁盘
使用lsblk命令,检查虚拟机是否新增一块50 GB的磁盘,命令如下:
[root@kvm ~]# lsblk

我们可以看到确实新增了一块磁盘名为sdb。
接下来格式化这块磁盘,格式化成ext4格式,命令如下:
[root@kvm ~]# mkfs.ext4 /dev/sdb

[root@kvm ~]# blkid /dev/sdb
//blkid+磁盘:查看磁盘信息

格式化完成后,我们挂载磁盘,先创建挂载目录/kvm_data,然后进行挂载,命令如下:
[root@kvm ~]# mkdir /kvm_data
[root@kvm ~]# mount /dev/sdb /kvm_data/
这种方式挂载,重启虚拟机后,需要再次重新挂载,我们为了方便开机后可以自动挂载,编写/etc/fstab文件,添加文件最末一行,命令如下:
[root@kvm ~]# vi /etc/fstab

[root@kvm ~]# cat /etc/fstab

4. 关闭防火墙和selinux
关闭防火墙并设置开机不自启,命令如下:
[root@kvm ~]# systemctl stop firewalld
[root@kvm ~]# systemctl disable firewalld

关闭SELinux,编辑/etc/selinux/config,将enforcing修改为disabled,命令如下:
[root@kvm ~]# vi /etc/selinux/config
[root@kvm ~]# cat /etc/selinux/config

 
修改完成后,重启虚拟机,使其生效,使用getenforce查看,命令如下:
[root@kvm ~]# getenforce

5. 安装KVM
上述操作完成后,我们使用Yum进行安装KVM,命令如下:
[root@kvm ~]# yum install -y virt-* libvirt bridge-utils qemu-img
任务4 启动KVM
1. 配置网卡
增加桥接网卡ifcfg-br0,命令如下:
[root@kvm ~]# cd /etc/sysconfig/network-scripts/
[root@kvm network-scripts]# cp ifcfg-ens33 ifcfg-br0
//ifcfg-ens33为配置IP的网卡,你的网卡可能与我的不同

 
修改桥接网卡ifcfg-br0的内容,命令如下:
[root@kvm network-scripts]# vi ifcfg-br0
[root@kvm network-scripts]# cat ifcfg-br0

修改NAT网卡ifcfg-ens33,内容如下:
[root@kvm network-scripts]# vi ifcfg-ens33
[root@kvm network-scripts]# cat ifcfg-ens33

修改完成网卡内容后,重新启动网卡服务并查看网卡信息,命令如下:
[root@kvm network-scripts]# service network restart

[root@kvm network-scripts]# ifconfig
 
可以清楚的看到br0网卡出现并且带有IP,而以前的eno16777736网卡则没有IP。网卡配置完成
2. 启动libvirtd服务
首先检查KVM模块是否加载,命令如下(lsmod命令用于显示已载入系统的模块):
[root@kvm network-scripts]# lsmod|grep kvm

启动libvirtd并检查是否成功启动,命令如下:
[root@kvm network-scripts]# systemctl start libvirtd
[root@kvm network-scripts]# ps -ef |grep libvirt

启动成功后,使用brctl命令可以看到两个网卡,如下代码所示:
[root@kvm ~]# cd
[root@kvm ~]# brctl show

3. 命令行安装CentOS 7
CentOS7镜像下载地址:
http://mirrors.163.com/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-2003.iso
首先,通过SCRT上传CentOS 7镜像到/tmp目录下,如果没有镜像的可以自行下载。上传后,使用ll命令查看/tmp目录下是否存在CentOS 7镜像文件,命令如下:
镜像存在,接下来使用virt-install进行CentOS 7的安装,命令如下:
[root@kvm ~]# virt-install --name=test --memory=512,maxmemory=1024
镜像存在,接下来使用virt-install进行CentOS 7的安装,命令如下:
[root@kvm ~]# virt-install --name=test --memory=512,maxmemory=1024
--vcpus=1,maxvcpus=2 --os-type=linux --os-variant=rhel7
--location=/kvm_data/CentOS-7-x86_64-DVD-2009.iso
--disk path=/kvm_data/test.img,size=10
--bridge=br0
--graphics=none
--console=pty,target_type=serial
--extra-args="console=tty0 console=ttyS0"
命令解释:
l --name:指定虚拟机的名称。
l --memory:指定分配给虚拟机的内存资源大小。
l maxmemory:指定可调节的最大内存资源大小,因为KVM支持热调整虚拟机的资源。
l --vcpus:指定分配给虚拟机的CPU核心数量。
l maxvcpus:指定可调节的最大CPU核心数量。
l --os-type:指定虚拟机安装的操作系统类型。
l --os-variant:指定系统的发行版本。
l --location:指定ISO镜像文件所在的路径,支持使用网络资源路径,也就是说可以使用URL。
l --disk path:指定虚拟硬盘所存放的路径及名称,size则是指定该硬盘的可用大小,单位是G。
l --bridge:指定使用哪一个桥接网卡,也就是说使用桥接的网络模式。
l --graphics:指定是否开启图形。
l --console:定义终端的属性,target_type 则是定义终端的类型。
l --extra-args:定义终端额外的参数。
打完上面那条命令后,等一会,就可以看见下面这段命令,这是系统基础设置,带[!]基本都是需要配置的,接下来我们开始配置“Timezone settings”,输入“2”,按Enter键,命令如下:

入2,进行时区设置
“Timezone settings”时区设置选择 5) Asia亚洲,再选择城市 65) Shanghai
 
输入完毕后,可以发现2的[!]变成了[x],证明配置完毕。

接下来我们配置“Software selection”,选择“4”,在选择“c”,因为默认就是minimalinstall,按Enter键,命令如下:

接下来我们配置“Installation Destination”,选择“3”,其余的依次选择“c”,按Enter键,命令如下:

 
接下来配置“Root password”,选择8,按Enter键,命令如下:

You have provided a weak password: The password fails the dictionary check - it
is too simplistic/systematic
Would you like to use it anyway?
//这句话的意思:你的密码太过简单,是否使用它,输入yes即可。
Please respond 'yes' or 'no': yes
配置完成,选择“b”,按Enter键后,开始安装,命令如下:

输入root 密码:

[root@localhost ~]#
//按“Ctrl+]”键,退出终端,回到宿主机。
[root@kvm ~]#

CentOS 7安装完成。
任务5 虚拟机管理
1. KVM基本管理
完成虚拟机安装,已经退回到宿主机,接下来我们来通过宿主机virsh命令进行管理刚才安装的CentOS 7虚拟机。
查看虚拟机列表,命令如下:
[root@kvm ~]# virsh list

[root@kvm ~]# virsh list --all
//查看虚拟机列表,包括未运行的虚拟机

进入指定的虚拟,命令如下:
[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:
若发生以下报错信息,命令如下:
[root@kvm ~]# virsh console test
Connected to domain test
Escape character is ^]
error: operation failed: Active console session exists for this domain
解决方式,命令如下:
[root@kvm ~]# ps -ef |grep console
root 11167 10987 0 01:55 tty1 00:00:00 virsh console test
root 16017 15750 0 10:01 pts/1 00:00:00 grep --color=auto console
[root@kvm ~]# kill -9 11167
vrish常用命令,命令如下:
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
//恢复
2. 克隆虚拟机
克隆虚拟机之前,要先关闭虚拟机,不然会提示这种错误,命令如下:
[root@kvm ~]# virt-clone --original test --name test02 --file
/kvm_data/test02.img

关闭虚拟机后,再次进行克隆,命令如下:
[root@kvm ~]# virsh shutdown test
Domain test is being shutdown

[root@kvm ~]# virt-clone --original test --name test02 --file
/kvm_data/test02.img

命令解释:
l --original:指定克隆源虚拟机。
l --name:指定克隆后的虚拟机名字。
l --file:指定目标虚拟机的虚拟磁盘文件。
查看虚拟机配置文件/etc/libvirt/qemu/,看是否增加test02.xml文件,命令如下:
[root@kvm ~]# ls /etc/libvirt/qemu/

接下来,我们启动刚刚克隆的虚拟机test02,首先查看虚拟机列表,然后启动克隆的虚拟机test02,命令如下:
[root@kvm ~]# virsh list --all //查看

[root@kvm ~]# virsh start test02 //启动

3. 快照管理
快照是在我们使用Vmware的时候,很常用的一个功能。它可以回到之前的某一状态。在KVM中RAW格式的虚拟磁盘不支持做快照,qcow2支持。
创建快照,命令如下:
[root@kvm ~]# virsh snapshot-create test

查看test.img信息,同时会查看到快照列表,命令如下:
[root@kvm ~]# qemu-img info /kvm_data/test.img

列出所有快照,命令如下:
[root@kvm ~]# virsh snapshot-list test

查看当前快照详细信息,命令如下:
[root@kvm ~]# virsh snapshot-current test

查看所有快照配置文件,命令如下:
[root@kvm ~]# ls /var/lib/libvirt/qemu/snapshot/test/

恢复指定快照,命令如下:
[root@kvm ~]# virsh snapshot-revert test 1615967702

删除指定快照,命令如下:
[root@kvm ~]# virsh snapshot-delete test 1615967702

4. 磁盘格式
查看虚拟磁盘格式,命令如下:
[root@kvm ~]# qemu-img info /kvm_data/test.img

创建2 GB的RAW格式磁盘,命令如下:
[root@kvm ~]# qemu-img create -f raw /kvm_data/test_1.img 2G

RAW格式的磁盘转换为qcow2格式,命令如下:
[root@kvm ~]# qemu-img convert -O qcow2 /kvm_data/test_1.img /kvm_data/test_1.qcow2

查看test1.img大小,命令如下:
[root@kvm ~]# ls -lh /kvm_data/test_1.img

ls -lh /kvm_data/test_1.qcow2

//可以看到qcow2文件比较小,raw文件大小和我们指定空间大小一样是2G
//raw格式的磁盘性能比qcow2要好,但是raw格式的磁盘无法做快照
将test02转成raw格式,命令如下:
[root@kvm ~]# qemu-img convert -O raw /kvm_data/test02.img /kvm_data/test02_2.img
更改磁盘格式和文件路径,然后启动test02虚拟机,命令如下:
[root@kvm ~]# virsh edit test02

查看磁盘所属用户和组,命令如下:
[root@kvm ~]# ls -l /kvm_data/

启动虚拟机test02,然后再次查看磁盘所属用户和组,命令如下:
[root@kvm ~]# virsh start test02
[root@kvm ~]# ls -l /kvm_data/

//启动后所属组变化成qemu的是test02_2.img,证明这个磁盘正在被使用
5. 磁盘扩容
我们知道,在这里磁盘一共有两种格式,一种是RAW格式,一种是qcow2格式,接下来我们分别给这两种磁盘格式进行扩容。
首先扩容RAW格式,命令如下:
[root@kvm ~]# qemu-img resize /kvm_data/test02_2.img +2G

查看test02_2.raw信息,命令如下:
[root@kvm ~]# qemu-img info /kvm_data/test02_2.img

进入虚拟机test02,使用fdisk -l查看磁盘,命令如下:
[root@kvm ~]# virsh console test02

[root@localhost ~]# fdisk -l

退出终端,关闭test02虚拟机,重新启动,然后再次进入虚拟机test02,使用fdisk -l查看磁盘,命令如下:
[root@kvm ~]# virsh destroy test02

[root@kvm ~]# virsh start test02
Domain test02 started
 
[root@kvm ~]# virsh console test02

[root@localhost ~]# fdisk -l

接下来,我们怎么使用新增加的这2 GB磁盘,那就是分区,命令如下:
[root@localhost ~]# fdisk /dev/vda

 
Partition number (3,4, default 3):
//按Enter键
First sector (20971520-25165823, default 20971520):
//按Enter键
Using default value 20971520
Last sector, +sectors or +size{K,M,G} (20971520-25165823, default 25165823):
//按Enter键

 
//保存退出并退出终端
除了对已有磁盘扩容外,还可以额外增加磁盘,命令如下:
[root@kvm ~]# qemu-img create -f raw /kvm_data/test02_3.raw 5G 

使用virsh edit编辑test02虚拟机,将新磁盘增加到test02虚拟机,命令如下
[root@kvm ~]# virsh edit test02

关闭test02虚拟机,重新启动,然后进入该虚拟机,使用fdisk -l查看磁盘,命令如下:
[root@kvm ~]# virsh destroy test02

[root@kvm ~]# virsh start test02
[root@kvm ~]# virsh console test02
[root@localhost ~]# fdisk -l

可以看到多了一块5 GB的磁盘,退出终端。
接下来,我们扩容qcow2格式的磁盘,命令如下:
[root@kvm ~]# qemu-img resize /kvm_data/test.img +2G

//若提示qemu-img: Can't resize an image which has snapshots,需要删除快照
查看test.img信息,命令如下:
[root@kvm ~]# qemu-img info /kvm_data/test.img

关闭test虚拟机,重新启动,然后再次进入虚拟机test02,使用fdisk -l查看磁盘,命令如下:
[root@kvm ~]# virsh destroy test
Domain test destroyed
[root@kvm ~]# virsh start test
Domain test started
 
[root@kvm ~]# virsh console test
[root@localhost ~]# fdisk -l

 
分区新增加的2 GB磁盘,命令如下:
[root@localhost ~]# fdisk /dev/vda

 
 
 
新增一块qcow2格式的磁盘,命令如下:
[root@kvm ~]# qemu-img create -f qcow2 /kvm_data/test_2.img 5G

使用virsh edit编辑test虚拟机,将新磁盘增加到test虚拟机,命令如下:
[root@kvm ~]# virsh edit test

[root@kvm ~]# virsh start test
Domain test started
[root@kvm ~]# virsh console test
[root@localhost ~]# fdisk -l
 
6. 调整CPU内存、网卡
查看虚拟机配置信息,命令如下:
[root@kvm ~]# virsh dominfo test

编辑虚拟机内存,命令如下:
[root@kvm ~]# virsh edit test

关闭虚拟机,重启动虚拟机,命令如下:
[root@kvm ~]# virsh destroy test
[root@kvm ~]# virsh start test

查看虚拟机配置信息,看是否修改成功,命令如下:
[root@kvm ~]# virsh dominfo test

除了这种修改方式之外,还有一种动态修改,命令如下:
[root@kvm ~]# virsh setmem test 800m
//动态修改内存
[root@kvm ~]# virsh setvcpus test 2
//动态修改cpu,只可以增加不可以减少
查看配置信息,看是否修改成功,命令如下:
[root@kvm ~]# virsh dominfo test
[root@kvm ~]# virsh dumpxml test > /etc/libvirt/qemu/test.xml
//需要把配置写入到配置文件里
增加一块新的网卡,并设置为NAT网络模式(virbr0类似VMware的VMnet8),这里如果写--source br0,则网络模式为桥接,命令如下:
[root@kvm ~]# virsh attach-interface test --type bridge --source virbr0

[root@kvm ~]# virsh domiflist test

把配置文件做备份。
[root@kvm ~]# virsh dumpxml test > /etc/libvirt/qemu/test.xml
进入test虚拟机,查看网卡信息,命令如下:
[root@kvm ~]# virsh console test
[root@localhost ~]# ip a

7. 迁移虚拟机
首先关闭虚拟机,命令如下:
[root@kvm ~]# virsh shutdown test
Domain test is being shutdown
查看虚拟机磁盘所在目录,命令如下:
[root@kvm ~]# virsh domblklist test

[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
因为是迁移到本机,配置文件用的是test子机的配置,不改会有冲突,所以需要修改该文件。如果是远程机器不用修改,命令如下:
[root@kvm ~]# vi /etc/libvirt/qemu/test03.xml

 
定义新虚拟机,命令如下:
[root@kvm ~]# virsh define /etc/libvirt/qemu/test03.xml
Domain test03 defined from /etc/libvirt/qemu/test03.xml
查看虚拟机列表,会发现新迁移的虚拟机test03,命令如下:
[root@kvm ~]# virsh list --all

 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号