KVM虚拟化技术简介

KVM架构

KVM虚拟化的核心主要由以下两个模块组成

1. KVM内核模块,它属于标准Linux内核的一部分,是一个专门提供虚拟化功能的模块,主要负责

CPU和内存的虚拟化,包括:客户机的创建、虚拟内存的分配、CPU执行模式的切换、vCPU寄存 器的访问、vCPU的执行。KVM模块是KVM虚拟化的核心模块,它在内核中有两部分组成,一个是 处理器架构无关的部分,可以用lsmod命令看到,叫做kvm模块;另一个是处理器架构相关的部 分,在intel平台上就是kvm_intel这个内核模块。KVM主要功能是初始化CPU硬件,打开虚拟化模 式,然后将虚拟客户机运行在虚拟机模式下,并对虚拟客户机的运行提供一定的支持。

2. QEMU用户态工具,它是一个普通的Linux进程,为客户机提供设备模拟的功能,包括模拟BIOS、 数据总线、磁盘、网卡、显卡、声卡、键盘、鼠标等。同时它通过系统调用与内核态的KVM模块进 行交互。作为一个存在已久的虚拟机监控器软件,QEMU的代码中有完整的虚拟机实现,包括处理 器虚拟化、内存虚拟化,以及KVM也会用到的设备模拟功能。总之,QEMU既是一个功能完整的虚 拟机监控器,也在QEMU/KVM软件栈中承担设备模拟的功能。

3. 在KVM虚拟化架构下,每一个客户机就是一个QEMU进程,在一个宿主机上有多少个虚拟机就会有 多少个QEMU进程;客户机中的每一个虚拟CPU对应QEMU进程中的一个执行线程;一个宿主机只 有一个KVM内核模块,所有客户机都与这个内核模块进行交互。

KVM虚拟化技术_配置文件

KVM上层管理工具

1. libvirt

libvirt是使用最广泛的对KVM虚拟化进行管理的工具和应用程序接口,已经是事实上的虚拟化接口 标准,后部分介绍的许多工具都是基于libvirt的API来实现的。作为通用的虚拟化API,libvirt不但能 管理KVM,还能管理VMware、Hyper-v等其他虚拟化方案

2. virsh

virsh是一个常用的管理KVM虚拟化的命令行工具,对于系统管理员在单个宿主机上进行运维操 作,virsh命令行可能是最佳选择。virsh是用c语言编写的一个使用libvirt API的虚拟化管理工具, 其源代码也是在libvirt这个开源项目中的。

3. virt-manager

virt-manager是专门针对虚拟机的图形化管理软件,底层与虚拟化交互的部分仍然是调用libvirt API来操作的。virt-manager除了提供虚拟机生命周期(包括:创建、启动、停止、打快照、动态 迁移等)管理的基本功能,还提供了性能和资源使用率的监控。

KVM软件安装

Linux主机需要安装图形化桌面程序

yum groupinstall -y "GNOME 桌面"

如果出现报错尝试更新一下软件包

yum upgroup -y

勾选虚拟化Intel-vtx
Linux主机需要安装图形化桌面程序​​

KVM虚拟化技术_虚拟化_02

查看CPU支持的功能中是否存在

vmx:INTEL的虚拟化功能

svm:AMD的虚拟化功能

cat /proc/cpuinfo |grep -E 'vmx|svm'

卸载KVM

yum remove rpm -qa |egrep 'qemu|virt|kvm' -y
rm -rf /var/lib/libvirt /etc/libvirt/

安装kvm

yum install qemu virt librbd1-devel -y
yum upgrade -y

启动服务

systemctl start libvirtd
lsmod |grep kvm # 查看kvm模块加载

开启图形界面化

startx
systemctl set-default graphical.target (开机图形化界面)
systemctl set-default multi-user.target (开机命令行界面)

飞机驾驶舱(web)

1.安装工具

yum install cockpit -y
systemctl start cockpit

浏览器访问IP地址的9090端口

KVM虚拟化技术_配置文件_03

图形模式安装Guest OS

[root@localhost ~]# virt-manager

KVM虚拟化技术_虚拟化_04

上传系统镜像文件到Linux系统中

[root@localhost ISO]# ls -lh 
总用量 1021M
-rw-r--r--. 1 root root 918M 6月 19 15:31 CentOS-7-x86_64-Minimal-1810.iso

KVM虚拟化技术_xml_05

KVM虚拟化技术_xml_06

KVM虚拟化技术_配置文件_07

KVM虚拟化技术_配置文件_08

KVM虚拟化技术_配置文件_09

完全命令方式安装

1.因为用到了ftp服务,所以需要先把ftp服务装好

yum -y install vsftpd #安装服务
systemctl restart vsftpd #启动服务
cd /var/ftp/
mkdir centos7u3 #创建挂载点
mount /root/Public/CentOS-7-x86_64-Minimal-1708.iso /var/ftp/centos7u3/

2.下面开始安装

yum -y install virt-install
virt-install --connect qemu:///system -n vm1 -r 2048 -- disk path=/var/lib/libvirt/images/vm1.img,size=7 --os-type=linux --os- variant=centos7.0 --vcpus=2 --locatinotallow=ftp://ftp服务器的IP/centos7u3 -x cnotallow=ttyS0 --nographics

如果本地有镜像可以直接使用本地镜像进行安装

virt-install -name=vm2 --ram 512 --vcpus=1 --disk path=/var/lib/libvirt/images/vm2.qcow2,size=5,bus=virtio --accelerate --cdrom /root/CentOS-7-x86_64-Minimal-1708.iso --vnc --vncport=-1 --vnclisten=0.0.0.0 --network bridge=virbr0,model=virtio --noautoconsole

参数说明:
-n name
-r 以M为单位指定分配给虚拟机的内存大小
--disk 指定作为客户机存储的媒介 size以G为单位的存储
--os-type 针对一类操作系统优化虚拟机配置
--os-variant 针对特定操作系统变体进一步优化虚拟机配置
--vcpus
--location 客户虚拟机kernel+initrd 安装源,必须为镜像挂载在ftp目录下
-x 当执行从”–location”选项指定位置的客户机安装时,附加内核命令行参数到安装程序
--nographics 指定没有控制台被分配给客户机。
缺点:纯文本安装的输入时大小写莫名的变换,远程ssh没问题
内存必须大于2048(-r后面)
易错:
安装过程中:
手动配置IP地址
到url位置找不到路径,要返回去手动选择url,重新配置url为ftp://192.168.100.230/rhel6u4,这里
的ip不要写127.0.0.1而是br0的ip

借助虚拟机安装

1.虚拟机配置文件

ls /etc/libvirt/qemu
networks vm1.xml

2.存储虚拟机的介质

ls /var/lib/libvirt/images/
vm1.qcow2

3.根据配置文件创建虚拟机

1.需要有磁盘镜像文件
cp vm1.qcow2 vm2.qcow2
2.需要有配置文件
cp vm1.xml vm2.xml
3.修改配置文件的必须修改的地方,name、uuid、磁盘、mac地址
vim /etc/libvirt/qemu/vm2.xml

KVM虚拟化技术_虚拟化_10

4.创建虚拟机

virsh define /etc/libvirt/qemu/vm2.xml

5.查看与启动这个虚拟机

virsh list --all
virsh start vm2

6.连接控制台
在虚拟机里运行

grubby --update-kernel=ALL --args="cnotallow=ttyS0"
Reboot

实体机进行连接

virsh console vm2

KVM基础管理

常用管理命令

virsh list --all #展示所有虚拟机
virsh dumpxml vm1 # 查看虚拟机的配置
virsh dumpxml vm1 > vm1.xml.old # 查看虚拟机的配置
virsh edit vm1 # 编辑虚拟机的配置
virsh start vm1 #开启虚拟机
virsh suspend vm1 # 暂停虚拟机
virsh resume vm1 # 恢复虚拟机
virsh shutdown vm1 # 关闭虚拟机
virsh reboot vm1 # 重启虚拟机
virsh reset vm1 # 重置虚拟机
virsh undefine vm1 # 删除虚拟机
virsh autostart vm1 # 开机自启动虚拟机
virsh autostart --disable vm1 # 取消开机自动启动虚拟机
ls /etc/libvirt/qemu/autostart # 有开机自动的虚拟机时自动创 建
virsh destroy vm1 # 强行关闭虚拟机,即使虚拟机是开启状态

虚拟机克隆

名字系统分配

virt-clone -o vm1 --auto-clone

可以指定克隆之后的名字

virt-clone -o vm1 -n vm3 --auto-clone

指定克隆之后虚拟机的磁盘镜像文件

virt-clone -o vm1 -n vm4 --auto-clone -f /var/lib/libvirt/images/vm4.qcow2

虚拟机快照

创建快照

virsh snapshot-create-as 虚拟机 快照名
qemu-img info /var/lib/libvirt/images/虚拟机.qcow2 #查看快照

单独查看虚拟机的快照

virsh snapshot-list 虚拟机

还原快照

virsh snapshot-revert 虚拟机 快照名.snap

删除快照

virsh snapshot-delete --snapshotname 快照名.snap 虚拟机

KVM存储

kvm必须配置一个目录当做存储磁盘镜像(存储卷)的目录,这个目录为存储池

默认存储池: /var/lib/libvirt/images/

存储池创建使用相关命令

KVM平台以存储池的形式对存储进行统一管理,所谓存储池可以理解为本地目录、通过远端磁盘阵列 (iSCSI、NFS)分配过来磁盘或目录。

1.创建基于文件夹的存储池(目录),并且定义存储池与其目录

mkdir -p /data/vmfs
virsh pool-define-as 存储池 --type dir --target 存储池目录

2.创建已定义的存储池,然后查看已定义的存储池,存储池不激活无法使用

#构建池 vmdisk
virsh pool-build vmdisk
#查看池
virsh pool-list --all
#启用存储池
virsh pool-start vmdisk
#设置开机自动启动
virsh pool-autostart vmdisk

3.在存储池中创建虚拟机存储卷

virsh vol-create-as 存储池 存储卷名.qcow2 10G --format qcow2

注1:KVM存储池主要是体现一种管理方式,可以通过挂载存储目录,LVM逻辑卷的方式创建存储池,虚拟机存储卷创建完成后,剩下的操作与无存储卷的方式无任何区别

注2:KVM存储池也用于虚拟机迁移任务

存储池删除相关管理命令

1.在存储池中删除虚拟机存储卷

virsh vol-delete --pool 存储池 存储卷.qcow2

2.取消激活存储池

virsh pool-destroy vmdisk

3.删除存储池定义的目录

virsh pool-delete vmdisk

4.取消定义存储池

virsh pool-undefine vmdisk

虚拟机磁盘挂载至宿主机

当虚拟机无法启动的时候,可以将虚拟磁盘文件直接挂载到主机上,以获得其中的文件

查看磁盘镜像分区信息

virt-df -h -d 虚拟机
virt-filesystems -d vm1

挂载磁盘镜像分区,挂载完成之后可以看到vm1虚拟机根目录下的文件

guestmount -d 虚拟机 -m /dev/centos/root --rw 挂载目录

取消挂载

guestunmount 挂载目录

网络管理

NAT网络下

宿主机和虚拟机可以互相访问

虚拟机可以访问宿主机所在的物理网络

宿主机所在的物理网络无法主动访问虚拟机




[root@localhost ~]# brctl show 
bridge name bridge id STP enabled interfaces
virbr0 8000.5254008f1e8c yes virbr0-nic
vnet0
vnet1
vnet2


KVM虚拟化技术_xml_11

隔离网络拓扑

在隔离网络下

虚拟机和宿主机可以互相访问

宿主机不提供NAT功能,所以虚拟机与宿主机所在的物理网络无法互相访问

KVM虚拟化技术_xml_12

桥接网络拓扑

在桥接网络下

虚拟机和宿主机可以互相访问

虚拟机和宿主机同处于一个物理网络下

物理网络可以直接访问虚拟机,虚拟机也可以直接访问物理网络

KVM虚拟化技术_虚拟化_13

配置桥接网络

在宿主机上
建桥接网卡配置文件
vim /etc/sysconfig/network-scripts/ifcfg-br0
TYPE=Bridge
NAME=br0
DEVICE=br0
ONBOOT="yes"
BOOTPROTO=dhcp
修改宿主机网卡配置文件
cp /etc/sysconfig/network-scripts/ifcfg-ens33{,.old}
vim /etc/sysconfig/network-scripts/ifcfg-ens33
DEVICE="ens33"
ONBOOT="yes"
BRIDGE=br0
重启 libvirtd 和 network 服务
systemctl restart network libvirtd
修改虚拟机配置,然后启动虚拟机检查网络是否生效
virsh edit vm1​


KVM虚拟化技术_虚拟化_14

​删除桥接网卡步骤

删除br0的配置文件

修改正常网卡的配置文件

重启系统

配置NAT网络

复制默认的NAT网络配置
cp /etc/libvirt/qemu/networks/default.xml ./nat1.xml
修改配置文件
vim nat1.xml​


KVM虚拟化技术_xml_15

​重启 libvirtd 服务,然后激活新的nat网络

systemctl restart libvirtd

virsh net-autostart nat1 网络nat1标记为自动启动

virsh net-start nat1 网络 nat1 已开始

virsh net-list

修改虚拟机配置,然后启动虚拟机检查网络是否生效

virsh edit vm1


KVM虚拟化技术_虚拟化_16

配置隔离网络

和创建NAT网络一样,不过需要在配置文件中删除如下一行

<forward mode='nat'/>

virbr0网卡
virbr0是kvm默认创建的一个Bridge,其作用是为连接其上的虚拟机网卡提供