20171207 虚拟化

  • 虚拟化技术概览
  • KVM简介
  • KVM的管理操作

一、虚拟化技术概览

(一)虚拟化技术类型:

  • 主机虚拟化:xen, kvm, virtualbox
  • 容器(用户空间隔离): lxc (LinuX Container), openvz, runC
  • 系统库虚拟化:wine
  • 应用程序级虚拟化:jvm, pvm

(二)主机虚拟化

  • 主机虚拟化:虚拟机(VM)和硬件之间加了一个Hypervisor软件层,或者叫做虚拟机管理程序(VMM)
(1)CPU虚拟化需要解决的问题
  • CPU的特权机制:ring机制

    • 分为:ring0, ring1, ring2, ring3;实际只使用了ring0, ring3
    • ring0仅允许内核执行特权指令,ring3允许执行普通指令
    • 应用程序的普通指令运行在ring3上
    • 当应用程序需要执行特权指令时,应用程序调用系统调用,从用户态转换至内核态,由内核执行特权指令,并将结果返回至应用程序,然后恢复至用户态
  • CPU的模拟:emulation, ring0与ring3都虚拟化,故虚拟机的arch与物理平台的arch可以不相同,如qemu

  • CPU的虚拟:virtualization,ring0虚拟化,分为完全虚拟化和半虚拟化

    • 完全虚拟化(full-virt),GuestOS不知道自身运行于虚拟化环境中
      (a) 需要解决的问题:GuestOS发出的特权指令会影响HostOS的运行,这是不可接受

      (b) 解决方法:
      BT:二进制转换 (软件),通过hypervisor翻译Guest的特权指令,效率较低
      HVM:硬件辅助的虚拟化(硬件),硬件能够区分Guest和Host的特权指令,将两者隔离,效率较高

    • 半(准)虚拟化 (para-virt)
      GuestOS明确知道自己运行在虚拟化环境中,故不需hypervisor翻译特权指令,性能比BT模式下的完全虚拟化高,但是需要对GuestOS的内核做相应的修改

(2)内存虚拟化需要解决的问题:
  • 进程使用内存原理简介:
    线性地址:用户进程拥有自己独立的地址空间,但这个地址空间是逻辑上的,故不同用户进程的地址空间位置可能有重叠
    物理地址:真实内存空间的地址
    MMU:Memory Management Unit,内存管理单元,负责将线性地址映射为物理地址

  • MMU虚拟:

    • 软件方式:
      (a) 在hypervisor层对MMU虚拟,负责GuestOS环境的线性地址映射为物理地址
      GVA--virtual MMU-->GPA--MMU-->HPA
      (G: Guest, H: Host, V: Virtual, P: Physical, A: Address)
      (b) shadow page tables:影子页表,直接实现从GVA至HPA的映射,Hypervisor将影子页表载入到物理上的内存管理单元(MMU)中进行地址翻译
    • 硬件方式:
      Intel: EPT, Extended Page Table
      AMD: NPT, Nested Page Table
  • TLB virtualization:

    • TLB:Translation Lookaside Buffer,转换检测缓冲区,是一个内存管理单元,用于改进虚拟地址到物理地址转换速度的缓存
    • 虚拟化环境下一台虚拟主机可能误命中另一台主机的TLB缓存
    • tagged TLB:在内存地址切换时知道TLB与虚拟机的对应关系,提升虚拟机与物理机之间的数据传送及翻译转换效率
(3)IO虚拟化需要解决的问题:
  • IO虚拟化的三种方式:
    Emulation:模拟/完全虚拟化
    Para-virtualization:半虚拟化
    IO-through:IO透传,某个GuestOS能够独占使用设备

  • 磁盘虚拟化:例如,GuestOS的磁盘被虚拟为HostOS上的文件

  • 网络虚拟化:虚拟主机网卡连接至虚拟交换机
    仅主机:物理网卡的虚拟网卡连到虚拟交换机
    桥接:物理网卡直接连到虚拟交换机,物理网卡需要开启混杂模式
    NAT:物理网卡的虚拟网卡通过路由连接到虚拟交换机,并进行源地址转换

(4)主机虚拟化的类型:
  • TYPE-I:
    架构特点:在硬件级别直接运行hypervisor
    解决方案:xen, vmware ESX/ESXI

  • TYPE-II:
    架构特点:在硬件级别运行一个OS (Host OS),而此OS上运行一个VMM
    解决方案:vmware workstation, virtualbox, kvm

(三)多主机虚拟化

  • IaaS:基础设施即服务
  • PaaS:平台即服务
  • SaaS:软件即服务

二、KVM简介

(一)KVM(Kernel-based Virtual Machine)的组件:

  • kvm.ko:模块,安装本模块后的内核即成为kvm hypervisor
  • qemu-kvm:用户空间的工具程序,为kvm hypervisor模拟IO设备
  • libvirt:统一管理各虚拟化平台的管理接口

(二)KVM管理架构:C/S架构

  • Client:
    libvirt-client
    virt-manager (GUI), virsh(CLI)
  • Daemon:
    libvirt-daemon

(三)快速安装使用KVM:

  • 判断CPU是否支持硬件虚拟化:
    当今CPU都支持硬件虚拟化,主机在虚拟机环境中在CPU的设置中开启“虚拟化Intel VT-x/EPT 或 AMD-V/RVI”,才能在虚拟机中支持硬件虚拟化
    grep -i -E '(vmx|svm|lm)' /proc/cpuinfo
    vmx:Intel VT-x
    svm:AMD AMD-v
    
  • 安装kvm组件
    yum install libvirt-daemon-kvm qemu-kvm virt-manager
  • 加载kvm.ko模块
    modprobe kvm
  • 启动libvirtd服务
    systemctl start libvirtd.service
  • 打开kvm的GUI管理接口
    virt-manager

(四)KVM的组件:分为kvm.ko模块和qemu-kvm进程

(1)kvm.ko模块:
  • 通过模拟为一个字符型设备dev/kvm负责和外界交互,工作为hypervisor
  • 在用户空间可通过系统调用ioctl()与内核中的kvm模块交互,从而完成虚拟机的创建、启动、停止、删除等各种管理功能
(2)qemu-kvm进程:
  • 工作于用户空间,用于实现IO设备模拟
  • 用于实现一个虚拟机实例
  • 运行中的一个kvm虚拟机就是一个qemu-kvm进程,运行qemu-kvm程序并传递给它合适的选项及参数即能完成虚拟机启动,终止此进程即能关闭虚拟机
(3)KVM模块load进内存之后,系统的运行模式:
  • 内核模式:GuestOS执行IO类的操作时,或其它的特殊指令操作时的模式;它也被称为“Guest-Kernel”模式
  • 用户模式:Host OS的用户空间,用于代为GuestOS发出IO请求
  • 来宾模式:GuestOS的用户模式;所有的非IO类请求

三、KVM的管理操作

(一)使用virt-manager管理KVM

实验1:在虚拟机中安装kvm,使用virt-manager配置为通过PXE方式安装系统
环境准备:
1、在虚拟机环境中在CPU的设置中开启“虚拟化Intel VT-x/EPT 或 AMD-V/RVI”,才能在虚拟机中支持硬件虚拟化
2、使用XShell登录系统时,需要安装XManager并配置X协议转发,才能使用ssh -X选项登陆后,通过X协议在本地打开远程图形界面

20171207 虚拟化_第1张图片
20171207 虚拟化_第2张图片
  • 步骤1:加载kvm模块

    modprobe kvm      
    lsmod | grep kvm
    
  • 步骤2:CentOS 7创建物理桥,使用内核自带的桥接模块实现

    cd /etc/sysconfig/network-scripts/
    cp ifcfg-ens33 ifcfg-br0
    vim ifcfg-ens33     // 物理网卡端指明桥接的名称
    TYPE=Ethernet
    BOOTPROTO=static
    DEVICE=ens33
    ONBOOT=yes
    BRIDGE=br0
    
    vim ifcfg-br0    // 桥接网卡端指明IP地址等信息
    TYPE=Bridge
    BOOTPROTO=static
    IPADDR=172.18.58.230
    PREFIX=16
    DEVICE=br0
    ONBOOT=yes
    
    systemctl restart network.service
    brctl show
    

    桥接网卡br0是刚刚创建的物理桥,而桥接网卡virbr0是装载kvm.ko模块后自动生成的NAT连接,若使用PXE模式安装系统则必须配置物理桥

  • 步骤3:安装libvirt, virt-manager, qemu-kvm,并启动libvirtd服务

    yum install qemu-kvm libvirt-daemon-kvm  virt-manager
    systemctl start libvirtd.service 
    // 在另一个终端ssh远程登录kvm主机,注意使用'-X'选项允许X协议转发
    ssh -X [email protected]
    virt-manager &
    

    出现如下窗口则成功启动virt-manager

    20171207 虚拟化_第3张图片
  • 步骤4:使用virt-manager创建虚拟机,并安装操作系统

    • 创建虚拟机,选择PXE方式安装操作系统
    20171207 虚拟化_第4张图片
    • 选择安装的操作系统
    20171207 虚拟化_第5张图片
    • 配置内存和CPU设置
    20171207 虚拟化_第6张图片
    • 创建虚拟磁盘
    20171207 虚拟化_第7张图片
    • 给虚拟机命名,注意必须选中"Customize configuration before install "并选择网卡为建立的物理桥接网卡
    20171207 虚拟化_第8张图片
    • 在安装前配置中,在"Boot Options"中开启启动菜单,选中磁盘和网卡
    20171207 虚拟化_第9张图片
    • 同样在安装前配置中,在"Display VNC"中选择"VNC server",并且keymap选择"en-us",从而保证键盘使用正常
    20171207 虚拟化_第10张图片
    • 启动虚拟机,成功实现通过PXE方式安装
    20171207 虚拟化_第11张图片

(二)使用qemu-kvm管理KVM

(1)qemu-kvm命令语法:

qemu-kvm [options] [disk_image]

  • 选项类别:
    标准选项、块设备相关选项、显示选项、网络选项

  • 标准选项:

    • -machine [type=]name:-machine help来获取列表,用于指定模拟的主机类型
    • -cpu cpu:-cpu help来获取列表,用于指定要模拟的CPU型号
    • -smp n[,maxcpus=cpus][,cores=cores][,threads=threads][,sockets=sockets]:
      指明虚拟机上vcpu的数量及拓扑
    • -boot [order=drives][,once=drives][,menu=on|off] [,splash=sp_name][,splash-time=sp_time][,reboot-timeout=rb_time][,strict=on|off]
      order:各设备的引导次序:c表示第一块硬盘,d表示第一个光驱设备
      e.g. -boot order=dc,once=d:启动顺序先光驱后硬盘,只在第一次启动时通过光驱
    • -m megs:虚拟机的内存大小
    • -name NAME:当前虚拟机的名称,要惟一
  • 块设备相关的选项:

    • -hda/-hdb file:指明IDE总线类型的磁盘映射文件路径,第0和第1个
    • -cdrom file:指定要使用光盘映像文件;
    • -drive [file=file][,if=type][,media=d][,index=i] [,cache=writethrough|writeback|none|directsync|unsafe][,format=f]:
      file=/PATH/TO/SOME_IMAGE_FILE:映像文件路径
      if=TYPE:块设备总线类型,ide, scsi, sd, floppy, virtio
      media=TYPE:介质类型,cdrom和disk
      index=i:设定同一类型设备多个设备的编号
      cache=writethrough|writeback|none|directsync|unsafe:缓存方式
      format=f:磁盘映像文件的格式
  • 显示选项:
    -DISPLAY TYPE:显示的类型,sdl, curses, none和vnc

    • -nographic:不使用图形接口
    • -vga [std|cirrus|vmware|qxl|xenfb|none]:模拟出的显卡的型号
    • -vnc display[,option[,option[,...]]]]:启动一个vnc server来显示虚拟机接口
      让qemu进程监听一个vnc接口
      HOST:N,表示在HOST主机的第N个桌面号输出vnc,端口号:5900+N
    • -monitor stdio:在标准输出上显示monitor界面;
  • 网络选项:

    • -net nic[,vlan=n][,macaddr=mac][,model=type][,name=str][,addr=str][,vectors=v]
      为虚拟机创建一个网络接口,并将其添加至指定的vlan
      model=type:指明模拟出的网卡的型号,如e1000,pcnet,virtio
      macaddr=mac:指明mac地址,要求为52:54:00:XX:XX:XX,前6位固定,后六位自定义
    • -net tap[,vlan=n][,name=str][,fd=h][,fds=x:y:...:z][,ifname=name][,script=file][,downscript=dfile]:
      通过物理的TAP网络接口连接至vlan n
      script=file:启动虚拟机时要执行的脚本,默认为/etc/qemu-ifup
      downscript=dfile:关闭虚拟机时要执行的脚本,/etc/qemu-ifdown
      ifname=NAME:自定义接口名称
  • 其它选项:
    -daemonize:以守护进程运行

  • 注意:

    • 当以前台模式运行时,
      Ctrl-a, c:在console和monitor之间切换
      Ctrl-a, h:查询帮助
    • 建议Network IO, Disk IO使用半虚拟化技术,即设备类型为virtio,性能会有显著提升
(2)qemu-img建立虚拟磁盘实际应用
  • 实验2:使用qemu-img建立虚拟磁盘,使用virt-manager将系统安装至虚拟磁盘

    • 步骤1:使用qemu-img建立虚拟磁盘
    mkdir /vm/images -pv
    qemu-img create -f qcow2 -o size=120G,preallocation=metadata /vm/images/centos_test.qcow2
    
    • 步骤2:启动virt-manager
    virt-manager &
    

    大部分步骤与实验1相同,只需在创建磁盘时手动选择磁盘位置即可

    20171207 虚拟化_第12张图片

    在系统安装前配置页面中也可以看到虚拟磁盘路径

    20171207 虚拟化_第13张图片
(3)qemu-kvm建立虚拟机实际应用
  • 实验3-1:使用qemu-kvm导入系统镜像,后台运行虚拟机,打开监听端口,通过VNC协议显示控制台

    • 步骤1:使用qemu-kvm导入镜像并后台开启虚拟机
    // 一般不使用qemu-kvm安装,故需要手动在/usr/bin下建立软链接至qemu-kvm的可执行程序
    ln -s /usr/libexec/qemu-kvm /usr/bin    
    // 导入镜像
    qemu-kvm -name cirros -m 1024m -smp 2 -drive file=/vm/images/cirros-no_cloud-i386.img,if=virtio,media=disk -vnc :0 --daemonize
    ss -ntlp
    

    可以看到qemu-kvm开启了5900端口

    20171207 虚拟化_第14张图片
    • 步骤2:安装并启动vnc
    yum install tigervnc
    vncviewer :0
    
    20171207 虚拟化_第15张图片
    • 步骤3:此时只能通过kill关闭虚拟机进程
    kill -9 9193
    
  • 实验3-2:使用qemu-kvm导入系统镜像,并前台运行虚拟机

    • 步骤1:使用qemu-kvm导入镜像并前台开启虚拟机
    ln -s /usr/libexec/qemu-kvm /usr/bin  
    qemu-kvm -name cirros -m 1024m -smp 2 -drive file=/vm/images/cirros-no_cloud-i386.img,if=virtio,media=disk -nographic
    ss -ntlp
    
    20171207 虚拟化_第16张图片
    • 步骤2:切换至qemu控制台,关闭进程
    Ctrl+a h     // 查询帮助
    Ctrl+a c     // 在console和monitor之间切换
    quit         // 关闭本进程
    
    20171207 虚拟化_第17张图片
(4)qemu-kvm建立虚拟机并配置虚拟机网络
  • 实验4:qume-kvm的网络配置

    • 步骤1:在宿主机上配置网桥vnet0
    brctl addbr vnet0
    brctl show
    ip link set vnet0 up
    
    • 步骤2:在宿主机上启动虚拟机,并配置网络
    // 编辑qemu-kvm的网卡启动脚本
    vim /etc/qemu-ifup
    #!/bin/bash
    #
    bridge=vnet0
    
    if [ -n "$1" ];then
            ip link set $1 up
            sleep 1
            brctl addif $bridge $1     // 将虚拟机的网卡连接至网桥
            [ $? -eq 0 ] && exit 0 || exit 1
            else
            echo "Error: no interface specified."
            exit 2
    fi
    
    chmod +x /etc/qemu-ifup 
    qemu-kvm -name cirros1 -m 64m -smp 2 -drive file=/vm/images/cirros1.img,if=virtio,media=disk -net nic,model=virtio,macaddr=52:54:00:00:00:01 -net tap,script=/etc/qemu-ifup -vnc :0 --daemonize
    qemu-kvm -name cirros2 -m 64m -smp 2 -drive file=/vm/images/cirros2.img,if=virtio,media=disk -net nic,model=virtio,macaddr=52:54:00:00:00:02 -net tap,script=/etc/qemu-ifup -vnc :1 --daemonize
    
    • 步骤3:通过vnc协议打开虚拟机cirros1和cirros2的控制台
    vncviewer :0
    vncviewer :1
    
    • 步骤4:配置仅主机模式的虚拟主机网卡模式
      只需把虚拟主机网卡和网桥vnet0配置在一个ip网段中即可
    sudo ifconfig eth0 192.168.10.1 up      // cirros1虚拟机上配置网卡
    sudo ifconfig eth0 192.168.10.2 up      // cirros2虚拟机上配置网卡
    ifconfig vnet0 192.168.10.3 up          // 宿主机上配置网桥
    
    20171207 虚拟化_第18张图片
    20171207 虚拟化_第19张图片

    此时两台虚拟主机可以互相ping通

    20171207 虚拟化_第20张图片
    20171207 虚拟化_第21张图片

    虚拟主机和网桥之间也可以互相ping通

    20171207 虚拟化_第22张图片
    20171207 虚拟化_第23张图片
    • 步骤5:配置NAT模式的虚拟主机网卡模式
    sudo route add default gw 192.168.10.3   // 虚拟机上建立默认网关
    iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 192.168.136.230     // 宿主机上建立端口转发逻辑
    sysctl -w net.ipv4.ip_forward=1          // 宿主机上设置允许网卡进行端口转发
    

    配置网关后,虚拟机可以ping通宿主机的ip,但是无法ping通宿主机网段的其他主机

    20171207 虚拟化_第24张图片

    配置NAT后,可以ping通宿主机网段的其他主机

    20171207 虚拟化_第25张图片

(三)使用virtsh管理KVM

(1)建立虚拟机

虚拟机的生成需要依赖于预定义的xml格式的配置文件,默认文件位置/etc/libvirt/qemu/
其生成工具有两个:virt-manager, virt-install

(2)virsh命令
  • 语法:virsh [OPTION]... COMMAND [ARG]...

  • 子命令的分类:
    Domain Management (help keyword 'domain'):域管理,域即为虚拟主机
    Domain Monitoring (help keyword 'monitor'):域监控
    Host and Hypervisor (help keyword 'host'):宿主机管理
    Interface (help keyword 'interface'):网络接口管理
    Networking (help keyword 'network'):网络管理
    Network Filter (help keyword 'filter')
    Snapshot (help keyword 'snapshot'):快照管理
    Storage Pool (help keyword 'pool')
    Storage Volume (help keyword 'volume')

  • Domain Management (help keyword 'domain')

    • 创建虚拟机:
      create:从xml格式的配置文件创建并启动虚拟机,作用相当于define+start
      define:从xml格式的配置文件创建虚拟机

    • 启动:
      start:启动
      reboot:重启

    • 停止:
      destroy:强行关机
      shutdown:关机

    • 删除:undefine

    • 暂停:
      suspend/resume:暂停于内存中,或继续运行暂停状态的虚拟机
      save/restore:保存虚拟机的当前状态至文件中,或从指定文件恢复虚拟机

    • 连接至指定domain的控制台:console

    • 域的设备资源管理:
      cpu-stats, vcpuinfo, vcpucount, setvcpus, vcpupin, setmaxmem, setmem

      • 磁盘设备的热插拔:attach-disk/detach-disk

      • 网络接口设备的热插拔:attach-interface/detach-interface

  • Domain Monitoring (help keyword 'monitor')
    domiflist:网络接口状况
    domblklist:块设备状况

  • 实验5:virsh管理kvm虚拟机

    • 虚拟机的创建、删除、暂停、恢复
    // 有一台配置好的kvm虚拟机,复制其xml配置文件并作修改
    virsh dumpxml cirros1      // 查看正在运行虚拟机的xml配置文件
    cd /etc/libvirt/qemu
    cp cirros1.xml cirros2.xml
    vim cirros2.xml
    cirros2                                  // 修改虚拟主机名
    4b78e9d4-46b6-460c-a7da-cc3c1b8e5b77     // 修改UUID
                   // 修改导入的镜像
                        // 修改MAC地址
    // 按照xml文件建立并开启虚拟机,按Ctrl+]退出当前虚拟机终端
    virsh create /etc/libvirt/qemu/cirros2.xml --console
    // 查看当前正在运行的虚拟机
    virsh list
    // 进入虚拟机cirros2的终端
    virsh console cirros2
    // 虚拟机暂存内存
    virsh suspend cirros2
    virsh list --all      // 查看处于活动和非活动状态的所有虚拟主机
    // 虚拟机从内存恢复
    virsh resume cirros2
    virsh list
    // 保存当前虚拟机状态至文件
    virsh save cirros2 /tmp/cirros2  --running
    virsh list --all
    // 从文件恢复虚拟机
    virsh restore /tmp/cirros2
    virsh list --all
    // 关闭虚拟机
    virsh destroy cirros2  --graceful
    // 删除虚拟机
    virsh undefine cirros2
    

    按照配置文件成功启动虚拟机,可以看到MAC地址按照配置文件要求设置

    20171207 虚拟化_第26张图片

    虚拟机暂存内存和从内存中恢复

    20171207 虚拟化_第27张图片

    虚拟机状态存储至磁盘和从磁盘恢复

    20171207 虚拟化_第28张图片

    关闭虚拟机

    20171207 虚拟化_第29张图片
    • 虚拟机的设备管理
    // 查看虚拟机的相关硬件统计信息
    virsh cpu-stats cirros1
    virsh vcpuinfo cirros1
    virsh vcpucount cirros1
    // 给虚拟机热加载磁盘
    qemu-img create -f qcow2 -o size=20G,preallocation=metadata  /vm/images/test_disk.qcow2
    virsh attach-disk cirros1 /vm/images/test_disk.qcow2 vdb
    virsh domblklist cirros1     // 查看虚拟机的块设备情况
    // 给虚拟机热卸载磁盘
    virsh detach-disk cirros1 vdb
    virsh domblklist cirros1
    // 给虚拟机热添加网卡
    brctl show
    virsh attach-interface cirros1 bridge br0
    virsh domiflist cirros1     // 查看虚拟机的网卡设备情况
    // 给虚拟机热卸载网卡
    virsh detach-interface cirros1 bridge --mac 52:54:00:8c:b5:e1
    virsh domiflist cirros1
    

    分别在宿主机和虚拟机上都查看到了磁盘vdb的添加和删除
    宿主机上

    20171207 虚拟化_第30张图片

    虚拟机上

    20171207 虚拟化_第31张图片

    分别在宿主机和虚拟机上都查看到了网卡eth1的添加和删除
    宿主机上

    20171207 虚拟化_第32张图片

    虚拟机上

    20171207 虚拟化_第33张图片

你可能感兴趣的:(20171207 虚拟化)