KVM
虚拟化技术简介
服务器虚拟化是指将一台计算机(称为物理服务器)通过 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)
下面就直接安装就行了
创建完一个虚机后,会有两个文件:
- 虚机的模板文件(.xml)
- 虚机的磁盘文件(.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 命令