news 2026/7/2 1:16:09

云计算 三种云平台虚拟机镜像定制化生成方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
云计算 三种云平台虚拟机镜像定制化生成方案

私有云平台上常见的虚拟机镜像厂商提供免费的,常规之外的业务镜像需要提供官方ISO镜像由云厂商定制化完成。那具体云平台使用的镜像和ISO标准镜像有什么不同呢,为什么需要要重新定制化虚拟机镜像呢?云平台镜像并不是使用原版标准iso镜像来生成虚拟机,为了适应云平台的管理、监控、动态配置网络、注入ssh公钥、创建用户和设置密码、执行自定义脚本、动态扩容等功能性要求,需要执行镜像虚拟化操作。cloud-init就是用于云环境中虚拟机初始化工具,他的核心作用是在虚拟机首次启动时,自动完成系统配置。

三种常用方式实现通用虚拟机镜像定制操作

原文来源于自己公众号:路途-在路上。三平台同步更新(公众号,知乎,CSDN)

第一种方案 官方下载

使用官方cloud image,快速获取标准化镜像,下载官方云镜像

#Ubuntu:https://cloud-images.ubuntu.com/ wget https://cloud-images.ubuntu.com/jammy/latest/jammy-server-cloudimg-amd64.img #CentOS / Rocky Linux: https://download.rockylinux.org/pub/rocky/9/images/x86_64/ wget https://download.rockylinux.org/pub/rocky/9/images/x86_64/Rocky-9-GenericCloud.latest.x86_64.qcow2

按照需求转换格式,一般常用qcow2格式,压缩空间大小。

qemu-img convert -f qcow2 -O raw input.qcow2 output.raw

使用virt-customize按需修改定制配置

virt-customize -a rocky9.qcow2 \ --install qemu-guest-agent \ --run-command 'systemctl enable qemu-guest-agent' \ --ssh-inject user:file:/path/to/id_rsa.pub

第二种方案 从ISO手动安装

创建一个空磁盘的镜像文件

qemu-img create -f qcow2 myvm.qcow2 20G

启动临时虚拟机,安装系统

virt-install \ --name temp-vm \ --memory 2048 \ --vcpus 2 \ --disk path=myvm.qcow2,format=qcow2,bus=virtio \ --cdrom /path/to/CentOS-Stream-9-latest-x86_64-dvd1.iso \ --network network=default,model=virtio \ --graphics vnc,listen=0.0.0.0 \ --noautoconsole

通过vnc完成系统安装,包括分区,只创建根分区即可,默认用户名,安装软件包(cloud-init,qemu-guest-agent,dracut)。

系统安装完成以后清理配置

# 进入 VM 后执行 sudo yum install -y cloud-init qemu-guest-agent sudo systemctl enable cloud-init qemu-guest-agent # 配置 cloud-init(通常默认已配好) sudo sed -i 's/disable_root: true/disable_root: false/' /etc/cloud/cloud.cfg # 按需调整 # 清理临时信息 sudo rm -rf /var/log/* /tmp/* sudo rm -f /etc/ssh/ssh_host_* sudo cloud-init clean --logs

关闭并封装镜像

virsh shutdown temp-vm # 删除临时 VM 定义 virsh undefine temp-vm

压缩镜像为qcow2格式

qemu-img convert -c -O qcow2 myvm.qcow2 myvm-final.qcow2

第三种方案 使用 Packer 自动化构建

Packer是HashiCorp开源的镜像构建工具,支持KVM(通过QEMU Builder),可实现完全自动化、版本化、CI/CD集成。

安装packer工具

# Ubuntu/Debian curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https as://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list sudo apt update && sudo apt install packer # CentOS/Rocky sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo sudo yum -y install packer

配置json模板,或者hcl,修改对应参数

{ "builders": [{ "type": "qemu", "iso_url": "https://releases.ubuntu.com/22.04/ubuntu-22.04.4-live-server-amd64.iso", "iso_checksum": "sha256:...", "output_directory": "output-ubuntu-2204", "disk_size": "20480", "format": "qcow2", "headless": true, "http_directory": "http", "ssh_username": "ubuntu", "ssh_password": "ubuntu", "shutdown_command": "echo 'ubuntu'|sudo -S shutdown -P now", "vm_name": "ubuntu-2204-kvm", "net_device": "virtio-net", "disk_interface": "virtio" }], "provisioners": [{ "type": "shell", "inline": [ "sudo apt update", "sudo apt install -y cloud-init qemu-guest-agent", "sudo systemctl enable qemu-guest-agent", "sudo cloud-init clean --logs", "sudo rm -f /etc/ssh/ssh_host_*" ] }] }

hcl模板示例

source "qemu" "ubuntu-2204" { iso_url = "https://releases.ubuntu.com/22.04/ubuntu-22.04.4-live-server-amd64.iso" iso_checksum = "sha256:7d9e8a7c5f3b2d1e0a4c6b8f9d2e1a3c5f7b9e8a7c5f3b2d1e0a4c6b8f9d2e1a3" output_directory = "output-ubuntu-2204" disk_size = "20480" # 20GB format = "qcow2" headless = true # 无图形界面 http_directory = "http" ssh_username = "ubuntu" ssh_password = "ubuntu" shutdown_command = "echo 'ubuntu' | sudo -S shutdown -P now" vm_name = "ubuntu-2204-kvm" net_device = "virtio-net" disk_interface = "virtio" } build { name = "ubuntu-2204" sources = ["source.qemu.ubuntu-2204"] provisioner "shell" { inline = [ "sudo apt update", "sudo apt install -y cloud-init qemu-guest-agent", "sudo systemctl enable qemu-guest-agent", "sudo cloud-init clean --logs", "sudo rm -f /etc/ssh/ssh_host_*" ] } }

执行构建命令

packer build template.json #json格式 packer build ubuntu.pkr.hcl #hcl格式

启动一台虚拟机测试镜像是否能正常被libvirt导入

virt-install --import --name test-vm --disk path=image.qcow2 --memory 1024

文章来源于自己的微信公众号:路途-在路上,欢迎访问并关注

https://mp.weixin.qq.com/s/PlHWHDp1sBDboc5nL2SXTw

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/28 20:00:24

如何快速配置NeverSink过滤器:流放之路2玩家的终极效率指南

如何快速配置NeverSink过滤器:流放之路2玩家的终极效率指南 【免费下载链接】NeverSink-Filter-for-PoE2 This is a lootfilter for the game "Path of Exile 2". It adds colors, sounds, map icons, beams to highlight remarkable gear and inform the…

作者头像 李华
网站建设 2026/7/1 5:33:53

LVGL与FreeRTOS协同:实时界面更新策略

让嵌入式界面丝滑如手机:LVGL FreeRTOS 实战调优全记录你有没有遇到过这样的场景?设备功能很强大,MCU主频也不低,但一打开图形界面就“卡成PPT”——滑动不跟手、按钮响应延迟、动画一顿一顿的。用户还没操作两下,心里…

作者头像 李华
网站建设 2026/7/1 17:31:34

VoxCPM-1.5-TTS-WEB-UI支持批量文本转语音任务处理

VoxCPM-1.5-TTS-WEB-UI 支持批量文本转语音任务处理 在智能内容生产日益普及的今天,自动化语音生成正从“可有可无”的辅助功能,演变为教育、媒体、客服等多个行业的基础设施。一个典型的痛点是:如何让非技术背景的用户也能高效地将大量文本转…

作者头像 李华
网站建设 2026/6/30 17:25:33

C语言嵌入Python的3种方式,第2种90%的人从未用过

第一章:C语言嵌入Python的3种方式概述在高性能计算与系统级编程领域,C语言与Python的结合使用越来越普遍。将C语言嵌入Python可显著提升关键模块的执行效率,同时保留Python在开发效率和生态上的优势。以下是三种主流的集成方式。直接使用Pyth…

作者头像 李华
网站建设 2026/6/28 20:00:25

一文说清OpenBMC核心组件与工作原理

一文讲透 OpenBMC:从组件到实战的完整解析你有没有遇到过这样的场景?机房里一台服务器突然宕机,操作系统毫无响应,远程登录失败。但你还得查清楚是不是风扇堵了、CPU 过热,或者电源模块出了问题——而这一切&#xff0…

作者头像 李华
网站建设 2026/6/28 20:00:26

Lutris游戏平台终极安装指南:简单快速搭建Linux游戏环境

Lutris游戏平台终极安装指南:简单快速搭建Linux游戏环境 【免费下载链接】lutris Lutris desktop client in Python / PyGObject 项目地址: https://gitcode.com/gh_mirrors/lu/lutris Lutris是一款功能强大的开源Linux游戏平台管理工具,能够帮助…

作者头像 李华