私有云平台上常见的虚拟机镜像厂商提供免费的,常规之外的业务镜像需要提供官方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