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应用程序将视频显示映射到宿主机。
QEMU原本只是一个纯软件实现的虚拟化系统,并不属于KVM的一部分。由于QEMU是由纯软件实现的,其性能相对来说较为低下。QEMU的代码中包含了整套的虚拟机实现,包括处理器虚拟化,内存虚拟化,以及KVM需要使用到的虚拟设备,如网卡,显卡等。KVM在QEMU的基础上做了修改。虚拟机运行期间,QEMU会通过KVM模块提供的系统调用进入内核,由KVM负责将虚拟机置于处理的特殊模式运行。当虚拟机进行I/O操作时,KVM会从上次系统调用的出口处返回QEMU,由QEMU来负责解析和模拟设备。
- 支持CPU和内存超分
- 支持半虚拟化I/O
- 支持热插拔
- 支持对称多处理
- 支持实时迁移
- 支持PCI设备直接分配和单根I/O虚拟化
- 支持内核同页合并
- 支持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 | 用于连接到虚拟机的图形控制台 |
yum install *packagename*
单个安装上面的程序包# yum group install "Virtualization Host" "Virtualization Client"
# 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工作之前,必须加载相关的内核模块。
# lsmod | grep kvm
如果KVM模块正确载入,会在控制台输出如下信息:
kvm_intel 183621 0
kvm 586948 1 kvm_intel
kvm_amd 59887 0
kvm 261575 kvm_amd
分别对应Intel和AMD的处理器。如果未看到输出信息,请检查CPU是否支持虚拟化功能,如果支持,检查虚拟化功能是否开启。检查方法如下:
# egrep 'svm|vmx' /proc/cpuinfo
其中:svm(Secure virtual machine),是AMD的CPU的虚拟化技术AMD-V,vmx是Intel的CPU虚拟化技术Intel-VT
检查是否有正常的输出,如果有,表示支持虚拟化功能。此外,还需要在开机时进入BIOS或UEFI菜单进行配置,开启虚拟化。
载入对应的模块:
# modprobe kvm_intel
或
# modprobe kvm_amd
# 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"
参数解释:
- -n(–name) 给虚拟机设置一个名字
- -m(–memory) 给虚拟机分配内存,maxmemory指定最大内存
- –vcpus 配置虚拟CPU数量,maxvcpus指定最大CPU数量
- –os-type 指定安装的操作系统类型,如Linux,Windows
- –os-variant 指定安装的操作系统的具体类型,如Centos,Redhat,WinXP
- -l(–location) 指定安装源,可以是iso镜像,也可以是网络源
- –disk 定义虚拟硬盘,常与path=/var/lib/libvirt/images/virt.img、size=size_in_GB一起使用
- –network 指定网络接口
- –graphics 指定客户机的图形显示设置,有效选项包括vnc、spice和none
- –console 配置文本控制台连接主机与客户机
- -x(–extra-args) 包含额外的数据,如kickstart文件的url地址
以上参数是配置一个虚拟机常用参数,如需获取更详细的配置参数信息,可以使用man手册页或者virt-install -h
查看
查看已经存在的域
# 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
查看