虚拟机镜像制作及启动
实验目的及要求
-
基于课程中讲授的虚拟化基本原理和技术,掌握虚拟化环境的搭建方法,熟悉了解一些典型的虚拟化平台的命令
-
比较虚拟机镜像格式 raw 和 qcow2 的区别
-
比较虚拟机和容器的镜像大小 、启动速度等方面的区别
实验环境
宿主机配置为 Intel® Core™ i7-8700 CPU @ 3.20GHz,8G Mem,1T HDD,Intel VT 硬件虚拟化已开启
真实系统为 Ubuntu 20.04.1 x64 (Linux version 5.13.0-39-generic)
实验步骤
第一步:Ubuntu 下使用 KVM QUME 创建虚拟机镜像,启动虚拟机,安装 KVM/QUME 的相关组件
- 查看 CPU 是否支持硬件虚拟化
grep -E "(vmx|svm)" /proc/cpuinfo
# 有内容输出则表示支持
- 安装相关软件包
sudo apt install qemu-kvm virtinst virt-manager virt-viewer
- qemu-kvm 是KVM与QEMU的结合,KVM负责CPU虚拟化+内存虚拟化,QEMU模拟其它IO设备
- virtinst 是安装 libvirt 的依赖包
- virt-manager 是一个虚拟系统管理器 可以提供 GUI 的虚拟化管理界面
- virt-viewer 是一个用于显示虚拟机的图形控制台的工具
- 查看 KVM 内核模块是否已加载
sudo lsmod | grep kvm
- 执行下面的命令看 KVM 是否安装成功
kvm-ok
- 查看 Hypervisior 上虚拟机的列表(确认相关软件已经正确安装)
virsh -c qemu:///system list
# virsh list: 显示正在运行的虚拟机
第二步:在当前目录下创建虚拟机磁盘文件(法一:命令行方式,以Ubuntu为例)
- 创建虚拟机磁盘文件的存储目录(名字随意)
mkdir vmm
- 在当前目录(上一步所创建的目录)下创建虚拟机磁盘文件(命名和大小根据实际情况决定)
cd vmm
qemu-img create -f qcow2 ubuntu.img 10G
# 输出显示:Formatting 'ubuntu.img', fmt=qcow2 size=10737418240 cluster_size=65536 lazy_refcounts=off refcount_bits=16
- qemu-img 是 QEMU 的磁盘管理工具 在 qemu kvm 源码编译后就会提供这个命令
- create [-f fmt] [-o options] filename [size] 创建一个格式为 fmt 大小为 size 文件名为 filename 的镜像文件,fmt 可以为 qcow 2 或 raw
第三步:下载一个系统盘,启动虚拟机,并插入系统盘,安装操作系统
- 下载系统盘(以创建Ubuntu虚拟机为例,此处下载Ubuntu 21.10镜像文件)
mkdir img
cd img
wget https://mirrors.aliyun.com/ubuntu-releases/21.10/ubuntu-21.10-desktop-amd64.iso
- 启动虚拟机,并插入系统盘,安装操作系统
# qemu-system-x86_64 -hda $(path to ubuntu.img) -cdrom $(path to os iso file) -enable-kvm -boot d -m 1024
qemu-system-x86_64 -hda ~/vmm/ubuntu.img -cdrom ~/img/ubuntu-21.10-desktop-amd64.iso -enable-kvm -boot d -m 2048
- -hda 指定了硬盘是哪个虚拟磁盘,这里用之前创建的 ubuntu.img
- -boot 指定启动的时候从磁盘、硬盘、光驱还是网络上启动,我们安装的时候选择从光驱启动,所以用 d
- -m 指定虚拟机使用的内存大小,单位是 MB,默认是 128 MB,根据需求自定义分配内存大小,所以此处分配 2048 MB


第四步:安装完毕系统镜像后,以命令行的形式配置虚拟机的启动参数并启动虚拟机
qemu-system-x86_64 ~/vmm/ubuntu.img -m 2048

第五步:以 XML 的形式配置虚拟机的启动参数(法二:XML配置文件方式,以Centos为例)
- 也可以采用 libvirt 来管理虚拟机,首先创建并编辑文件centos.xml
cd vmm
qemu-img create -f qcow2 centos.img 10G
mkdir config
cd config
vim centos.xml
- centos.xml 具体内容如下
<domain type='kvm'>
<name>centos</name>
<!--虚拟机名称-->
<memory>2097152</memory>
<!-- 最大内存2G,单位为KB -->
<currentMemory>2097152</currentMemory>
<!-- 可用内存2G -->
<vcpu>4</vcpu>
<!-- 虚拟cpu个数 -->
<os>
<type arch='x86_64' machine='pc'>hvm</type>
<boot dev='cdrom'/>
<!-- cdrom 从光盘启动 安装成功后需改为 hd 从磁盘启动 -->
</os>
<features>
<acpi/>
<apic/>
<pae/>
</features>
<clock offset='localtime'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<!-- 文件镜像格式 -->
<source file='/home/zys/vmm/centos.img'/>
<!-- 目的镜像路径,需提前创建好目标镜像文件 -->
<target dev='hda' bus='ide'/>
</disk>
<disk type='file' device='cdrom'>
<source file='/home/zys/img/CentOS-7-x86_64-Minimal-2009.iso'/>
<!-- 光盘镜像路径 -->
<target dev='hdb' bus='ide'/>
</disk>
<input type='mouse' bus='ps2'/>
<graphics type='vnc' port='-1' autoport='yes' listen = '0.0.0.0' keymap='en-us'/>
<!-- vnc方式登录,端口号自动分配,自动加1 -->
</devices>
</domain>
- 定义虚拟机
sudo virsh define ~/vmm/config/centos.xml
- 启动虚拟机
sudo virsh start centos
- 查看虚拟机是否启动成功
sudo virsh -c qemu:///system list

- 通过 virt-viewer 使用虚拟机 (参数 5 为上一步中 list 中 id,根据实际情况修改)
virt-viewer -c qemu:///system 5

- 安装成功后需要修改 centos.xml 中的启动方式,从而正常使用虚拟机
sudo virsh shutdown centos
# 关闭当前运行的虚拟机
virsh edit centos
# 选择自己常用的编辑器后,将启动方式从 cdrom 修改为 hd,从硬盘启动
sudo virsh define /etc/libvirt/qemu/centos.xml
# 重定义使配置生效
sudo virsh start centos
sudo virsh -c qemu:///system list
virt-viewer -c qemu:///system 6

第六步:以图形化方式安装虚拟机(法三:图形化方式,以Windows为例)
sudo virt-manager
- 图形化界面,操作简单上手,按照流程步骤走就行



第七步:查看磁盘文件镜像信息,并将镜像格式转换为 raw 格式,并且比较两种镜像格式之间的区别(补充)
cd vmm
qemu-img info ubuntu.img
qemu-img convert -f qcow2 -O raw ubuntu.img ubuntu-raw.img
qemu-img info ubuntu-raw.img
- convert [-c] [-f fmt] [-O output_fmt] [-o options] filename [filename 2 […]] output_filename
- 将 fmt 格式的 filename 镜像文件根据 options 选项转换为格式为 output_fmt 的名为 output_filename 的镜像文件
- raw 和 qcow2 格式比较:
- raw:裸格式,创建时就需要指定存储容量,占用全部容量,不支持动态扩容,不支持快照,但虚拟机 I/O 效率更高一些,性能会更好;
- qcow2:写时复制,开始只占用少许容量,支持动态扩容,支持压缩,支持AES加密,支持快照,性能也较好。

实验小结
通过对 qemu-kvm 的使用,对虚拟化的基本原理和技术有了更加清晰的认识与理解。通过3种不同的创建虚拟机的方式,让我对虚拟机平台的一些常见命令更加熟练运用。命令行方式创建镜像灵活方便,适合即建即用,但是不会生成相关虚拟机配置文件,不便于后期管理与使用;编辑XML配置文件方式创建镜像比较直接,适合熟练上手之后使用,后期修改维护也很方便;图形化方式创建镜像更加方便快捷,容易上手,对新手友好,但相关灵活度不行,后期维护修改可以结合XML配置文件方式修改。对于虚拟机镜像的 raw 和 qcow2 这两种格式,通过实验比较感受出,raw 性能更加突出,qcow2 更加灵活,容量占用小,支持的功能更加广泛。