KVM

  1. kvm为2型虚拟化

    • kvm.ko 负责cpu和内存的虚拟化支持(负责cpu、内存、中断控制台、时钟)
    • linux内核和qemu负责外设和io的支持(模拟网卡、显卡、存储控制台和硬盘等)
    • 一个 KVM 虚机在宿主机中其实是一个 qemu-kvm 进程,与其他 Linux 进程一样被调度;虚机中的每一个虚拟 vCPU 则对应 qemu-kvm 进程中的一个线程;KVM 需要实现 VA(虚拟内存) -> PA(物理内存) -> MA(机器内存)之间的地址转换
  2. 虚拟化实现方式

    • 纯软件仿真(qemu)
    • 虚拟化翻译(hypervisor:kvm)
      • 没有硬件辅助的全虚拟化(基于二进制翻译的全虚拟化):hypervisor运行在ring0;guest os运行在ring1;guest app运行在ring3;机制:异常、捕获、翻译(guest os执行特权指令的时候)
      • 半虚拟化:hypervisor运行在ring0;guest os不能运行在ring0上,需要对kernel进行修改,将运行在ring0上的指令转为调用hypervisor;guest app运行在ring3上(xen,虚拟机知道自己运行在虚拟化上)
      • 硬件辅助的全虚拟化:Intel VT和AMD-V创建了一个新的ring -1单独给hypervisor使用;hypervisor运行在ring -1;guest os运行在ring0;guest app运行在ring3(kvm)
    • 容器技术
  3. Storage Pool

    • KVM 所有可以使用的 Storage Pool 都定义在宿主机的 /etc/libvirt/storage 目录下,每个 Pool 一个 xml 文件
      virsh pool-list --all
      virsh pool-define /etc/libvirt/storage/HostVG.xml
      virsh pool-start HostVG
  4. virt-install

    • 通过kickstart安装
      virt-install --name=vm --disk path=/vm/vm-disk.qcow2 --vcpus=1 --ram=1024 --network network=default --graphics vnc,listen=0.0.0.0 --os-type=linux --os-variant=rhel6 --location /iso/centos.iso --extra-args="ks=http://xxxx/mini.txt"
    • 通过pxe安装
      virt-install --hvm --connect qemu:///system --network=bridge:br0 --pxe --graphics spice --name=rhel6-machine --ram=1024 --vcpu=2 --disk path=/var/lib/libvirt/images/rhel6.img,size=50
  5. 半虚拟化驱动virtio

    • 使用半虚拟化驱动virtio,是为了提高内存、硬盘、网络的性能
      • 没有virtio的io访问路径:虚拟机app -> 虚拟机驱动 -> KVM(捕获)-> QEMU(IO控制器 & 设备) -> 宿主机(设备驱动) -> 物理机硬件
      • 使用virtio的io访问路径:虚拟机app -> VirtIO驱动(安装到虚拟机中) -> 传输Transport -> QEMU(VirtIO控制器 & 设备) -> 宿主机(设备驱动) -> 物理机硬件
    • 安装方式
      • 红帽RHEL 4.8之后自动安装和加载virtio驱动
      • Windows操作系统需要额外安装virtio的驱动,可以从社区上获取,virtio-win:http://www.linux-kvm.org/page/Downloads
  6. Qemu guest agent
    • 如果VM中安装了guest agent,Host就可以使用libvirt向VM发送命令,例如 冻结、释放文件系统、虚拟机CPU的热添加或移除等
    • 安装方式
      • RHEL/Centos中安装包:qemu-guest-agent-xxx.rpm
      • Windows:在virtio-win中有安装包
    • 通过libvirt来使用Qemu guest agent(增强功能)
      • virsh shutdown --mode=agent // 比--mode=acpi更加安全地关闭操作系统
      • virsh snapshot-create -quiesce // 在创建快照之前将缓存的内容刷入到磁盘
      • ....