1. 什么是镜像
虚拟机镜像是包含一个虚拟磁盘的单个文件,该虚拟磁盘上安装了可引导操作系统。镜像是云主机的系统盘模板, 镜像可以理解为主机的系统盘(一块硬盘)。镜像与ISO的不用 可以理解为ISO安装光盘和电脑c盘的差别。从ISO安装系统及应用到c盘中(镜像文件),最终得到镜像文件。本文将介绍镜像制作的相关基础知识,并介绍如何去制作一个镜像。
2. 镜像的常见格式
镜像常见的格式如下表所示:
镜像格式 |
介绍 |
QCOW2 |
QCOW2格式镜像是QEMU模拟器支持的一种磁盘镜像,是用一个文件的形式来表示一块固定大小的块设备磁盘。与普通的RAW格式镜像相比,QCOW2格式有如下几个特性:支持更小的磁盘占用。支持写时拷贝(CoW,Copy-On-Write),镜像文件只反映底层磁盘变化。支持快照,可以包含多个历史快照。支持压缩和加密,可以选择ZLIB压缩和AES加密。 |
VMDK |
VMDK是VMware创建的虚拟硬盘格式。一个VMDK文件代表VMFS(云服务器文件系统)在云服务器上的一个物理硬盘驱动。 |
VHD |
VHD是微软提供的一种虚拟硬盘文件格式。VHD文件格式可以被压缩成单个文件存放到宿主机的文件系统上,主要包括云服务器启动所需的文件系统。 |
VHDX |
微软在Windows Server 2012中的Hyper-V引入的一个新版本的VHD格式,称为VHDX。与VHD格式相比,VHDX具有更大的存储容量。它在电源故障期间提供数据损坏保护,并且优化了磁盘结构对齐方式,以防止新的大扇区物理磁盘性能降级。 |
RAW |
RAW格式是直接给云服务器进行读写的文件。RAW不支持动态增长空间,是镜像中I/O性能最好的一种格式。 |
QCOW |
QCOW通过二级索引表来管理整个镜像的空间分配,其中第二级的索引用了内存CACHE技术,需要查找动作,这方面导致性能的损失。QCOW优化性能低于QCOW2,读写性能低于RAW。 |
VDI |
VDI是Oracle公司Virtual BOX虚拟化软件所用的硬盘镜像文件格式,支持快照。 |
QED |
QED格式是QCOW2格式的一种改进,存储定位查询方式和数据块大小与QCOW2一样。但在实现CoW(Copy-On-Write)的机制时,QED将QCOW2的引用计数表用了一个重写标记(Dirty Flag)来替代。 |
3. 镜像制作流程
下图绘制了镜像制作的基本流程,本文将制作一个QCOW2的虚机镜像,操作流程如下:
(1)创建虚机
用户需要基于ios或已有镜像文件启动虚机。在创建虚机前,需要需提前安装配置qemu-kvm、libvirt、libguestfs-tools、virt-install等工具,用于启动虚机。除此之外:用户在进行镜像制作时,需要首先准备好ios文件或镜像文件。
【操作步骤】
1)cd /var/lib/libvirt/images
2)使用wget命令下载网站上的镜像,wget -o +镜像地址
3) 以下载的为IOS镜像为例子,我们使用virt-install启动虚机
virt-install \
--connect qemu:///system --name centos7 --arch aarch64 \
--vcpu 2 --memory 1024 --debug \
--disk path=/var/lib/libvirt/images/centos7.qcow2,format=qcow2,device=disk,bus=virtio \
--channel unix,mode=bind,target_type=virtio,name=org.qemu.guest_agent.0 \
--network default,model=virtio \
--graphics vnc,listen=0.0.0.0 \
--cdrom /var/lib/libvirt/images/CentOS-7-aarch64-Minimal-2009.iso
参数介绍:
--connect 指定连接hypervisor的uri,qemu:///system表示以系统默认的方式连接本地的kvm系统
--virt-type 指定虚拟化类型,使用qemu还是kvm
--name 指定虚拟机名字
--ram 指定虚拟机内存
--vcpus 指定虚拟机的cpu数量
--arch 指定虚拟机架构
--network 指定网络和网络类型,具体参数和解释可以通过"man virt-install"来查询,default网络和virtio模式是常用选项
--disk 指定磁盘,该参数可以指定多个。
path为宿主机上的具体路径;
format为磁盘文件格式;
device为磁盘类型,可以是cdrom或者disk;
bus是磁盘总线,可以是virtio(虚拟机显示vda)或者ide(虚拟机显示sda)
--cdrom 指定cdrom路径,这个参数只能指定一个,如需多个光盘,其他的要通过--disk参数指定
--graphics 指定图形显示,装机时通过该图形界面连接到虚拟机并手动执行操作,listen表示允许谁连接该图形化界面,0.0.0.0表示允许所有地址访问。
--video 指定graphic的类型,比如spice,qxl等等
--channel 指定和宿主机通信的套接字文件,比如这里创建一个unix套接字,路径为/var/lib/libvirt/qemu/window2008_datadancer.agent,guest里名字为org.qemu.guest_agent.0
--os-type 指定guest的操作系统类型
--boot 启动方式,可以指定为cdrom(光盘),fd(软盘),hd(硬盘),network(网络)启动,也可以分别指定kernel和initrd等,具体查看man virt-install。
2)执行了以上命令后,在宿主机上新启动一个终端,输入 virsh vncdisplay <虚拟机名称或id>,查到虚拟机的vnc地址,在自己的笔记本上使用vnc viewer连接vnc并进行登录。(需关闭防火墙)
其他常用virsh命令:
virsh start centos7 #启动一个域中存在但处于关机状态的虚拟机
virsh shutdown centos7 #关闭虚拟机centos7(相当于虚拟机执行poweroff命令)
virsh destroy centos7 #关闭虚拟机centos7(相当于拔电源强制关机)
virsh list #列出当前host上active状态的虚拟机,、
(2)定制化安装、配置
用户可在启动的虚机中,完成需要的组件、服务的安装,实现自定义的系统配置。
在这里我们可以配置好yum源,安装一些软件。
【操作步骤】
1)配置yum源
cd /etc/yum.repos.d/
vi CentOS-Base.repo
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?
release= $releasever&arch=$basearch&repo=os
baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
2)安装软件
yum install tar -y
yum install pam-devel
(3)导出镜像文件
对镜像虚机关机,初始化信息,导出镜像文件
【操作步骤】
virsh undefine centos7 export LIBGUESTFS_BACKEND=direct; virt-sysprep -a centos7.qcow2 unset LIBGUESTFS_BACKEND
至此,用户可得到一个名称为centos7.qcow2的自定义虚机镜像。