KVM
虚拟化,即为在一物理机上,同时运行多个独立的操作系统。由 hypervisor (虚拟机管理程序) 创建一抽象层以完成对硬件的控制与分离,并为 guest (客户机) 提供对硬件的访问途径。
KVM 即为 Kernel-based Virtual Machine 的缩写,是一种 Linux 完全虚拟化的解决方案,并借由处理器硬件的特性,为客户机提供底层的实体抽象,以至于使客户机并不知自己身处虚拟化的环境中。
现在 KVM 已被设计为一种接口——可装载的内核模块 kvm.ko,提供虚拟化的核心底层架构。
但是,KVM 本身并不完成全部设备的模拟,转由 QEMU 通过 /dev/kvm 接口以完成对外围设备的模拟。
来源:https://www.slideshare.net/NOVL/virtualization-with-kvm-kernelbased-virtual-machine
图中,QEMU 与 KVM 模块共同将虚拟机在用户空间中启动为一进程,并传递给它合适的选项即参数,并与其他普通进程一样,由内核进行统一调度。
操作
首先你需要在 VMware 上,编辑处于关机状态的 Linux 虚拟机 (后文将称为 Linux 主机) 的处理器设置,开启如下选项:
后开启 Linux 主机,执行如下命令:
egrep -i '(vmx|svm|lm)' /proc/cpuinfo
当结果中前二者有其一,第三个必有时,则已确定 Linux 主机的硬件支持虚拟化。接着下载必要软件:
yum install qemu-kvm qemu-img tigervnc-y
并将 qemu-kvm 链接至环境变量 PATH 所包含的路径下:
ln -s /usr/libexec/qemu-kvm /usr/bin
创建保存镜像的目录,并下载最小安装版的 Centos:
mkdir /data/images -pv
wget -O /data/images/centos.iso https://mirrors.aliyun.com/centos/7.7.1908/isos/x86_64/CentOS-7-x86_64-Minimal-1908.iso
现在,你为将要创建的虚拟机提供本地的存储空间,一个文件即可——也就是为其创建磁盘映像文件 (disk image),之后虚拟机的全部数据都将存储在其中;
如下命令,在当前目录下创建一个 qcow2 格式大小 3G 名为 testCentos.qcow2 的磁盘映像文件:
mkdir /vm/qemu -pv
cd /vm/qemu
qemu-img create -f qcow2 testCentos.qcow2 10G
在安装之前,你来对比一下目前所产生的两个文件信息:
传递给 qemu-kvm 合适的参数,丢至后台,进行安装任务:
qemu-kvm -smp 2 -m 1024 -drive file=/vm/qemu/testCentos.qcow2 -cdrom /data/images/centos -boot dc &
- -smp:设置逻辑 cpu 的数量
- -m:设置客户机内存大小
- -drive file=:定义客户机启动时的磁盘映像
- -cdrom:设置 CD-ROM 文件
- -boot:指明引导顺序;其中 d 表示 CD-ROM 优先;c 为硬盘优先
再使用刚下载的 tigervnc 进行连接,
vncviewer :0
至此,你已经成功在虚拟机中创建了虚拟机;如上文所说,qemu-kvm 所创建的虚拟机在其宿主机中表现为一进程:
ps aux
# 你将不难在结果中找到它,你我部分参数不一致
# USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
# root 36901 7.8 0.8 1483360 39824 pts/1 Sl+ 20:09 0:00 qemu-kvm -smp 2 -m 1024 -drive \
file=/vm/qemu/testCentos.qcow2 -cdrom /data/images/centos -boot dc
安装程序完成后,你需要根据 ps 命令获得到的进程号杀掉该进程;以后启动时,去掉从 cdrom 引导的参数即可:
kill -9 YOURPID
qemu-kvm -smp 1 -m 1024 -drive file=/vm/qemu/testCentos.qcow2
libvirt
上文中你艰难地创建客户机、杀掉客户机再运行客户机,每次还需要记住各种参数、磁盘映像文件在哪里,而且还没涉及到网络,同时你也缺少对客户机的管控能力。
libvirt 是一套为管理虚拟化而设计的 API、守护进程与程序包,也可以用来构建更为高级的管理工具。
virsh 与 virt-manager 就是两个libvirt API 之上的管理工具;前者使用命令行接口,后者使用图形接口。
virt-install 则是一款用于配置新虚拟机的命令行接口工具。
yum install libvirt virt-install -y
接下来同样是客户机的安装命令:
virt-install --connect qemu:///system --virt-type kvm --name test1 \
--vcpus 1 --memory 1024 \
--disk path=/var/lib/libvirt/images/test1,size=10,format=qcow2 \
--location /data/images/centos \
--network bridge=virbr0 \
--graphics none --extra-args='console=ttyS0'
# 或者 --graphics vnc 则与上文连接方式一致
进入非图形界面的安装程序后,你要将一条条的 ‘!’ 内容进行设置,成功变为 ‘x’ 后即可进行安装。
再说 virsh 常用命令的使用前,还有个相关的重要概念:域 (domain),libvirt 中的一个域也就是一个运行在 hypervisor 上的客户机实例。
virsh hlep # 查看帮助信息
virsh list --all # 列出全部的域
virsh shutdown # 优雅地关闭一个域
virsh destroy # 破坏一个域
virsh define # 从 xml 文件中定义一个域
virsh start # 启用域
virsh console # 连接至客户机控制台
virsh undefine # undefine a domain
再加上这两个重要的目录,我们可以通过修改 xml 文件的方式再次创建新的客户机:
- 域的默认存储目录:/var/lib/libvirt/images/
- 域的默认配置文件目录:/etc/libvirt/qemu/
首先进行复制磁盘映像文件与 xml 文件:
cp /var/lib/libvirt/images/test1 /var/lib/libvirt/images/test2
cd /etc/libvirt/qemu
cp test1.xml test2.xml
再对复制的 test2.xml 文件进行修改,修改内容有:
- 修改 name 标签值为 test2
- 删除 UUID 行
- 修改 source file 标签值为 /var/lib/libvirt/images/test2
- 修改 mac address 标签值为任意不重复值
上图从 xml 文件定义虚拟机成功后,执行启动命令,并且获取控制台。
至于图形界面的 virt-manager,没有命令行那么炫酷,在这里就不做过多的介绍了。
参考
https://blog.youkuaiyun.com/bbwangj/article/details/80465320#1.%20KVM%20%E4%BB%8B%E7%BB%8D
http://smilejay.com/kvm_theory_practice/
https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/7/html/virtualization_getting_started_guide/index
https://developer.ibm.com/articles/cl-hypervisorcompare-kvm/
https://stackoverflow.com/questions/21462581/what-is-the-difference-between-full-para-and-hardware-assisted-virtualization
https://www.linux-kvm.org/page/Main_Page