一、基础知识

  1. CPU的工作机制
    随着云计算的兴起,虚拟化作为云计算的组成部分也火了一把,但虚拟化并不是什么新技术,早在上世纪70年代虚拟化技术就已经出现。传统的CPU由4个环组成,分为:环0--环3,环0只与内核通信,执行特权指令,而环3工作在用户空间,环1、环2预留,每当用户空间发起特权请求时,会立即激活内核空间,此时用户与内核空间的切换称为软中断,用户空间的所有特权指令都必须通过系统调用的方式来完成
    初识openstack之1——虚拟化介绍及KVM虚拟机
  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、Xen
    2.3 CPU辅助虚拟化
    Intel和AMD在硬件层面对CPU进行了对虚拟化的支持,相当于OS运行在环-1,GuestOS运行在环0,通过VMM(virtual machine manager)来对虚拟机进行管理,代表产品为vmware esxi

二、KVM、Xen及Docker的实现原理

  1. Docker介绍
    通过上文知道每一个虚拟机都有一个独立的GuestOS,这种方式的优点是保证了系统的隔离性,但每个虚拟机都需要有GuestOS,不仅产生了不必要的性能消耗,又因为所有GuestOS的特权指令都需要经过GuestOS用户空间-->GuestOS内核空间-->OS内核空间的2道转换,降低了效率,Docker就是给予上述基础产生的。
    Docker的实现是将用户空间隔离成一个个的容器,所有容器公用底层的内核空间而不再创建GuestOS,所以这种方式的响应速度不但快还降低了性能开销,缺点就是由于共用内核空间,如果一个容器内的程序损坏了内核则该宿主机上的其他Docker也会受牵连
  2. Xen介绍
    Xen是KVM出现前普遍被采用的一种虚拟化技术,但是由于其实现方式一直不被Linux的作者李纳斯接受,其实现方式实在原有的Linux系统上安装Xen后重启操作系统,安装的Xen相当于另一个内核,重启时以Xen的内核启动,原有的Linux系统成为了一个特权域(dm0),Xen上的每一个虚拟机称为一个domain,所有虚拟机的I/0请求需要通过dm0来完成,Linux沦为小弟的实现方式李纳斯本人必然不会接受
    初识openstack之1——虚拟化介绍及KVM虚拟机
  3. KVM介绍
    KVM也有domain的概念,不同于Xen喧兵夺主的方式,采用一种柔和的方式实现,KVM是Linux内核中的一个模块,当内核装载了该模块之后就变成了支持hypervisor的内核,原先的root用户空间以一个dm0的形式存在,所以对于KVM来说,装载了KVM的内核和root空间是一个完整的hypervisor
    初识openstack之1——虚拟化介绍及KVM虚拟机
    这种实现方式由于李纳斯本人的推广而兴起,但是KVM本身只能够实现CPU和内存的虚拟化,I/O的虚拟化则由qemu来实现,qemu是一个模拟器,可以模拟各种CPU和I/O设备,qemu本身就可以实现模拟虚拟机,之所以要结合KVM,是因为模拟本身的开销很大,所以CPU和内存交由KVM虚拟实现(KVM模块装载后表现为/dev/kvm的字符设备)
    初识openstack之1——虚拟化介绍及KVM虚拟机

    三、实验说明

    本次实验系统版本为CentOS7.3,网络拓扑如下图所示:
    初识openstack之1——虚拟化介绍及KVM虚拟机

四、操作步骤

  1. 安装图形界面和字体
    [root@node1 ~]# yum install dejavu-sans-fonts.noarch
    [root@node1 ~]# yum groupinstall "X Window System"
    初识openstack之1——虚拟化介绍及KVM虚拟机
  2. 确认CPU是否支持虚拟化,KVM模块是否加载
    [root@node1 ~]# grep vmx /proc/cpuinfo
    初识openstack之1——虚拟化介绍及KVM虚拟机
    [root@bogon ~]# lsmod | grep kvm
    初识openstack之1——虚拟化介绍及KVM虚拟机
    [root@bogon ~]# ll /dev/kvm
    初识openstack之1——虚拟化介绍及KVM虚拟机
  3. 安装并启动服务
    [root@node1 ~]# yum install libvirt virt-manager virt-viewer qemu-kvm
    [root@node1 ~]# systemctl start libvirtd.service
  4. 创建桥接模式(要先关闭NetworkManager)
    [root@node1 ~]# systemctl stop NetworkManager
    [root@node1 ~]# systemctl disable NetworkManager
    [root@node1 ~]# virsh iface-bridge ens32 br0 --no-stp
    初识openstack之1——虚拟化介绍及KVM虚拟机
    [root@node1 network-scripts]# cat ifcfg-br0
    DEVICE="br0"
    ONBOOT="yes"
    TYPE="Bridge"
    BOOTPROTO="none"
    IPADDR="172.16.10.10"
    NETMASK="255.255.255.0"
    GATEWAY="172.16.10.1"
    STP="off"

    [root@node1 network-scripts]# cat ifcfg-ens32

    DEVICE=ens32
    ONBOOT=yes
    BRIDGE="br0"
  5. 启动图形界面创建虚拟机
    [root@node1 ~]# virt-manager
    如果虚拟机鼠标键盘无法使用需要将Display改为VNC并添加一个Input设备,至此,操作完成
    初识openstack之1——虚拟化介绍及KVM虚拟机
    初识openstack之1——虚拟化介绍及KVM虚拟机

补充说明

  1. 模拟和虚拟
    所谓虚拟指的是创建的虚拟机CPU类型必须和宿主机保持一致,而模拟则允许虚拟机CPU为各种类型
  2. I/O虚拟化说明
    CPU和内存本身就是通过分片与分页的方式实现了虚拟化,所以在虚拟化中I/O的虚拟化实现相对要复杂,I/O主要指网络与磁盘I/O,按照类型可以分为全虚拟化、半虚拟化和直通3种,以下以磁盘I/O举例说明
    2.1 全虚拟化
    vm中的磁盘在host系统中是以一个文件的形式存在,全虚拟化需要先经过vm中磁盘的驱动,然后在经过host磁盘驱动最终完成数据写入
    初识openstack之1——虚拟化介绍及KVM虚拟机
    2.2 半虚拟化
    半虚拟化的vm因为知道自己是个虚拟机所以通过一个接口将数据写入host的文件中,再通过host磁盘驱动最终写入磁盘内
    初识openstack之1——虚拟化介绍及KVM虚拟机
    2.3 直通
    而直通直接是将物理磁盘映射给vm,vm此时只有host磁盘的驱动
    初识openstack之1——虚拟化介绍及KVM虚拟机
    3.虚拟机的网络模式
    每一个虚拟网卡在创建时创建的是一对(可以理解为网线的2个头),一头在虚拟机上,另一头在所选网络模型的虚拟交换机上,虚拟机的网络连接可以分为以下几种方式:
    3.1 虚拟机间通信
    每个vm都有一个模拟的网卡,当选择网络模式是vm间通信时,此时是创建了一个虚拟交换机,需要通信的vm都连接到了该交换机上
    初识openstack之1——虚拟化介绍及KVM虚拟机
    3.2 仅主机通信
    仅主机通信是指vm可以与host之间进行通信,他的实现方式是为host创建了一个虚拟网卡(workstation上表现为vmnet1之类)并于虚拟交换机进行连接
    初识openstack之1——虚拟化介绍及KVM虚拟机
    3.3 NAT模式
    所谓NAT模式就是在仅主机通信模式上将host主机的虚拟网卡与物理网卡相关联,并且启用内核间转发功能,将vm的网关指向host的虚拟网卡,此时vm与外界通信时就通过SNAT的方式完成
    初识openstack之1——虚拟化介绍及KVM虚拟机
    开启dncp功能后每一个vm都会获取到一个IP地址但又不会和host主机冲突,他的实现方式是在host主机上启动启动了一个dhcp服务进程,将vm划分成一个个独立的网络名称空间,不同的空间之间相互隔离
    初识openstack之1——虚拟化介绍及KVM虚拟机
    3.4 桥接模式
    桥接模式是将host的物理网卡当成一个交换机,并且为host虚拟出一个接口,该接口拥有原host的IP地址,虚拟接口与交换机拥有相同的mac地址,vm的虚拟网卡直接关联到交换机上,交换机必须开启混杂模式(二层通信是基于mac地址进行,如果交换机不工作在混在模式,则不会接收非自己mac地址外的信息,vm就无法和外界PC通信)
    初识openstack之1——虚拟化介绍及KVM虚拟机