《KVM实战》读书笔记

虚拟化

分类

技术手段

软件虚拟化 硬件虚拟化
含义 纯软件的环境模拟执行客户机的指令,如 QEMU 硬件本身提供能力让客户机指令独立执行,不需要 VMM 截获重定向,如 Intel VT
实现 二进制翻译(不同指令集的二进制代码转换) 1.(x86 实现)提供略微受限的硬件运行环境(non-root mode),无需翻译再执行 2.VMM 运行在 root mode,具备硬件的完整访问控制权限;仅在部分情况下,客户机指令需要被 VMM 截获处理再返回 non-root mode
优缺点 虚拟化性能差,软件复杂度高;支持各种平台(二进制翻译支持) 性能接近于原生系统,简化了 VMM 的设计结构

虚拟化程度

半虚拟化:

  • 客户机意识到自己运行在虚拟化环境内,需做相应的修改配合 VMM
  • 性能提升,VMM 软件复杂度降低;不太依赖硬件虚拟化的支持,支持跨平台
  • virtio,宿主机/VMM 和客户机需要相应的安装驱动

全虚拟化:

  • 客户机 OS 无改动,需要模拟完整的、和物理平台一模一样的平台提供给客户机
  • 增加了 VMM 的复杂度,软件实现的全虚拟化性能差
  • 硬件虚拟化辅助的全虚拟化性能反超半虚拟化

软件框架

判断标准:VMM 是直接位于硬件之上还是在一个宿主操作系统上
Type1:

  • native/bare-metal hypervisor,直接控制硬件资源及客户机
  • Xen, VMware Esx

Type2:

  • 运行在宿主机 OS 上,通常就是以进程的形式存在
  • KVM, VMWare Workstation

硬件虚拟化

(TODO)

CPU 虚拟化

内存虚拟化

I/O 虚拟化

KVM 介绍

定位

  • 采用硬件虚拟化全虚拟化解决方案
  • 基于内核,通过加载模块使内核本身成为 Hypervisor
  • Type2 Hypervisor

特性

内存管理

  • 客户机物理内存就是宿主机内普通进程的虚拟内存,这意味着 linux 内存管理的机制全部可以应用到客户机内存管理上
  • 早期实现:GVA->GPA->HVA->HPA;GVA->GPA:页表,GPA->HPA:影子页表
  • 现在的实现:通过硬件识别的数据结构算出 GPA 到 HPA 的转换关系,如 EPT/NPT

存储和镜像

  • 可使用 linux 支持的任意存储来存虚拟机镜像,支持按需分配、稀疏存储
  • 原生磁盘格式为 qcow2,支持快照、压缩、加密

其他

  • 实时迁移,用户透明,支持状态存储及恢复
  • 支持混合虚拟化(virtio,pci passthrough)
  • 资源可伸缩,95%原生性能

功能框架

image.png

概述

  • 一个 Guest VM 对应 Host 中的一个 qemu 进程,一个 Guest vCpu 对应进程中的一个 qemu 线程
  • IO 处理线程是单独的,在一个线程组内
  • 客户机(进程)由内核调度,借用进程调度的手段实现不同客户机的权限限定优先级等功能
  • QEMU 实现硬件设备模拟(透传除外),截获并对物理设备驱动进行操作

核心组成

KVM 内核模块
  • 主要负责 CPU 和内存的虚拟化,所有 Guest 与唯一的内核模块进行交互
  • 分为处理器架构无关(kvm)和有关(kvm_intel)的两个部分
QEMU 用户态工具
  • 提供设备模拟的功能,ioctl syscall 与内核态 kvm 模块交互
  • qemu 本身具备完整的虚拟机实现(cpu/mem 虚拟化)
  • 支持 virtio 协议的设备模拟,实现了 virtio 的虚拟化后端

其他相关组件

  • vhost-net:替代 virtio-net
  • open vswitch:多层虚拟交换机
  • dpdk
    • 网络应用中数据包的高性能处理,运行在用户空间,绕过内核协议栈对数据包的处理
    • 提升小包等网络处理能力,可与 vhost-uset 结合使用
  • spdk:高存储性能支持,驱动运行在用户态实现零拷贝、轮询替代传统的中断模式、无锁设计
  • 管理工具
    • libvirt:kvm 虚拟化管理的工具和应用程序接口,事实上的虚拟化接口标准
    • virsh:命令行工具
    • virt-manager:图形化管理软件
    • openstack:云管理平台

KVM 操作

准备

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# bios中确认打开Intel VT/VT-d
# cpu标志确认虚拟化支持
grep -E "svm|vmx" /proc/cpuinfo

# kvm模块加载
modprobe kvm
modprobe kvm_intel
lsmod | grep kvm

# 检查控制接口文件
ls -l /dev/kvm

# 默认安装的qemu版本比较老,编译安装最新版本的
git clone git://git.qemu.org/qemu.git

# 编译配置所需
yum install -y python3 ninja-build gcc

# 进行配置,只安装x86_64客户机支持
./configure --target-list=x86_64-softmmu

旧版本需要安装 qemu-kvm,新版本 qemu 增加 –enable-kvm 选项即可

使用

1
2
3
4
5
6
7
8
# 以raw格式创建一个大小20G的盘,默认按需分配
qemu-img create -f raw rhel7.img 20G

# ls -lh | grep rhel7.img
-rw-r--r-- 1 root root 20G Jun 28 11:57 rhel7.img

# du -sh rhel7.img,按需分配,实际占用为0
0 rhel7.img

libvirt

定位

  • 对 KVM 虚拟机进行管理的工具应用程序接口
  • 也提供了对虚拟化网络和存储的管理
  • 主要作为连接底层 Hypervisor 和上层应用程序的一个中间适配层

交互框架

image.png

  • 通过基于驱动程序的架构实现多种 Hypervisor 的支持
  • 屏蔽底层 Hypervisor 的细节,为上层提供统一的稳定的 API

组成和功能

组成

应用接口编程接口库,守护进程(libvirtd),命令行管理工具(virsh)
libvirtd:可运行在 root 或普通用户权限下,root 用户权限支持所有管理操作,普通用户则受限

功能

  1. 域管理:域生命周期管理,多种设备的热插拔
  2. 远程节点管理:支持多种网络远程传输类型连接运行了 libvirtd 的物理节点
  3. 存储管理:管理不同类型的存储,支持远程管理
  4. 网络管理:管理物理和逻辑网络接口
  5. 提供稳定可靠高效的应用程序接口

XML 配置

CPU 配置

vcpu:cpu 个数

  • vcpu.cpuset: 指定允许执行的物理 CPU

features:CPU 或其他硬件特性的开关
cpu.mode:

  • custom:个性化设置
  • host-model:根据物理 CPU 特性选择一个最接近的标准 CPU 型号
  • host-passthrough:暴露 CPU 物理特性给 Guest

cputune:绑核、CPU 时间加权配置等等

内存配置

memory:可使用内存的最大值
currentMemory:启动时分配的内存
devices.memballoon:内存 balloning 调节

Guest OS 和 Boot 配置

os.tpye:GuestOS 类型,kvm 中为 hvm
os.boot:guest vm 启动设备配置

网络配置

interface.type: bridge,桥接网络;network,NAT 网络;user,用户模式网络;hostdev,设备直接分配给 Guest

存储配置

disk.type: file/block(块设备)/dir/network,磁盘来源类型
disk.device:floppy/disk(默认值)/cdrom/lun,Guest 内使用
disk.source:磁盘来源,和 type 配合使用
disk.driver:hypervisor 提供的磁盘驱动,name=qemu
disk.target:暴露给 Guest 的总线类型和设备名称
disk.address:Guest 内的 PCI 总线地址

其他配置

域配置

domain.type:虚拟化类型,xen/kvm/qemu/lxc…
domain.id: guest 唯一 id
domain.name/uuid/…: 元数据

QEMU 模拟器配置

device.emulator:使用的设备模型模拟器,绝对路径

图形显示

devices.graphics:连接 Guest 的图形显示方式,vnc/sdl/rdp…

声卡/显卡

devices.sound:模拟声卡
devices.video:模拟显卡,vram 代表显存,heads 屏幕序号

串口和控制台

devices.serial:串口,target 指 Guest 内串口编号,source 指 Host 内的虚拟 pts 终端号
devices.console:控制台配置,type=serial,Guest 内类型

输入设备

devices.input:qemu 模拟的输入设备,mouse/keyboard/tablet

PCI 控制器

domain.controller:类型有 usb/pci/virtio-serial

libvirt api

Hypervisor 连接(virConnect)
域管理(virDomain)
节点管理(virNode)
网络管理(virNetowrk)
存储卷管理(virStorageVol):域的镜像文件管理
存储池管理(virStoragePool):本地、网络共享、iSCSI 文件系统以及 LVM 分区管理
事件管理(virEvent):事件机制支持,注册后事件发生后可收到通知
数据流管理(virStream):数据流传输

libvirt uri

本地

格式:driver[+transport]:///[path][extral-param]
示例
qemu:///session
qemu+unix:///session
qemu:///system
qemu+unix:///system

远程

格式:driver[+transport]://[uesr@][host][:port]/[path][extral-param]
示例
qemu+ssh://root@example.com/system
qemu+ssh://user@example.com/session
qemu://example.com/system(TLS 连接)
qemu+tcp//example.com/system(非加密 TCP)

其他工具

virsh: 相关操作命令[https://libvirt.org/manpages/virsh.html]
virt manager:图形化管理[https://virt-manager.org/]
virt viewer:图形化控制台[https://linux.die.net/man/1/virt-viewer]

其他

注意点

新版本 qemu 编译安装的时候依赖 gcc 7.5+版本

问题

设备模型
桥接网络和 NAT 网络的区别
用户模式网络:qemu 软件模拟的网络协议栈,宿主机中没有虚拟网络接口连接到网桥
istio-iptables

Ref

https://www.cnblogs.com/music-liang/p/12900457.html