Linux虚拟机KVM详解

Linux的虚拟技术目前有KVM和Xen,Xen是运行在裸机上的虚拟化管理程序(Hypervisor),在Redhat 5及其它的发行版中,KVM已经取代了Xen,故此处不针对Xen展开说明,只细述KVM功能。

KVM(Kernel-based Virtual Machine)是基于内核的虚拟机技术,由以色列Qumranet公司开发(Qumranet在2018年被RedHat收购),是一个轻量级的虚拟化管理程序模块,该模块主要来自于Linux内核。KVM运行需要CPU支持虚拟化功能,即支持TV的Intel CPU和支持ADM-V的AMD CPU。此外,KVM需要在x86架构的计算机上才能运行。

在KVM中,虚拟机被实现为常规的Linux进程,由标准的Linux调度程序进行调度;虚拟机的每个虚拟CPU被实现为常规的Linux进程,KVM本身不执行任何硬件的模拟操作,需要用户态程序通过/dev/kvm接口设置一个客户机的虚拟服务器地址空间,向它提供模拟的I/O,通过QEMU应用程序将视频显示映射到宿主机。

kvm结构

QEMU-KVM

QEMU原本只是一个纯软件实现的虚拟化系统,并不属于KVM的一部分。由于QEMU是由纯软件实现的,其性能相对来说较为低下。QEMU的代码中包含了整套的虚拟机实现,包括处理器虚拟化,内存虚拟化,以及KVM需要使用到的虚拟设备,如网卡,显卡等。KVM在QEMU的基础上做了修改。虚拟机运行期间,QEMU会通过KVM模块提供的系统调用进入内核,由KVM负责将虚拟机置于处理的特殊模式运行。当虚拟机进行I/O操作时,KVM会从上次系统调用的出口处返回QEMU,由QEMU来负责解析和模拟设备。

KVM的功能列表

  1. 支持CPU和内存超分
  2. 支持半虚拟化I/O
  3. 支持热插拔
  4. 支持对称多处理
  5. 支持实时迁移
  6. 支持PCI设备直接分配和单根I/O虚拟化
  7. 支持内核同页合并
  8. 支持NUMA(Non-Uniform Memory Access,非一致性存储访问结构)

下面主要介绍在命令行模式下配置并启动一个KVM虚拟机:

注:以下所有操作基于Centos 7系统

与虚拟化相关的程序包

程序包 说明
qemu-kvm 主要的KVM程序包
libvirt 用于管理超级监视程序的libvirtd服务
libvirt-client 用于管理虚拟机的virsh命令和客户端API
virt-install 创建虚拟机需要的命令行工具
virt-manager GUI虚拟机管理工具(图形界面)
virt-top 虚拟机统计命令
virt-viewer 用于连接到虚拟机的图形控制台
安装KVM
  1. yum安装
    可以使用yum install *packagename*单个安装上面的程序包
    也可以使用安装程序包组的方式安装
    # yum group install "Virtualization Host" "Virtualization Client"
    
  2. 源码安装
    先安装依赖包(此处直接通过yum安装):
    # yum install gcc autoconf automake libtool glib* zlib*
    

    再下载QEMU源码编译安装

    # wget https://download.qemu.org/qemu-4.0.0.tar.xz
    # tar zvjf qemu-4.0.0.tar.xz
    # cd qemu-4.0.0
    # ./configure
    # make 
    # make install
    

    安装成功之后,可在/usr/local/bin下找到二进制文件
    为了方便使用,可以将二进制文件的路径放到环境变量中,或者创建一个软链

    # ln -s /usr/bin/qemu-system-x86_64 /usr/bin/qemu-kvm
    

    此处建议直接使用yum方式安装。

选择正确的KVM模块

大多数情况下,只要选择了正确的程序包即可,系统会自动加载合适的内核模块。KVM工作之前,必须加载相关的内核模块。

# lsmod | grep kvm

如果KVM模块正确载入,会在控制台输出如下信息:

使用virt-install命令创建虚拟机

# virt-install --name=kvm-server --memory=512,maxmemory=1024 --vcpus=1,maxvcpus=2 --os-type=linux --os-variant=rhel7 --location=/opt/iso/rhel-server-7.6-x86_64-dvd.iso --disk path=/opt/kvm/libvirt/images/rhel-server.img,size=12 --network bridge=br0 --graphics=none --console=pty,target_type=serial  --extra-args="console=tty0 console=ttyS0"

参数解释:

  1. -n(–name) 给虚拟机设置一个名字
  2. -m(–memory) 给虚拟机分配内存,maxmemory指定最大内存
  3. –vcpus 配置虚拟CPU数量,maxvcpus指定最大CPU数量
  4. –os-type 指定安装的操作系统类型,如Linux,Windows
  5. –os-variant 指定安装的操作系统的具体类型,如Centos,Redhat,WinXP
  6. -l(–location) 指定安装源,可以是iso镜像,也可以是网络源
  7. –disk 定义虚拟硬盘,常与path=/var/lib/libvirt/images/virt.img、size=size_in_GB一起使用
  8. –network 指定网络接口
  9. –graphics 指定客户机的图形显示设置,有效选项包括vnc、spice和none
  10. –console 配置文本控制台连接主机与客户机
  11. -x(–extra-args) 包含额外的数据,如kickstart文件的url地址

以上参数是配置一个虚拟机常用参数,如需获取更详细的配置参数信息,可以使用man手册页或者virt-install -h查看

通过virsh管理虚拟机

查看已经存在的域

# virsh list --all

已经创建的虚拟机 启动域

# virsh start kvm-server

关闭域

# virsh shutdown kvm-server

销毁域

# virsh destory kvm-server

取消定义域

# virsh undefine kvm-server --remove-all-storage

连接到客户会话

# virsh console kvm-server

以上均为基础操作命令,想要查看更详细的命令,请参考man手册页或者virsh --help查看