1. 概述
什么是虚拟化?
- 虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。
- 在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互相不影响,从而显著提高计算机的工作效率
- 虚拟化使用软件的方法重新定义划分 IT 资源,可以实现 IT 资源的动态分配、灵活调度、跨域共享,提高 IT 资源利用率
虚拟化通过什么软件实现资源分配?
- 主要通过Hypervisor来实现
通过Hypervisor实现的虚拟化分类:
-
全虚拟化
- Hypervisor 直接安装在物理机上,多个虚拟机在 Hypervisor 上运行。Hypervisor 实现方式一般是一个特殊定制的 Linux 系统。Xen 和 VMWare 的 ESXi 都属于这个类型
- 全虚拟化对硬件虚拟化功能进行了特别优化,性能上比半虚拟化要高
-
半虚拟化
- 物理机上首先安装常规的操作系统,比如 Redhat、Ubuntu 和 Windows。
- Hypervisor 作为 OS 上的一个程序模块运行,并对虚拟机进行管理。KVM、VirtualBox 和 VMWare Workstation 都属于这个类型
- 半虚拟化因为基于普通的操作系统,会比较灵活,比如支持虚拟机嵌套。嵌套意味着可以在KVM虚拟机中再运行KVM
什么是kvm?
- KVM(Kernel-based Virtual Machine)全称是基于内核的虚拟机
- KVM 是一个开源软件,基于内核的虚拟化技术,实际是嵌入系统的一个虚拟化模块,通过优化内核来使用虚拟技术,该内核模块使得 Linux 变成了一个Hypervisor,虚拟机使用 Linux 自身的调度器进行管理
- KVM 自 Linux 2.6.20 之后逐步取代 Xen 被集成在Linux 的各个主要发行版本中,使用 Linux 自身的调度器进行管理
- KVM有一个内核模块叫 kvm.ko。KVM 本身只关注虚拟机调度和内存管理这两个方面。IO 外设的任务交给 Linux 内核和 Qemu
kvm通过什么来管理?
- Libvirt 就是 KVM 的管理工具
- Libvirt 除了能管理 KVM 这种 Hypervisor,还能管理 Xen,VirtualBox 等
- Libvirt 包含 3 个东西:后台 daemon 程序 libvirtd、API 库和命令行工具 virsh
- libvirtd是服务程序,接收和处理 API 请求
- API 库使得其他人可以开发基于 Libvirt 的高级工具,比如 virt-manager,这是个图形化的 KVM 管理工具
- virsh 是我们经常要用的 KVM 命令行工具
2. 部署KVM
在做下面的步骤前请确保你的cpu虚拟化功能已经开启。并且防火墙和selinux已经关闭
2.1 安装kvm
验证CPU是否支持KVM
//如果显示vmx(Intel)或svm(AMD)的字样,就说明CPU的支持kvm
[root@node2 ~]# egrep -o 'vmx|svm' /proc/cpuinfo
vmx
配置yum源
[root@node1 ~]# curl -o /etc/yum.repos.d/CentOS7-Base-163.repo e-163.repo
[root@node1 ~]# sed -i 's/\$releasever/7/g' /etc/yum.repos.d/CentOS7-Base-163.repo
[root@node1 ~]# sed -i 's/^enabled=.*/enabled=1/g' /etc/yum.repos.d/CentOS7-Base-163.repo
[root@node1 ~]# yum -y install epel-release
安装kvm及依赖包
[root@node2 ~]# yum -y install qemu-kvm qemu-kvm-tools qemu-img virt-manager libvirt libvirt-python libvirt-client virt-install virt-viewer bridge-utils libguestfs-tools
配置kvm网桥
//虚拟机中我们一般都是和公司的其他服务器在同一个网段,所以我们需要把KVM服务器的网卡配
置成桥接模式。这样的话KVM的虚拟机就可以通过该桥接网卡和公司内部其他服务器处于同一网段
//这里我的网卡是ens33,所以用br0来桥接ens33网卡
[root@node2 ~]# cd /etc/sysconfig/network-scripts/
[root@node2 network-scripts]# cp ifcfg-ens33 ifcfg-br0
[root@node2 network-scripts]# vim ifcfg-br0
TYPE=Bridge
NM_CONTROLLED=no
BOOTPROTO=static
NAME=br0
DEVICE=br0
ONBOOT=yes
IPADDR=192.168.207.130
NETMASK=255.255.255.0
GATEWAY=192.168.207.2
DNS1=192.168.207.2
[root@node2 network-scripts]# vim ifcfg-ens33
TYPE=Ethernet
BOOTPROTO=static
NAME=ens33
DEVICE=ens33
ONBOOT=yes
BRIDGE=br0
NM_CONTROLLED=no
[root@node2 ~]# systemctl restart network
启动服务