一、目的
本文适用于指导运维人员开展自定义镜像制作工作,明确操作规范,保障镜像制作的合规性与可用性
二、镜像格式介绍
虚拟机的磁盘格式指的是底层的磁盘镜像格式,虚拟设备厂商有不同的格式来放置虚拟机磁盘镜像包含的信息。
具体可设置的格式如下面所示:
- raw:无结构的磁盘镜像格式;如果是一个无扩展名的磁盘文件,那么这个磁盘文件可能是裸格式。
- vhd:VHD磁盘格式,一种被VMware, Xen, Microsoft, VirtualBox, 以及其他虚拟机管理程序通用的磁盘格式。
- vmdk:能被多钟虚拟机管理程序支持的通用格式。
- vdi:能被 VirtualBox 虚机管理程序和 QEMU 模拟器支持的格式。
- iso:光盘数据内容的归档格式,例如CD-ROM。
- qcow2:由 QEMU 模拟器支持,能动态扩展以及支持写时复制特性。
- aki:Amazon 内核镜像。
- ari:Amazon ramdisk 镜像。
- ami:Amazon 虚机镜像。
MStack创建虚拟机目前支持的是qcow2和raw格式镜像,由于底层是MStore存储文件系统对raw格式镜像性能支持优于qcow2格式,所以建议制作镜像为raw格式上传平台。
三、镜像制作环境准备
镜像制作的环境准备包括如下内容:
- 本手册镜像制作环境采用Linux自带的软件工具virt-manager,需要准备一台物理机安装Linux系统,手动安装virt-manager软件包,可以安装virt-manager GUI图形化界面可更加方便制作镜像。
- 要创建openstack镜像,需要客户机操作系统的安装CD或DVD ISO文件。
- 需要访问虚拟化的工具。可以使用KVM或者GUI桌面虚拟化工具(如VMware Fusion,VirtualBox或virt-manager)。
- 创建虚拟机镜像时,需要连接到虚拟机管理程序的图形控制台,该控制台充当虚拟机的显示器,并允许您使用键盘和鼠标与客户机操作系统的安装程序进行交互。
- KVM可以使用VNC (虚拟网络计算)协议或更新的 SPICE协议公开图形控制台 。我们将在此处使用VNC协议,因为您更有可能找到可在本地桌面上运行的VNC客户端。
3.1 环境相关要求:
# 制作Rcoky、openeuler等系统镜像需要安装比较新版本的环境
系统版本: CentOS Linux release 7.9.2009 (Core)
qemu-kvm版本: QEMU emulator version 1.5.3 (qemu-kvm-1.5.3-175.el7_9.6), Copyright (c) 2003-2008 Fabrice Bellard
Libvirt版本: libvirtd (libvirt) 4.5.0
virt-manager版本: 1.5.0
qemu-img版本: qemu-img version 1.5.3, Copyright (c) 2004-2008 Fabrice Bellard
virtio-win版本:
windows7、8、10、2k8、2k12、2k16可使用virtio-win-0.1.141,下载地址:https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.141-1/virtio-win-0.1.141.iso
windows2k19可使用virtio-win-0.1.164,下载地址:https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.164-2/virtio-win-0.1.164.iso3.2 安装GNOME Desktop、qemu、libvirt、virt-manager环境
本手册采用的是Centos系统搭建镜像制作环境,需要在该Linux系统上安装virt-manager工具,安装virt-manager之前需要先安装Linux系统的GNOME Desktop,具体操作命令如下:
# 安装GNOME Desktop命令:
yum groupinstall "X Window System" -y
yum groupinstall GNOME Desktop -y
#安装qemu、libvirt、virt-manager工具:
yum install qemu-kvm -y
ln -sv /usr/libexec/qemu-kvm /usr/bin/
yum -y install libvirt libvirt-client virt-manager virt-install virt-viewer
systemctl start libvirtd.service
systemctl status libvirtd
# 命令行输入startx进入linux图形化管理界面
startx
# 命令行输入virt-manager打开virt-manger X11 GUI 图形界面
virt-manager3.3 virt-manager网络配置
关于virt-manager,我们这里建议直接在界面桥接到宿主机上,创建的虚拟机能够连接到外网,或者可以连接到指定的yum源,方便安装各种工具包,制作环境。
3.4 安装VNC server
Linux系统安装图形化界面之后,为了方便我们可以远程操作建议在宿主机系统上安装vncserver,以下是安装vncserver的操作步骤(命令参数详解之后会整理细致):
安装vnc-server工具包:
yum install vnc-server -y
执行命令启动vnc-server:
vncserver
更改配置文件允许VNC client端链接登录到VNC server端:
vim /root/.vnc/xstartup
在文件最后加入如下参数:
VNCSERVERS="1:root"
VNCSERVERARGS[1]="-geometry 800x600"
执行命令重新启动vnc-server:
vncserver -kill :1
vncserver四、镜像制作好后的操作
4.1 镜像格式转换
qemu-img convert 命令可以转换多种格式的镜像文件,包括 raw, qcow2, VDI (VirtualBox), VMDK (VMware) and VHD (Hyper-V)。
| 镜像格式 | qemu-img参数 |
|---|---|
| raw | raw |
| qcow2 | qcow2 |
| VDI (VirtualBox) | vdi |
| VMDK (VMware) | vmdk |
| VHD (Hyper-V) | vpc |
下面示例转换 centos7.4.dsk raw格式镜像到 qcow2 镜像格式。
# qcow2转raw
qemu-img convert -f qcow2 -O raw centos7.9.qcow2 centos7.4.raw4.2 镜像上传与镜像元数据设定
openstack image create –fil <file_name> --container-format bare --disk-format raw --property hw_qemu_guest_agent=yes --property os_distro=<image_type> --property os_admin_user=root --public <image_name>五、示例:Centos镜像制作
5.1.系统安装步骤(重点)
- 在terminal界面通过virt-manger命令启动virt-manger GUI操作界面:

2、点击创建虚拟机,选择安装操作系统,配置CPU,内存和硬盘相关信息。
- 点击创建虚拟机:

- 选择加载本地镜像安装方式:

- 选择本地安装镜像和系统版本:

- 设置cpu和ram大小:

设置根磁盘大小:
- 安装系统时,勾选自定义虚拟机配置:

- 设置系统启动从IDE虚拟光驱引导启动(点击“Apply”应用):

- 设置该虚拟机存储disk为qcow2格式:

- 选择光驱链接文件:

- 选择系统键盘模式(点击“Apply”应用):

- 开始安装:

3.等待出现引导界面,对安装软件包和用户密码,然后等待系统安装成
4.安装结束之后重启之前设置系统启动顺序从disk启动
5.安装虚拟化需要的特定服务(见下一节支撑服务安装)
5.2 虚拟化支撑服务安装
1.系统基础配置:
- 配置yum源:
在/etc/yum.repo.d/目录下设置好自己需要的源文件 - 关闭防火墙以及SELINUX
systemctl stop firewalld systemctl disable firewalld sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config setenforce 0 - 更改ssh配置:
# 修改ssh配置文件 PermitRootLogin yes UserDNS no 关闭ssh去解析用户端域名,加快链接速度 systemctl restart sshd - 修改网卡配置信息(删除mac信息等)
先配置成静态网络方便后续安装软件,最后再按如下要求配置编辑/etc/sysconfig/network-scripts/ifcfg-eth0,具体配置信息可以参考: TYPE=Ethernet DEVICE=eth0 ONBOOT=yes BOOTPROTO=dhcp NM_CONTROLLED=no - 禁用zeroconf路线,允许实例访问元数据:
echo "NOZEROCONF=yes" >> /etc/sysconfig/network - 设置nova console-log:
要使nova console-log能将实例启动过程输出到实例启动日志中,需要配置相关参数,具体操作步骤如下:
编辑/etc/default/grub文件,在参数GRUB_CMDLINE_LINUX后面加上console=tty0 console=ttyS0,115200n9:
然后执行grub2-mkconfig -o /boot/grub2/grub.cfg命令让其配置生效:
2.安装ACPI服务):
为了让虚拟化层能重启和关闭虚拟机,必须在虚拟机内安装并运行 acpid 服务,在 CentOS虚拟机内运行以下命令安装 ACPI 服务并配置为系统启动时自动启动:3.安装linux rootfs resizeyum install acpid -y # 设置自启动命令 systemctl enable acpid
由于在云平台上我们要根据自己的需求设置根磁盘大小,安装linux rootfs resize的作用就是使实例启动时可以自动扩展根分区大小,不然跟分区大小就会固定在制作镜像时的大小。4.安装cloud-inityum install cloud-utils-growpart -y
虚拟机的主机名,密码和网络等相关配置需要去medata-server或者config-driver里面去获去,而完成这部分操作的就是cloud-init去完成:5.安装qemu-guest-agent:yum install cloud-init -y
虚拟机实例需要在管理界面动态调整root用户的密码,需要安装并启用这个agent在处理这个操作,具体安装操作如下:yum install qemu-guest-agent -y
5.3 系统配置
5.3.1 系统设置和检查
1.删除垃圾用户和目录:
userdel test
userdel centos
rm –rf /home/test
rm –rf /home/centos2.查看当前时区和时是否正确
date –R
hwclock
ll /etc/localtime
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
同时确保 /etc/sysconfig/clock 为 ZONE=“Asia/Shanghai”
编辑 /etc/adjtime 修改最后一行为 UTC3.设置系统密码最短长度:
grep ^PASS_MIN_LEN /etc/login.defs
vi /etc/login.defs
PASS_MIN_LEN 84.清空系统history记录:
history –w
echo >.history
history –c5.在KVM管理界面关闭主机
6.拷贝虚拟机磁盘并转换格式(默认路径/var/lib/libvirt/images/)
7.上传镜像
5.3.2 cloud-init配置文件及参数参考
cloud-init配置文件具体配置:
cat /etc/cloud/cloud.cfg
users:
- default
disable_root: 0
mount_default_fields: [~, ~, 'auto', 'defaults,nofail', '0', '2']
resize_rootfs_tmp: /dev
ssh_deletekeys: 0
ssh_genkeytypes: ~
syslog_fix_perms: ~
cloud_init_modules:
- migrator
- bootcmd
- write-files
- growpart
- resizefs
- set_hostname
- update_hostname
- update_etc_hosts
- rsyslog
- users-groups
- ssh
cloud_config_modules:
- mounts
- locale
- set-passwords
- rh_subscription
- yum-add-repo
- package-update-upgrade-install
- timezone
- puppet
- chef
- salt-minion
- mcollective
- disable-ec2-metadata
- runcmd
cloud_final_modules:
- rightscale_userdata
- scripts-per-once
- scripts-per-boot
- scripts-per-instance
- scripts-user
- ssh-authkey-fingerprints
- keys-to-console
- phone-home
- final-message
- power-state-change
system_info:
default_user:
name: root
lock_passwd: true
gecos: Cloud User
groups: [wheel, adm, systemd-journal]
sudo: ["ALL=(ALL) NOPASSWD:ALL"]
shell: /bin/bash
distro: rhel
paths:
cloud_dir: /var/lib/cloud
templates_dir: /etc/cloud/templates
ssh_svcname: sshd
# vim:syntax=yaml最后编辑:束鹏 更新时间:2026-01-30 09:36