云计算和虚拟化分类

云计算的架构

a666e7556e2f4b3dcea85103a847dc0f.png

云计算的模型

云计算的模型是以服务为导向的,根据服务层次的不同,分为IaaS(Infrastructure as a Service),PaaS,SaaS。

虚拟化概述

image-20230628001203739

最理想的虚拟化目标:

  • 客户机完全不知道自己在虚拟环境中,以为自己在原生环境里
  • 完全不需要VMM介入客户机的运行过程

半虚拟化和全虚拟化

  • 半虚拟化:纯软件的方式可以做到第一个目标,但是性能不是很好,而且软件设计的复杂度太大。所以放弃第一个目标,让系统知道是在虚拟环境中,例如VMware WorkStation,依赖于宿主操作系统,在其上构建出多个隔离的操作系统环境。

img

  • 全虚拟化:坚持第一个目标。直接凌驾于硬件之上,构建出多个隔离的操作系统环境。

img

KVM原理

KVM是属于全虚拟化的。

主流虚拟化架构

img

对比了几种主流虚拟化技术架构:ESXi、Xen与KVM,其主要差别在与各组件(CPU、内存、磁盘与网络IO)的虚拟化与调度管理实现组件有所不同。在ESXi中,所有虚拟化功能都在内核实现。Xen内核仅实现CPU与内存虚拟化, IO虚拟化与调度管理由Domain0(主机上启动的第一个管理VM)实现。KVM内核实现CPU与内存虚拟化,QEMU实现IO虚拟化,通过Linux进程调度器实现VM管理。

KVM虚拟化架构

KVM虚拟化有两个核心模块:

1)KVM内核模块:主要包括KVM虚拟化核心模块KVM.ko,以及硬件相关的KVM_intel或KVM_AMD模块;负责CPU与内存虚拟化,包括VM创建,内存分配与管理、vCPU执行模式切换等。

2)QEMU设备模拟:实现IO虚拟化与各设备模拟(磁盘、网卡、显卡、声卡等),通过IOCTL系统调用与KVM内核交互。KVM仅支持基于硬件辅助的虚拟化(如Intel-VT与AMD-V),在内核加载时,KVM先初始化内部数据结构,打开CPU控制寄存器CR4里面的虚拟化模式开关,执行VMXON指令将Host OS设置为root模式,并创建的特殊设备文件/dev/kvm等待来自用户空间的命令,然后由KVM内核与QEMU相互配合实现VM的管理。KVM会复用部分Linux内核的能力,如进程管理调度、设备驱动,内存管理等。

img

KVM安装

首先检查以下cpu是否支持虚拟化,不支持就休息了,下面不用看了。

1
2
# 查看CPU是否支持虚拟化
cat /proc/cpuinfo | grep vmx

有红色的vmx就说明支持

image-20230628010322936

安装KVM基本组件

安装 GNOME 桌面环境 如果 Centos 装了图形界面可以不需要装

1
yum groupinstall -y "GNOME Desktop"

KVM 模块

1
yum -y install qemu-kvm

安装KVM 调试工具,可不安装

1
yum -y install qemu-kvm-tools

构建虚拟机的命令行工具

1
yum -y install virt-install

qemu 组件,创建磁盘、启动虚拟机等

1
yum -y install qemu-img

网络支持工具

1
yum -y install bridge-utils

虚拟机管理工具

1
yum -y install libvirt

图形界面管理虚拟机

1
yum -y install virt-manager
1
2
3
4
5
6
7
8
9
#以下是上面安装的内容的汇总
yum groupinstall -y "GNOME Desktop"
yum -y install qemu-kvm
yum -y install qemu-kvm-tools
yum -y install virt-install
yum -y install qemu-img
yum -y install bridge-utils
yum -y install libvirt
yum -y install virt-manager

作用汇总

qemu-kvm:即qemu+kvm,kvm负责cpu和内存的虚拟化,而qemu负责IO设备,如网卡和磁盘等的虚拟化,才能真正实现服务器虚拟化。

libvirt:KVM管理工具,主要是收集虚拟机的监控数据,如cpu,内存等信息,为不同的虚拟机监视器提供了统一的接口。

libvirt-python:可通过python方式调用libvirt API来获取虚拟机的监控数据

libguestfs-tools:虚拟机镜像管理工具,用来访问和修改虚拟机磁盘镜像

virt-install:命令行工具,为KVM创建虚拟机并完成GuestOS安装

virt-clone:用于克隆KVM虚拟机

virt-manager:使用图形界面管理KVM虚拟环境的主要工具

virt-viewer:用于显示虚拟机的图形控制台

bridge-utils:配置网桥

查看是否安装kvm

1
lsmod | grep kvm

image-20230628011109896

没有的话,手动加载模块

1
2
modprobe kvm
modprobe kvm-intel

设置开启启动界面的显示模式

1
ln -sf /lib/systemd/system/graphical.target /etc/systemd/system/default.target

KVM网络

KVM网络的三种模式:

① NAT: 默认设置,数据包由 NAT 方式通过主机的接口进行传送,可以访问外网,但是无法从外部访问虚拟机网络。广泛用于个人虚拟化桌面。

image-20230705094352324

② 桥接模式:这种模式允许虚拟机像一台独立的主机一样拥有网络,外部的机器可以直接访问到虚拟机内部,但需要网卡支持(一般有线网卡都支持)。一般用户服务器端虚拟化。

image-20230705094812714

③仅主机:一般用于超级大的服务厂商。

KVM创建虚拟机

查看虚拟机:virsh list --all

image-20230705100834198

若是无法使用,找不到此命令,重新安装

1
yum -y install libvirt

网卡配置

网卡配置,也就是添加1个桥接网卡,主要是为了后续创建的虚拟机可以使用配置的网卡实现网络通信。

  1. 进入文件
1
2
3
4
5
6
# 进入网卡配置文件夹下
cd /etc/sysconfig/network-scripts/
# 复制ens33网卡配置文件,重命名为br0
cp ifcfg-ens33 ifcfg-br0
# 进入br0网卡配置文件中
vim ifcfg-br0
  1. 修改
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 修改以下信息
# Type类型修改为"Bridge"
TYPE=Bridge
# 修改名称,设备名为br0
NAME="br0"
DEVICE="br0"
# UUID字段前添加#注释
#UUID="xxxxxx"

# 添加以下信息
# ip地址:物理机的IP地址
IPADDR="192.168.xx.xx"
# 子网掩码参数:物理机的子网掩码
PREFIX="24"
# 网关:物理机的网关地址
GATEWAY="192.168.xx.xx"
# DNS地址
DNS1="8.8.8.8"

img

  1. 重启网络
1
systemctl restart network

查看是否存在br0网卡:

1
2
3
4
5
# ifconfig方式查看或者brctl show方式查看
ifconfig

# 查看网卡信息
brctl show

启动虚拟化

启动libvirt

1
2
systemctl enable libvirtd
systemctl start libvirtd

启动后查看是否启动成功

1
systemctl status libvirtd
img

创建虚拟机

通过使用KVM工具virt-manager创建虚拟机,指定每台机器所需的资源(例如RAM、磁盘空间、CPU)。

打开virt-manager图形界面

1
virt-manager
img

创建虚拟机

img

点击本地浏览,这里iso镜像文件记得选择我们前面创建的/mnt/iso文件夹下的镜像,也请将镜像文件放置mnt/iso文件夹下方便选取

img img img

为每个虚拟机安装操作系统,就像为物理计算机安装操作系统一样。

img

接下来就是镜像的安装过程,也就是操作系统centos的安装过程,就不赘述。

img

上面的方式

创建虚拟磁盘

1
2
3
# qemu-img create -f raw/qcow2 
# 创建row格式的,后缀和格式相对应,nat-test是磁盘名称,5G是大小
qemu-img create -f raw /kvm/vdisks/nat-test.raw 5G

raw相当于物理磁盘ssd,大小是完全指定,支持的虚拟化操作比较少;qcow2相当于机械磁盘,大小是弹性的,支持的虚拟化操作比较多(扩容,快照)

部分图片来自:知乎一文搞定KVM安装部署 - 知乎 (zhihu.com)

kvm原理

kvm安装

详细教程:CentOS 7 : KVM : Create a Virtual Machine#1 : Server World (server-world.info)