KVM

发布时间 2023-07-21 16:47:30作者: ArMinLi

虚拟化技术简介

服务器虚拟化是指将一台计算机(称为物理服务器)通过 hypervisor 虚拟为多台逻辑计算机的技术,这些逻辑计算机又被称为虚拟机(VM,全称:Virtual Machine),每台虚拟机都拥有独立的“硬件”。虽然你可以在虚拟机的操作系统中看到这些“硬件”,不过它们并不是真实存在的,而是通过 hypervisor 将物理机的硬件虚拟而来。虚拟机运行时,虚拟机硬件的工作实际是由物理机的硬件完成的。

1. Hypervisor 的作用

hypervisor 又被称为虚拟机监视器( VMM,全称:Virtual Machine Monitor),是实现物理机虚拟为虚拟机的操作系统或者软件,它为虚拟机提供虚拟的硬件资源,负责管理和分配这些资源,并确保上层虚拟机之间的相互隔离。

2. Hypervisor 有两种类型

  • 一种是操作系统,直接安装在物理机上;
  • 另一种是应用程序,需要先在物理机上安装操作系统,再在操作系统中安装 hypervisor。

虚拟化的分类

服务器虚拟化的有多种划分方式,可以根据虚拟化架构划分为裸金属/寄居,根据虚拟化层次硬件辅助虚拟化/软件辅助虚拟化,根据虚拟化平台划分为全虚拟化/半虚拟化。

1. 裸金属(原生)/寄居

判断虚拟化类型是裸金属还是寄居架构,取决于虚拟化层,也就是 hypervisor 所处的位置。寄居架构将虚拟化层(hypervisor)以一个应用程序的方式安装运行于操作系统之上,支持最为广泛的各种硬件配置(只要HOST OS支持该硬件即可)。裸金属架构将虚拟化层( hypervisor)直接安装到干净的 x86 服务器上,裸金属架构相对于寄居架构效率更高(少了Host OS这一层),且具有更好的可扩展性、健壮性和性能。

企业级服务器虚拟化都是裸金属架构(效率更高),像主流的企业级服务器虚拟化 ESXi KVM Xen Hyper-v都是裸金属架构。

  • 未虚拟化的 x86 服务器架构,自下而上是物理硬件(Hardware)、操作系统(OS),应用程序( APP )

  • 这和我们个人计算机一样,就是在计算机上装操作系统,再在操作系统里面安装应用程序。

  • 架构图如下:

    • 未做虚拟化的 x86 服务器

  • 做完裸金属的 x86 服务器

    • 裸金属(bare-metal)架构也叫 bare-metal hypervisor、Ⅰ型,最有代表性就是 VMware ESX(i)。
    • ESXi 是 VMware 的企业级服务器虚拟化技术,本身是一个操作系统,直接安装的物理服务器上。
    • 使用 ESXi 需要先在物理服务器上安装 ESXi,然后在 ESXi 中创建各种虚拟硬件(相应虚拟硬件的集合,不包括操作系统,也可以称为虚拟机),再在虚拟机上安装操作系统,最后才能在这些操作系统中安装应用程序。
    • Tips:早期 VMware 的企业级服务器虚拟化版本称为 ESX,后来升级版本称为 ESXi。
    • VMware ESXi 架构图

2. 有点特殊的裸金属 KVM

  • 部署 KVM ,首先需要在物理服务器上安装Linux系统,再在Linux中“安装 KVM ”。通常所说的 KVM 实际上是KVM 和 qemu 两种技术的结合,qemu 本身是一种完整的寄居架构软件,采用二进制翻译的方式虚拟化CPU, KVM 则采用效率更高的硬件辅助虚拟化CPU。由于 KVM 只能虚拟化CPU、内存,其它硬件(网卡、硬盘)的虚拟化则是由 qemu 来负责。

  • qemu 是寄居架构,通俗来讲就是 qemu 是个工作在Linux上的软件。而 KVM 则相当于“给Linux内核打了一个补丁”,将Linux部分内核转换为 hypervisor ,Linux内核自然属于操作系统,这样看来 KVM的 hypervisor既有寄居(qemu)又有裸金属(kvm),是一种比较特殊的裸金属。

  • 架构图如下:

虚拟化原理简介

1. 用户/内核空间

  • Windows和Linux都将内存分为内核空间和用户空间,操作系统内核代码运行在内核空间,应用程序代码运行在用户空间。

2. 特权级

CPU清除内存数据、设置时钟等指令是非常危险的,如果用错了会导致系统崩溃。通过特权级这一机制,区分内核代码和应用程序代码权限,保证操作系统正常运行。

  • 特权级是一种用来保护数据和阻止恶意行为的机制,x86 计算机的CPU提供4个特权级:ring0~3 ,ring0权限最高,ring3 权限最低

  • ring0 提供给操作系统内核(内核空间代码)使用,可以使用所有CPU指令,可以直接操作硬件(如CPU、内存)

  • ring3 提供给应用程序(用户空间代码)使用的,只可以调用基本的CPU指令

  • ring1 ring2 被设计为运行驱动程序,但Windows、Linux将驱动程序运行在 ring0,未使用这两个特权级

3. 指令类型

3.1 未虚拟化时,CPU的指令分为特权指令和非特权指令。

Tips:特权指令必须以 ring0 运行,否则会产生异常,将控制权交还 ring0,非特权指令有的需要以 ring0运行,有的不需要。

特权指令

在多用户、多任务的计算机系统中特权指令必不可少,它主要用于系统资源的分配和管理,包括改变系统工作方式,检测用户的访问权限,修改虚拟存储器管理的段表、页表,完成任务的创建和切换等。

常见的特权指令有以下几种:

(1)有关对I/O设备使用的指令 如启动I/O设备指令、测试I/O设备工作状态和控制I/O设备动作的指令等。

(2)有关访问程序状态的指令 如对程序状态字( PSW )的指令等。

(3)存取特殊寄存器指令 如存取中断寄存器、时钟寄存器等指令。

(4)其他指令

非特权指令

非特权指令有的需要以 ring0 运行,有的可以任意ring运行。操作系统内核以 ring0 运行,可以使用所有指令;应用程序以 ring3 运行,所以不能使用特权指令和部分非特权指令。

3.2 虚拟化后,CPU的指令分为特权指令,敏感指令,普通指令。

  • Tips:特权指令只有 ring0 才能执行,当非 ring0 执行时会产生异常,非特权指令有的也需要 ring0 才能运行,但是它们非 ring0 运行不会产生异常。

  • Tips:敏感指令 = 特权指令 + 部分非特权指令,也就是说特权指令一定是敏感指令。

敏感指令

敏感指令是指操作特权资源的指令。

1.企图访问或修改虚拟机模式或机器状态的指令。

2.企图访问或修改敏感寄存器或存储单元,如时钟寄存器、中断寄存器等的指令。

3.企图访问存储保护系统或内存、地址分配系统的指令。

4.所有I/O指令。

KVM 虚拟化演练

如果系统使用物理机,需要在BIOS里面开启 Intel VT-x 或 AMD-V,如果是 VMware workstation,还须将处理器的虚拟化引擎中的三项开启。

  • 本机主要硬件配置(使用 VMware workstation 模拟)
CPU:i5-6200U(8核)

内存:8G

硬盘:SATA 500G

1. 部署 KVM

安装 KVM 有多种方式可供选择,下面列出:

1.1 安装系统时(生产环境推荐)

  • 在基础环境中选择 Virtualization Host,附加环境中选择 Virtualization Platform(虚拟化平台),这将仅安装基础虚拟化环境和命令行工具。
  • 这种方式只能通过命令行管理虚拟机。

1.2 安装系统时(学习环境推荐)

  • 在基础环境中选择 Server with GUI,附加环境选择 Virtualization Client, Virtualization Hypervisor , and Virtualization Tools,除了将安装虚拟化环境和命令行工具,还将安装一个管理虚拟机的图形工具(virt-manager)。

  • 这种方式既可以用图形界面,也可以用命令行来管理虚拟机,推荐用这种方法

1.3 手动安装

验证CPU是否支持 KVM 虚拟化

如果结果中有 vmx(Intel)或 svm(AMD) 字样,就说明CPU的支持

其中 intel cpu 支持会有 vmx , AMD cpu 会支持 svm

grep -E --color '(vmx|svm)' /proc/cpuinfo

通过yum安装虚拟化的软件包

##配置系统光盘的本地yum源
mount /dev/sr0 /mnt/
cat <<END>> /etc/yum.repos.d/yum.repo
[lemon]
baseurl=file:///mnt
enabled=1
gpgcheck=0
END

##安装
yum -y groupinstall "GNOME Desktop"        #图形界面,可装可不装

yum -y install libvirt* virt-* qemu-kvm* bridge-utils      #KVM相关软件包,必装

说明:libvirtd 服务非常重要,必须确保该服务能够正常运行,才能使用各种管理工具。

bridge-utils    设置网络网卡桥接。
qemu-kvm        此包提供hypervisor以及宿主机和虚拟机之间的通信。
qemu-img        此包提供虚拟机磁盘管理工具; 是qemu-kvm的依赖包,所以安装命令中可以不写qemu-img
libvirt         安装虚拟机管理工具,使用virsh等命令来管理和控制虚拟机。
virt-install    这个包提供了virt-install命令,用于从命令行创建虚拟机。
libvirt-python  这个包包含一个模块,它允许用Python编写的应用程序使用libvirt 提供的API。
libvirt-client  此包提供用于访问libvirt的API和库,还包括virsh,用于从命令行管理和控制虚拟机。
virt-manager    这个包提供了virt-manager工具,也称为Virtual Machine Manager。这是一个用于管理虚拟机的图形工具,它使用libvirt-client库作为管理API。

验证安装结果,下图说明已经成功安装了

lsmod | grep kvm

如果安装成功则显示:

如果出现下面这种情况

需要去BIOS里设置下

如果没有,需要执行

modprobe kvm-intel

还没有就重启一下系统试试

开启 kvm 服务,并且设置其开机自动启动

systemctl start libvirtd
systemctl enable libvirtd

查看状态操作结果,如下图所示,说明运行情况良好

systemctl status libvirtd

2. kvm 安装虚机

向默认路径下载或拉取系统ISO,后面做虚拟化主机的时候会用到

libvirtd 存放镜像的默认位置在 /var/lib/libvirt/images/

在 kvm 上开启 VNC 连接

安装VNC 客户端工具

命令行安装虚拟机

[root@KVM ~]# virt-install --name centos7-01 --memory 1024 --vcpus 1 \
--disk /opt/centos7-01.raw,format=raw,size=10 \
--cdrom /var/lib/libvirt/images/CentOS-7-x86_64-DVD-1708.iso \
--network=default --graphics vnc,listen=0.0.0.0 \
--virt-type kvm --os-type=linux --os-variant rhel7 --noautoconsole

#virt-install参数
--name=xx                                  #虚拟机唯一名称
--memory=1024                               #虚拟机内存,单位为mb
--vcpus=1                                   #虚拟机CPU数量
--disk path=/xx/xxx[,size=10,format=raw]    #存储文件及格式(虚机磁盘)
--cdrom=/xxx/xxx                            #指定安装源文件
--network bridge=br0                 #网络连接方式,默认为NAT模式
--graphics vnc,port=xxx,listen=xxx       #图形化连接参数
--virt-type=kvm                       #虚拟机类型
--os-type=xxx                               #系统类型
--os-variant=xxx                   #系统版本
--noautoconsole             #不加这个选项的话会一直卡在这个终端,直到这个系统彻底安装完毕
  • 必须关闭防火墙 或者 添加防火墙规则

  • 在vnc客户端上输入ip跟端口号,默认是5900,每创建一个虚机,端口则加1(5901)

下面就直接安装就行了

创建完一个虚机后,会有两个文件:

  1. 虚机的模板文件(.xml)
  2. 虚机的磁盘文件(.raw)

所以,如果想要备份虚机的话,就只需要备份这两个文件

3. virsh 常用命令

##kvm比较重要的俩个目录
/etc/libvirt/qemu/                         #虚拟机配置文件默认目录
/var/lib/libvirt/images/                   #默认镜像文件位置 

##日常管理命令
virsh list --all                           #查看所有虚拟机,加all列出关机状态的
virsh console xxx                          #以控件台连接到指定虚拟机,需要修改虚机内核配置
virsh start xxx                            #启动虚拟机
virsh autostart xxx                        #设置虚机随机启动
virsh shutdown xxx                         #关闭虚拟机,一般关不了
virsh destroy xxx                          #强制关闭虚拟机(断电)
virsh suspend kvm01                        #挂起虚拟机
virsh resume kvm01                         #恢复挂起的虚拟机
virsh dumpxml kvm01 > kvm01.xml            #导出虚机配置文件(备份)
virsh undefine xxx                         #删除虚拟机,只会删除对应的xml,硬盘文件不会删除
virsh define /opt/kvm01.xml                #重新定义一个虚拟
virsh edit kvm01                           #编辑虚机配置文件
virsh snapshot-create kvm01                #创建虚拟机快照(建快照镜像格式要为qcow2格式)
virsh snapshot-list kvm01                  #查看虚拟机快照

##虚机磁盘管理命令
qemu-img create -f qcow2 /opt/kvm01-1.raw 20G            #新建虚机磁盘,默认格式为raw
qemu-img info kvm01                                      #查看虚机磁盘系统格式
qemu-img convert -f raw 原格式文件 -O qcow2 转换格式文件    #转换虚机磁盘系统格式

##虚机在线添加硬盘和扩容磁盘的管理命令
virsh attach-disk

##虚机快照管理命令
virsh snapshot-create 虚机名                              #创建快照
virsh snapshot-list 虚机名                                #查看快照
virsh snapshot-revert 虚机名 --snapshotname 快照名         #还原快照
virsh snapshot-delete 虚机名 --snapshotname 快照名         #删除快照

##虚机克隆管理命令
virt-clone --auto-clone -o 虚机名                         #完整克隆

4. KVM 的日常管理

virsh vncdisplay kvm01 #查看虚机对应的VNC端口号

virsh list --all #查看所有虚拟机,加all列出关机状态的

virsh start kvm01 #启动虚拟机

virsh shutdown kvm01 #温柔的关机(有时候不好使)

virsh destroy kvm01 #强制关机(断电)

virsh suspend kvm01 #挂起虚拟机

virsh resume kvm01 #恢复挂起的虚拟机

  • 启动虚机

  • 温柔的关闭虚机

  • 强制关闭虚机

  • 挂起虚机

  • 恢复挂起的虚机

virsh dumpxml kvm01 > kvm01.xml #导出虚拟机配置文件(备份)

virsh undefine kvm01 #取消定义,删除虚拟机,只会删除对应的xml,硬盘文件不会删除

virsh define /xxx/xxx/kvm01.xml #重新定义一个虚拟机;.raw的磁盘文件必须得是存在的,不然不行

  • 删除虚机

  • 恢复虚机

virsh edit kvm01 #编辑虚机配置文件;修改前记得先关闭虚机

virsh domrename kvm01 kvm02 修改虚机名;修改前记得先关闭虚机

5. KVM虚拟机开机自启 和 console登陆

5.1 KVM虚拟机开机自启

virsh autostart kvm01 #设置随宿主机开机自启动

virsh autostart --disable kvm01 #取消随宿主机开机自启动

  • 设置web01虚机随着宿主机的启动而启动

  • 验证

  • 为什么他能够自启?
    • 其实和启动系统服务的原理一样,就是加了一个软连接
    • 而且如果你取消了虚机的自启,这个软连接也就会跟随着消失

  • 取消掉虚机自启,验证这个软连接还会不会消失

5.2 console登陆

virsh console kvm01 #以控件台连接到指定虚拟机

  • 在没有配置 虚机 内核的情况下运行这个命令

  • 所以我们需要先修改 虚机 的内核

    • 先使用VNC登陆查看一下虚机的IP地址

  • 在使用ssh在kvm宿主机上远程虚机上面

  • 调整虚机的内核并重启系统
grubby --upadte-kernel=ALL --args="console=ttyS0,115200n8"

  • 对比一下两个文件;需要安装vim 或者 df
[root@centos7-01 ~]# yum -y install vim 
[root@centos7-01 ~]# vimdiff /boot/grub2/grub.cfg /opt/grub.cfg

  • 然后在从KVM上使用console这个命令看看会有什么变化

6. KVM磁盘格式转换 和 快照管理

  • raw(裸格式) //占用空间较大,性能较好,但不支持虚拟机快照功能
  • qcow2(copy on write) //占用空间较小,支持快照,性能比RAW稍差一些

6.1 虚机磁盘格式转换

  • 基于centos7-01.raw磁盘格式文件转换为一个centos7-01.qcow2格式文件
qemu-img convert -f raw /opt/centos7-01.raw -O qcow2 /opt/centos7-01.qcow2
  • 修改虚机配置文件,改变虚机磁盘格式

9. KVM热添加硬盘 和 扩容

7. KVM全克隆虚机

8. KVM链接克隆虚机

KVM网络讲解配置(重点)

经常玩虚拟机的都知道有两种模式:一种是NAT,一种是Bridge

  • NAT就好比宿主机(就是安装 kvm 虚拟化的主机)是台路由器,虚拟机是连接路由器下面的电脑,跟宿主机同个网段的电脑是访问不了虚拟机的,要访问的话,就得在宿主机上设置端口映射。

  • Bridge 就是把宿主机的物理网卡当做一个交换机,虚拟机直接连接交换机,那就跟宿主机是同一个网段的了,可以被其它电脑访问到,一般做服务虚拟化都是用桥接模式。

4.1 原理

使用 libvirt 安装完 qemu kvm 虚拟机,但是发现虚拟机不能上网,虚拟机想要上网,有很多中方法。 我们称Guest机器为虚拟机,Host机器为开机运行的真实机器。

KVM 虚拟机网络配置一般的两种方式:

  • NAT方式是kvm 安装后的默认方式。它支持主机与虚拟机的互访,同时也支持虚拟机访问互联网,但不支持外界访问虚拟机
  • Bridge 方式是将虚拟机桥接到 host机器的网卡上,guest 和 host 机器都通过bridge上网.对外不同的 ip

NAT和桥接的比较:

  • NAT模式和桥接模式虚拟机都可以上外网。
  • 由于NAT的网络在一个虚拟网络里,所以局域网其他主机是无法访问虚拟机的,而宿主机可以访问虚拟机,虚拟机可以访问局域网的所有主机,因为真实的局域网相对于NAT的虚拟网络,就是NAT的虚拟网络的外网,不懂的人可以查查NAT的相关知识。
  • 桥接模式下,多个虚拟机之间可以互相访问;NAT模式下,多个虚拟机之间也可以相互访问。

两种网络的使用场景:

  • 如果你建一个虚拟机,只是给自己用,不需要给局域网其他人用,那么可以选择NAT。
  • 反之,选择使用 Bridge

4.2 NAT 和 Bridge架构图

NAT 的网络结构图:

Bridge 的网络结构图:

4.3 NAT方式

NAT方式是 kvm 安装后的默认方式。它支持主机与虚拟机的互访,同时也支持虚拟机访问互联网,但不支持外界访问虚拟机。

要想实现外部访问 kvm NAT 模式中的虚拟机,需要做端口映射 并 开启路由转发

检查当前的网络设置:

virsh net-list --all

检查当前的网络接口:

4.4 Bridge方式

有两种配置方案:

  • 手动修改网卡配置文件
  • 使用 virsh iface-bridge 命令