使用 CloudInit 在 Proxmox 上创建 Ubuntu 24.04 模板虚拟机

📌 本文翻译整理自国外社区原文,原帖地址详见末尾,转载请注明出处。

本文是一篇简要教程,介绍如何在 Proxmox 虚拟化平台上使用 CloudInit 创建一个 Ubuntu 24.04 的模板虚拟机,适合希望自动化部署的用户。以下内容假设你具备一定的 Proxmox 使用经验,并具备如下环境:

  • 虚拟机采用 UEFI 引导(非 BIOS)
  • Proxmox 节点的主要存储为 local-zfs
  • 系统镜像为 Ubuntu 24.04 Cloud Image
  • 你的主用户账户下 ~/.ssh/authorized_keys 中已存在有效的 SSH 公钥

开启 Snippets 支持

首先需要在 Proxmox 中开启 snippets 功能以便使用 CloudInit 的扩展配置。

  1. 登录 Proxmox Web UI
  2. 左侧选择 Datacenter -> Storage -> 选择 local
  3. 点击 “Edit”,在弹窗中勾选 Snippets,然后点击 OK

下载并调整 Cloud 镜像

在 Proxmox 节点中通过 SSH 执行:

1
2
wget -q https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img
qemu-img resize noble-server-cloudimg-amd64.img 32G

说明:

  • 镜像是 sparse 文件,初始大小约 2GB,实际不会占满 32G
  • 你可以根据需要调整大小,比如 20G、40G、80G 等

创建基础虚拟机

1
2
3
4
5
6
7
sudo qm create 8001 --name "ubuntu-2404-cloudinit-template" --ostype l26 \
--memory 1024 \
--agent 1 \
--bios ovmf --machine q35 --efidisk0 local-zfs:0,pre-enrolled-keys=0 \
--cpu host --socket 1 --cores 1 \
--vga serial0 --serial0 socket \
--net0 virtio,bridge=vmbr0

参数说明:

  • VM ID 为 8001,可自行替换,但后续命令需保持一致
  • --agent 1 启用 QEMU Guest Agent
  • --vga serial0 便于通过串口复制粘贴
  • --net0 绑定默认桥接接口 vmbr0,如需 VLAN 可写作 bridge=vmbr0,tag=XX

导入硬盘并设置启动项

1
2
3
4
sudo qm importdisk 8001 noble-server-cloudimg-amd64.img local-zfs
sudo qm set 8001 --scsihw virtio-scsi-pci --virtio0 local-zfs:vm-8001-disk-1,discard=on
sudo qm set 8001 --boot order=virtio0
sudo qm set 8001 --scsi1 local-zfs:cloudinit

说明:

  • 第一条导入我们下载的镜像
  • 第二条将其挂载为 virtio 磁盘
  • 第三条设定启动顺序
  • 第四条添加 cloudinit 专用的伪装光驱

配置 CloudInit 的 vendor.yaml 脚本

1
2
3
4
5
6
7
8
9
10
mkdir -p /var/lib/vz/snippets
cat << EOF | sudo tee /var/lib/vz/snippets/vendor.yaml
#cloud-config
runcmd:
- apt update
- apt install -y qemu-guest-agent
- systemctl start qemu-guest-agent
- reboot
# 引用来源:https://forum.proxmox.com/threads/combining-custom-cloud-init-with-auto-generated.59008/page-3#post-428772
EOF

作用说明:

  • 安装并启动 qemu-guest-agent
  • 修复 CloudInit 在网络服务启动后才初始化的问题,避免无法 SSH 连接

配置 CloudInit 参数

1
2
3
4
5
6
sudo qm set 8001 --cicustom "vendor=local:snippets/vendor.yaml"
sudo qm set 8001 --tags ubuntu-template,24.04,cloudinit
sudo qm set 8001 --ciuser yourusername
sudo qm set 8001 --cipassword $(openssl passwd -6 'yourplaintextpassword')
sudo qm set 8001 --sshkeys ~/.ssh/authorized_keys
sudo qm set 8001 --ipconfig0 ip=dhcp

说明:

  • --cicustom 指定 CloudInit 配置文件
  • --ciuser 设置默认用户
  • --cipassword 设置用户密码(使用 openssl 生成加密字符串)
  • --sshkeys 注入公钥
  • --ipconfig0 设置为 DHCP 获取 IP(默认如此,但建议显式指定)

转换为模板虚拟机

1
sudo qm template 8001

至此模板创建完成,可随时克隆并启动。启动后 CloudInit 会自动配置系统用户、安装 QEMU Agent 并重启系统。重启完成后,即可通过 SSH 连接并使用该 VM。


可选:自动化脚本

原作者提供了一组 Shell 脚本用于快速创建模板,在对应文件顶部定义了两个环境变量,可根据自身 Proxmox 配置进行调整。


附录与参考

🔁 转载自 UntouchedWagons GitHub 文档,原始英文文档版权归原作者所有,翻译仅供学习参考。
原文作者感谢论坛用户 ilude 提供了设置密码的关键命令。