在云计算和虚拟化环境中,使用官方提供的 Ubuntu云镜像(Ubuntu Cloud Image) 是部署虚拟机的高效方式。但很多时候我们需要预装软件、配置网络或设置用户账户,这就需要我们基于官方镜像进行定制。本文将详细介绍如何从零开始制作一个自定义的 Ubuntu云镜像,即使你是 Linux 新手也能轻松上手。
什么是 Ubuntu Cloud Image?
Ubuntu 官方为云平台(如 AWS、OpenStack、KVM、VMware 等)提供了轻量级的 QCOW2 或 RAW 格式的系统镜像,称为 Cloud Image。这些镜像默认不包含图形界面,体积小、启动快,并支持通过
cloud-init工具在首次启动时自动完成初始化配置。
准备工作
在开始之前,请确保你的系统满足以下条件:
一台运行 Ubuntu 20.04/22.04 的主机(物理机或虚拟机均可) 安装必要的工具:qemu-utils、
libguestfs-tools、
cloud-image-utils至少 5GB 的可用磁盘空间
首先,更新系统并安装所需工具:
sudo apt updatesudo apt install -y qemu-utils libguestfs-tools cloud-image-utils
步骤一:下载官方 Ubuntu Cloud Image
访问 Ubuntu Cloud Images 官网,选择你需要的版本(例如 22.04 LTS)。我们以
jammy(22.04)为例:
wget https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img
步骤二:扩展镜像大小(可选但推荐)
默认镜像通常只有 2~3GB,可能不够用。我们可以将其扩展到 10GB:
# 创建副本,避免修改原始文件cp jammy-server-cloudimg-amd64.img ubuntu-custom.img# 扩展到 10GBqemu-img resize ubuntu-custom.img 10G
步骤三:挂载镜像并进入 chroot 环境
使用
virt-customize(来自 libguestfs-tools)可以直接修改镜像,无需手动挂载。例如,安装软件包、添加用户等:
# 安装 nginx 并设置 root 密码(仅用于测试,生产环境建议禁用 root)sudo virt-customize -a ubuntu-custom.img \ --install nginx \ --root-password password:MySecurePass123 \ --run-command 'systemctl enable nginx'
如果你希望更精细地控制,也可以使用
guestfish手动挂载并 chroot:
# 启动 guestfishguestfish -a ubuntu-custom.img -i# 在 guestfish shell 中执行(注意:这是交互式命令)>
步骤四:配置 cloud-init(关键!)
为了让虚拟机首次启动时能自动配置 SSH 密钥、用户、网络等,我们需要准备一个
user-data和
meta-data文件,并生成 ISO 镜像作为配置盘。
创建
meta-data(可为空):
echo "instance-id: ubuntu-custom-vm" > meta-data
创建
user-data(注意第一行必须是
#cloud-config):
cat > user-data <
生成配置 ISO:
cloud-localds seed.iso user-data meta-data
步骤五:测试自定义镜像
使用 QEMU 启动虚拟机进行测试:
qemu-system-x86_64 \ -drive file=ubuntu-custom.img,format=qcow2 \ -cdrom seed.iso \ -m 2048 \ -net nic -net user,hostfwd=tcp::2222-:22 \ -nographic
现在你可以通过
ssh -p 2222 ubuntu@localhost登录虚拟机,验证配置是否生效。
总结
通过以上步骤,你已经成功制作了一个包含自定义软件和用户配置的 Ubuntu云镜像。这种方法适用于 OpenStack、Proxmox、KVM 等多种虚拟化平台。记住,核心在于利用
cloud-init实现自动化初始化,而镜像本身只需包含基础系统和必要软件。
掌握 自定义Ubuntu镜像 的制作方法,不仅能提升部署效率,还能确保环境一致性。无论是开发测试还是生产上线,这都是一项非常实用的技能。
希望这篇教程能帮助你顺利完成 创建Ubuntu虚拟机镜像 的任务!如有疑问,欢迎在评论区交流。
