一、基础知识
- CPU的工作机制
随着云计算的兴起,虚拟化作为云计算的组成部分也火了一把,但虚拟化并不是什么新技术,早在上世纪70年代虚拟化技术就已经出现。传统的CPU由4个环组成,分为:环0--环3,环0只与内核通信,执行特权指令,而环3工作在用户空间,环1、环2预留,每当用户空间发起特权请求时,会立即激活内核空间,此时用户与内核空间的切换称为软中断,用户空间的所有特权指令都必须通过系统调用的方式来完成 - 全虚拟化、半虚拟化和CPU辅助虚拟化
虚拟化按照实现方式分为:全虚拟化、半虚拟化和CPU辅助的虚拟化,其特点如下:
2.1 全虚拟化
物理机的系统(以下简称OS)运行在环0,虚拟机系统(以下简称GuestOS)运行在环1,但它以为自己运行在环0,每当GuestOS要执行特权指令时由于内核拒绝与环0之外的CPU环交互,所以位于环0的OS需要捕获并翻译GuestOS的特权指令提交给内核,全虚拟化的代表产品为vmware workstation
2.2 半虚拟化
与全虚拟化GuestOS以为自己运行在环0不同,半虚拟化的GuestOS明确知道自己运行在环1,所以当它要运行特权指令时会将特权指令直接交由OS来进行处理,省掉了OS捕获的过程,但由于需要让GuestOS知道自己运行在环1,就需要修改内核,Windows系统由于是不开源的所以不支持半虚拟化,代表产品为KVM、Zen
2.3 CPU辅助虚拟化
Intel和AMD在硬件层面对CPU进行了对虚拟化的支持,相当于OS运行在环-1,GuestOS运行在环0,通过VMM(virtual machine manager)来对虚拟机进行管理,代表产品为vmware esxi
二、KVM、Zen及Docker的实现原理
- Docker介绍
通过上文知道每一个虚拟机都有一个独立的GuestOS,这种方式的优点是保证了系统的隔离性,但每个虚拟机都需要有GuestOS,不仅产生了不必要的性能消耗,又因为所有GuestOS的特权指令都需要经过GuestOS用户空间-->GuestOS内核空间-->OS内核空间的2道转换,降低了效率,Docker就是给予上述基础产生的。
Docker的实现是将用户空间隔离成一个个的容器,所有容器公用底层的内核空间而不再创建GuestOS,所以这种方式的响应速度不但快还降低了性能开销,缺点就是由于共用内核空间,如果一个容器内的程序损坏了内核则该宿主机上的其他Docker也会受牵连 - Zen介绍
Zen是KVM出现前普遍被采用的一种虚拟化技术,但是由于其实现方式一直不被Linux的作者李纳斯接受,其实现方式实在原有的Linux系统上安装Zen后重启操作系统,安装的Zen相当于另一个内核,重启时以Zen的内核启动,原有的Linux内核成为了一个特权域(dm0),Zen上的每一个虚拟机称为一个domain,所有虚拟机的特权请求需要通过dm0来完成,Linux沦为小弟的实现方式李纳斯本人必然不会接受 - KVM介绍
KVM也有domain的概念,不同于Zen喧兵夺主的方式,采用一种柔和的方式实现,它在Linux系统之上安装qemu后,原有的Linux系统就变成了可以实现虚拟化的系统,dm0则是原来root的用户空间,所有特权指令还是通过dm0来实现
这种实现方式由于李纳斯本人的推广而兴起,但是qemu本身只能够实现CPU和内存的虚拟化,I/O的虚拟化则由libvirtd来实现,所以KVM本身只是虚拟化的加速器而非虚拟化本身
三、实验说明
本次实验系统版本为CentOS7.3,使用桥接的方式创建一台KVM虚拟机,关于桥接模式此处做一些说明:所谓桥接模式就是创建一个设备模拟原先物理网卡的IP地址,而原先物理机的网卡此时当成一个交换机,将其工作于混杂模式(接受所有Mac地址),将交换机与模拟出的网卡相关联
四、操作步骤
- 安装图形界面和字体
[[email protected] ~]# yum install dejavu-sans-fonts.noarch
[[email protected] ~]# yum groupinstall "X Window System" - 确认CPU是否支持虚拟化
[[email protected] ~]# grep vmx /proc/cpuinfo - 安装并启动服务
[[email protected] ~]# yum install libvirt virt-manager virt-viewer qemu-kvm
[[email protected] ~]# systemctl start libvirtd.service - 创建桥接模式(要先关闭NetworkManager)
[[email protected] ~]# systemctl stop NetworkManager
[[email protected] ~]# systemctl disable NetworkManager
[[email protected] ~]# virsh iface-bridge ens32 br0 --no-stp
[[email protected] network-scripts]# cat ifcfg-br0DEVICE="br0" ONBOOT="yes" TYPE="Bridge" BOOTPROTO="none" IPADDR="172.16.10.10" NETMASK="255.255.255.0" GATEWAY="172.16.10.1" STP="off"
[[email protected] network-scripts]# cat ifcfg-ens32
DEVICE=ens32 ONBOOT=yes BRIDGE="br0"
- 启动图形界面创建虚拟机
[[email protected] ~]# virt-manager
如果虚拟机鼠标键盘无法使用需要将Display改为VNC并添加一个Input设备,至此,操作完成
原文地址:http://blog.51cto.com/arkling/2127934
时间: 2024-11-08 14:46:26