KVM虚拟化
虚拟化是一种技术,可以利用以往局限于硬件的资源来创建有用的 IT 服务。它让您能够将物理计算机的工作能力分配给多个用户或环境,从而充分利用计算机的所有能力。
举一个实际例子,假设你有 3 台物理服务器,分别用于不同的特定用途。其中一台是邮件服务器,一台是 Web 服务器,最后一台则用于运行企业内部的传统应用。每台服务器仅使用了大约 30% 的能力,没有完全发挥它们的潜能。但是,由于传统应用对内部运营非常重要,您必须将其连同所运行的第三台服务器予以保留,对吗?
过去确实如此。相对简单和可靠的做法是在单独的服务器上运行单独的任务:1 台服务器, 1 个运行操作系统,1 个处理任务。我们很难让 1 台服务器有多个大脑。但是,借助虚拟化技术,您可以将邮件服务器分为 2 个能够处理独立任务的特殊服务器,从而实现传统应用的迁移。您仍然使用相同的硬件,但可以更加高效地利用这些资源。
考虑到安全问题,您可以再次划分第一台服务器,从而可以处理另一项任务,将其使用率从 30% 提高到 60%,甚至提高到 90%。这样,现在空闲的服务器可以用于其他任务或停用,以降低散热和维护成本。
一种叫做 Hypervisor (虚拟机监控程序)的软件可有效分隔物理资源,并将这些资源分配给不同虚拟环境(也就是需要这些资源的任务)使用。虚拟机监控程序可能位于操作系统的顶层(例如在便携式计算机上),或者直接安装在硬件上(例如服务器),这是大多数企业使用虚拟化的方式。虚拟机监控程序接管物理资源,并对它们进行划分,以便虚拟环境能够对其进行使用。
XEN
来自物理环境的资源根据需要进行了分区,分配给了很多虚拟环境使用
。用户在虚拟环境(通常称为客户机或虚拟机)内部,能够与计算任务交互,并运行计算。虚拟机作为单个数据文件运行。与任何数字文件相同,虚拟机可从一台计算机迁移至另一台计算机,在任何一台计算机上打开,工作方式都是相同的。
当虚拟环境正在运行时,如果用户或程序发出一条指令,请求来自物理环境的更多资源, 虚拟机监控程序就会将请求传递到物理系统并缓存更改,所有这些步骤都接近本机速度(特别是如果该请求来自基于 KVM,即基于内核的虚拟机的开源虚拟机监控程序)。
数据虚拟化
分散在各处的数据可以整合为单个来源。实现数据虚拟化后,企业可将数据视为一个动态供应源,进而获得相应的处理能力,可以汇总多个来源的数据、轻松容纳新的数据源,并按用户所需转换数据。数据虚拟化工具处于多个数据源的前端,可将它们化零为整,作为统一的数据源,以符合业务需求的形式、在正确的时间,向任意应用或用户提供所需数据。
桌面虚拟化
人们常把桌面虚拟化与操作系统虚拟化混淆,实际上,后者允许您在单台机器上部署多个操作系统,而桌面虚拟化则允许中央管理员(或自动化管理工具)一次向数百台物理机部署模拟桌面环境。不同于需要在每台机器上进行物理安装、配置和更新的传统桌面环境,桌面虚拟化可让管理员在所有虚拟桌面上执行大规模的配置、更新和安全检查。
服务器虚拟化
服务器是用于处理大量特定任务的计算机,这样可让其他计算机(例如便携式计算机和台式机)能够执行其他各种任务。通过虚拟化服务器,可以让它们执行特定功能,这需要进行分区,以便使用各个组件来运行多种功能。
操作系统虚拟化
操作系统虚拟化在内核中进行,内核则是操作系统的中央任务管理器。这是并行运行 Linux 和 Windows 环境的实用方式。此外,企业还可将虚拟操作系统应用于多台计算机,以实现以下功能:
- 降低批量硬件成本,因为计算机不需要具备很强的开箱即用能力。
- 提高安全性,因为所有虚拟实例都被监控和隔离。
- 节省花费在 IT 服务(例如软件更新)上的时间。
网络功能虚拟化
网络功能虚拟化(NFV)可以隔离网络的关键功能(例如目录服务、文件共享和 IP 配置),并将它们分到各个不同的环境中。一旦软件功能独立于物理计算机,特定功能便可以组合成为新网络,并分配给环境。虚拟化网络可以减少物理组件的数量,例如交换机、路由器、服务器、线缆和集线器,它们都是创建多个独立网络所必需的资源,这种虚拟化方式在电信行业中使用尤其广泛。
虚拟化可以提高 IT 敏捷性、灵活性和可扩展性,同时大幅节约成本。更高的工作负载移动性、更高的性能和资源可用性、自动化运维 - 这些都是虚拟化的优势,虚拟化技术可以使 IT 部门更轻松地进行管理以及降低拥有成本和运维成本。其他优势包括:
-
- 降低资金成本和运维成本。
- 最大限度减少或消除停机。
- 提高 IT 部门的工作效率、效益、敏捷性和响应能力。
- 加快应用和资源的调配速度。
- 提高业务连续性和灾难恢复能力。
- 简化数据中心管理。
说明:以上为部分商业虚拟化产品。
VMware
可谓服务器虚拟化的老大,客户数量多、功能强大、稳定,但价格贵,让一些小企业望而止步。同时自己缺少公有云产品,现在主要依靠与AWS合作和其它公有云厂商的合作。
-
Microsoft
微软的虚拟化产品Hyper-V起源于Windows Server 2008 R2,因搭乘Windows Server系统,在市场份额上有一定的先天优势。且微软有自己的公有云Azure产品,Hyper-V与Azure的互操作性和整合性越来越强,也为Hyper-V的发展带来生态的支撑。Hyper的价格比VMware便宜, 但即使如此,Hyper-V这个虚拟化界的老二,依然远远落后于VMware。
-
Citrix
在桌面虚拟化领域,XenApp和XenDesktop绝对处于领导者位置。近两年 Citrix提出了Citrix Workspace的概念即在企业交付中涵盖包括Windows桌面、应用,新型的移动设备管理和原生应用交付,以及企业数据在不同设备中的交互。但从服务器虚拟化领域,XenServer的口碑明显低于VMware和Hyper-V,甚至其他服务器虚拟化产品,在服务器虚拟化的市场份额较低。
- Red Hat:
Red Hat位于“远见者”象限,这主要是由于KVM采用的技术与OpenStack有着紧密关系。Red Hat领导着核心KVM OSS开发社区,有着忠实的RHEL开发者和客户群,但主要的竞争也来源于基于开源的解决方案。
Huawei:
华为FusionSphere在2014年首次进入x86服务器虚拟化基础设施魔力象限。最早的产品是基于XEN开发的,从6.3版本开始转为KVM,在功能和性能上提高迅速。华为有自己的虚拟化,私有云和公有云产品,有针对运营商的云解决方案。作为硬件厂商,又拥有自己品牌的服务器、网络设备,存储设备等,其解决方案可以使用其软硬件结合,兼容性更好,是所有虚拟化厂商中,生态最为健全,周边配套最为齐备,这也是华为产品最为独特且较难超越的优势。
传统运行模式
一台计算机同时只能运行一个操作系统在系统之上运行运用软件
- 寄居架构
作为应用软件安装在操作系统上可安装多个操作系统
宿主(Host OS)与客户(Guest OS)
原生架构
虚拟机软件直接安装在计算机硬件上 (裸金属安装)
虚拟机本身就是一个操作系统
虚拟机中可以同时运行多个操作系统
虚拟机中可以同时运行多个操作系统
KVM 即Kernel-based Virtual Machine 基于内核的虚拟机。 KVM,是一个开源的系统虚拟化模块,自 Linux 内核 2.6.20 之后集成在Linux的各个主要发行版本中。 它使用 Linux自身的调度器进行管理,所以相对于Xen,其核心源码很少。KVM 目前已成为学术界的主流 VMM(虚拟机监控器)之一。KVM的虚拟化需要硬件支持(如 Intel VT技术或者 AMD V技术)。是基于硬件的完全虚拟化。而 Xen 早期则是基于软件模拟的 Para-Virtualization(半虚拟化)。
kvm、qemu、libvirt的区别和联系
在所谓的kvm技术中,应用到的其实有2个东西:qemu+kvm
kvm:
负责cpu虚拟化+内存虚拟化,实现了cpu和内存的虚拟化,但kvm不能模拟其他设备;
qemu:
是模拟IO设备(网卡,磁盘),kvm加上qemu之后就能实现真正意义上服务器虚拟化。
因为用到了上面两个东西,所以一般都称之为qemu-kvm。
libvirt:
则是调用kvm虚拟化技术的接口用于管理的,用libvirt管理方便,直接用qemu-kvm的接口太繁琐。
libvirt简介
KVM的管理工具,因为libvirt是目前使用最为广泛的对KVM虚拟机进行管理的工具和应用程序接口(API),而且一些常用的虚拟机管理工具(如virsh、virt-install、virt-manager等)和云计算框架平台(如OpenStack、OpenNebula、Eucalyptus等)都在底层使用libvirt的应用程序接口。
2.3.1.KVM相关组件安装
需要在带有桌面环境的服务器中使用KVM技术:
# yum -y install qemu-kvm.x86_64 qemu-kvm-tools.x86_64 python-virtinst.noarch qemu-img.x86_64 bridge-utils.x86_64 libvirt virt-manager
验证CPU是否支持虚拟化:
# cat /proc/cpuinfo | grep vmx //如出现信息则表示支持虚拟化
# cat /proc/cpuinfo | grep svm //此方式为验证AMD的CPU
vmx //inter
svm //AMD
#若查看不到信息,说明没有开启虚拟化,查看文档末尾进行修改虚拟化设置
验证KVM模块是否安装:
# lsmod | grep kvm //出现信息则表示已安装
kvm_intel 53484 0
kvm 316506 1 kvm_intel
# systemctl enable libvirtd
# systemctl start libvirtd
2.3.2.设置网卡:
使用桥接模式。
# vim /etc/sysconfig/network-scripts/ifcfg-ens32
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens32
UUID=20a84c35-af30-49be-9b30-7a4977980ab0
DEVICE=ens32
ONBOOT=yes
IPADDR=192.168.1.40
PREFIX=24
GATEWAY=192.168.1.1
DNS1=8.8.8.8
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_PRIVACY=no
BRIDGE="br0" //增加此行
生成桥接网卡配置文件
# vim /etc/sysconfig/network-scripts/ifcfg-br0 //加入以下内容
DEVICE=br0
BOOTPROTO=static
ONBOOT=yes
TYPE=Bridge
NAME=br0
IPADDR=192.168.1.40 //可以改为ens32的IP地址,也可以设置为其他IP地址,这里的IP地址可以与其他主机通信,而ens32的IP地址将会无效
NETMASK=255.255.255.0
关闭网络管理工具,否则无法正常使用桥接模式:
# systemctl stop NetworkManager
# systemctl disable NetworkManager
# systemctl restart network //重启网卡服务器
查看配置文件是否生效:
# ifconfig //出现了"br0 "、"virbr0"表示配置成功
通过CRT连接192.168.1.40 宿主机
2.3.3.创建虚拟机系统
在图形化界面下操作:
# virt-manager //打开kvm虚拟机管理界面,打不开未响应可以尝试 rpm -e卸载该程序并重新安装
或者应用程序---系统工具---虚拟系统管理器
通过图形化界面开始创建 新的系统并使用
可以先通过fdisk命令创建分区并挂载,再将安装数据存放在挂载点中。
# mount /dev/sdb1 /var/lib/libvirt/images/
使用KVM命令管理虚拟机:
# yum install -y acpid //安装"电源管理"服务
acpid为替代传统的APM电源管理标准而推出的新型电源管理标准。建议所有的笔记本用户开启它。一些服务可能不需要acpi。支持的通用操作有:“电源开关”,“电源监视”,“笔记本LID开关”,“笔记本显示屏亮度”,“休眠”,“挂机”等等。
# systemctl start acpid
# systemctl enable acpid
# virsh -h //查看命令帮助信息,KVM管理命令
/etc/libvirt/qemu //kvm虚拟机配置文件存放目录
# virsh list --all //查看虚拟机运行状态
Id 名称 状态
----------------------------------------------------
5 centos-1 running
# virsh shutdown centos-1 //关机"centos-1"这台服务器
# virsh destroy centos-1 //强制关机"centos-1"这台服务器
# virsh create /etc/libvirt/qemu/centos-1.xml //通过虚拟机配置文件位置启动该虚拟机
# virsh list --all
Id 名称 状态
----------------------------------------------------
6 centos-1 running
# virsh suspend centos-1 //挂起正在运行的虚拟机
域 centos-1 被挂起
# virsh resume centos-1 //恢复被挂起虚拟机
域 centos-1 被重新恢复
# virsh autostart centos-1 //设置该虚拟机开机自动启动
域 centos-1标记为自动开始
# virsh domiflist centos1 //查看指定虚拟机的网卡信息
配置宿主机中的虚拟机网卡:
# vi /etc/sysconfig/network-scripts/ifcfg-ens32 //修改网卡为启动,以及设置IP状态为静态获取以及相关IP参数。保存退出
DEVICE=ens32
HWADDR=52:54:00:02:3F:7D
TYPE=Ethernet
UUID=75e0081f-17fb-49be-ab4c-22ace4b8ac37
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.1.200
NETMASK=255.255.255.0
# systemctl restart network //重启网卡后即可通过该IP与宿主机通信,也可用该IP与真实机通信
给宿主机中的虚拟机添加多个网卡:
方法1:通过图形化界面添加
1.在宿主机中打开虚拟系统管理器,选中要添加网卡的虚拟机,并点击上方"打开"
2.点击第二个 蓝色背景感叹号图标,在最下方"添加硬件",选中第二个"network" 并记住该MAC地址,便于添加网卡配置文件使用
方法二:
也可使用命令行进行添加新网卡:
# virsh attach-interface --domain centos1 --type bridge --source br0
成功附加接口
# virsh domiflist centos1 //添加完后查看该指定虚拟机网卡列表
通过命令行添加的新网卡也需要生成新网卡配置文件,以及填写新网卡mac地址在网卡配置文件中。
3.生成新网卡配置文件:
图形化添加网卡 命令行添加网卡都需要执行以下操作:
# cd /etc/sysconfig/network-scripts/
# cp ifcfg-ens32 ifcfg-ens33
# vi ifcfg-ens33 //修改新网卡配置文件参数
DEVICE=ens33
HWADDR=52:54:00:4f:5e:db //mac地址为最开始添加网卡时的mac地址
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=192.168.1.201 //IP改为新网卡IP地址
NETMASK=255.255.255.0
也可以在此文件下找新网卡的mac地址,便于生成新网卡配置文件:
# vi /etc/udev/rules.d/70-persistent-net.rules
2.4.虚拟机克隆
克隆前,centos7.0需要提前关机
安装克隆命令:
# yum install -y virt-install
# virt-clone -o centos7.0 -n centos7-2 -f /var/lib/libvirt/images/centos7-2.qcow2
可在存储数据的地方看到刚刚克隆的虚拟机:
# ll /var/lib/libvirt/images/
# ll /etc/libvirt/qemu //查看操作系统配置文件
注意:刚克隆出来的操作系统只占用了1.4G左右,因为未开机使用,所以所占用空间较少。且CentOS6中克隆后需要修改克隆服务器的网卡信息(MAC地址)而CentOS7中不需要,系统会自动修改。
对比两个操作系统的配置文件异同点:
# vimdiff centos7.0.xml centos7-2.xml
2.5.虚拟机快照
快照的作用: 1、灾难恢复 2、回滚到历中的某个状态
查看快照信息:
# qemu-img info /var/lib/libvirt/images/centos7.0.qcow2
image: /var/lib/libvirt/images/centos7.0.qcow2
file format: qcow2
virtual size: 9.0G (9663676416 bytes)
disk size: 1.3G
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: true
创建快照:
# virsh snapshot-create centos7.0
已生成域快照 1617042100
创建快照的同时定义名称:
# virsh snapshot-create-as centos7.0 centos_sshd
查询操作系统及快照列表:
# virsh snapshot-list centos7.0
查询快照文件:
# tree /var/lib/libvirt/qemu/snapshot/
查询快照详细信息:
# qemu-img info /var/lib/libvirt/images/centos7.0.qcow2
查询当前系统运行在哪个快照下:
# virsh snapshot-current centos7.0
<domainsnapshot>
<name>centos_sshd</name>
查询操作系统运行状态:
# virsh domstate centos7.0
关闭
查询系统的快照:
# virsh snapshot-list centos7.0
恢复快照:
# virsh snapshot-revert centos7.0 1463020969
删除快照:
# virsh snapshot-delete centos7.0 centos_sshd
已删除域快照 centos_sshd
再次查看,快照应该被删除:
# virsh snapshot-list centos7.0
常见问题及解决方案:
1.通过命令"# cat /proc/cpuinfo | grep vmx" 查看centos系统不支持虚拟化的解决方案:
解决此问题的前提条件:
cpu支持Inter VT-X或AMD虚拟化技术(当虚拟机能够安装centos x64位系统时,表示支持虚拟化)
物理机下,VMware Workstation能安装64位CentOS系统,处理器为Inter i7 ,且支持Inter VT-X虚拟化技术,物理机BIOS中已打开Inter虚拟化开关,既然能安装64位系统,说明物理机BIOS中支持虚拟化开关已打开。
通过命令"# cat /proc/cpuinfo | grep pae" 能够查看到信息出现,说明此服务器目前支持版半虚拟化
全虚拟化为vmx(inter)、svm(AMD)
解决方案:
在workstation上实现嵌套虚拟化,需要编辑物理机上centos虚拟机的vmx文件,找到虚拟机安装文件,带有.vmx后缀,最后一行修改或添加以下内容即可解决问题:
vhv.enable = "TRUE"
验证问题是否解决:
# cat /proc/cpuinfo | grep vmx //如出现信息则表示解决问题
搭建好kvm之后创建虚拟机时卡在第五步不动
需要编辑 /usr/share/virt-manager/virtManager/baseclass.py 将其中涉及Gdk.Cursor.new_from_name行注释掉
#cursor = Gdk.Cursor.new_from_name(gdk_window.get_display(), "progress")
#gdk_window.set_cursor(cursor)
#cursor = Gdk.Cursor.new_from_name(gdk_window.get_display(), "default")
#gdk_window.set_cursor(cursor)
同样编辑 /usr/share/virt-manager/virtManager/asyncjob.py 将其中涉及 Gdk.Cursor.new_from_name 行注释掉:
#gdk_window.set_cursor(
#Gdk.Cursor.new_from_name(gdk_window.get_display(), "progress"))
重新启动virt-manager