Proxmox VE PVE系统创建Ubuntu标准化VM模板制作

Proxmox VE 9.2.2 Ubuntu 24.04 CloudInit 标准化模板制作完整操作文档

文档基础信息

  1. 适配环境
  • PVE 版本:9.2.2
  • 节点主机名:homelab
  • 目录存储池 ID:data-ext4-2t,物理挂载路径 /mnt/pve/data-ext4
  • 虚拟机磁盘存储:同目录存储池 data-ext4-2t
  • 模板固定VMID:9000
  • 模板名称:ubuntu-24.04-cloud-base-v1.0
  1. 文档目标
    一键批量克隆业务虚拟机,自动初始化登录账号、主机名、DHCP网络、DNS、虚拟机代理;全程规避thin存储路径报错、apt锁冲突、克隆ID重复、镜像导出网页不显示等问题。
  2. 前置约束
    所有宿主机操作使用root用户执行;虚拟机内操作使用ubuntu普通用户,sudo提权。

第一部分:宿主机下载官方Ubuntu Cloud镜像

1.1 下载云镜像至ISO目录

ubuntu官网镜像:https://cloud-images.ubuntu.com/releases

bash 复制代码
wget https://cloud-images.ubuntu.com/releases/noble/release/ubuntu-24.04-server-cloudimg-amd64.img -P /mnt/pve/data-ext4/template/iso/

参数说明

  • -P:指定文件下载保存目录,直接存入存储池ISO目录,网页可识别.img后缀展示。
  • 镜像类型:官方纯净cloudinit镜像,无预装桌面,轻量化适合模板。

1.2 校验镜像文件(可选)

bash 复制代码
ls -lh /mnt/pve/data-ext4/template/iso/ubuntu-24.04-server-cloudimg-amd64.img

第二部分:宿主机创建虚拟机硬件(完整参数释义)

2.1 创建虚拟机完整命令

bash 复制代码
qm create 9000 \
--name ubuntu-24.04-cloud-base-v1.0 \
--memory 2048 \
--cores 2 \
--sockets 1 \
--ostype l26 \
--net0 virtio,bridge=vmbr0 \
--scsihw virtio-scsi-pci \
--boot order=scsi0 \
--agent enabled=1 \
--serial0 socket \
--vga serial0 \
--ide2 data-ext4-2t:cloudinit

逐行参数详细说明

参数 参数值 详细释义
9000 VMID 虚拟机唯一编号,模板固定9000,不可与其他虚拟机重复
--name ubuntu-24.04-cloud-base-v1.0 虚拟机显示名称,模板标识
--memory 2048 虚拟机内存,单位MB,基础模板2G满足通用业务
--cores 2 CPU核心数
--sockets 1 CPU插槽数,家用/业务统一1插槽
--ostype l26 操作系统类型,Linux内核5.x/6.x统一填l26,优化virtio驱动
--net0 virtio,bridge=vmbr0 第一块网卡;virtio为高性能虚拟网卡;bridge=vmbr0绑定物理网桥,通外网
--scsihw virtio-scsi-pci 磁盘控制器,virtio-scsi兼容性/性能最优,支持热插拔磁盘
--boot order=scsi0 scsi0 启动优先级,仅从scsi0系统磁盘启动,屏蔽其他设备
--agent enabled=1 enabled=1 开启QEMU Guest Agent通道;面板读取虚拟机IP、支持远程关机、内存CPU监控
--serial0 socket socket 串口终端通道,无显示器/网页控制台异常时,使用qm terminal登录系统
--vga serial0 serial0 控制台输出重定向至串口,配合serial0实现纯串口登录,无需显卡
--ide2 data-ext4-2t:cloudinit 挂载CloudInit虚拟光驱,存储池为data-ext4-2t,用于克隆后自动初始化系统配置

2.2 导入系统镜像到存储池

bash 复制代码
qm importdisk 9000 /mnt/pve/data-ext4/template/iso/ubuntu-24.04-server-cloudimg-amd64.img data-ext4-2t --format qcow2

参数说明

  1. qm importdisk:导入外部镜像至PVE存储池
  2. 9000:目标虚拟机VMID
  3. 镜像完整路径:本地cloudimg镜像文件位置
  4. data-ext4-2t:存储池ID,磁盘存放位置
  5. --format qcow2:强制转换为qcow2稀疏镜像,精简占用空间,支持快照

2.3 绑定导入磁盘为系统启动盘

bash 复制代码
qm set 9000 --scsi0 data-ext4-2t:9000/vm-9000-disk-0.qcow2

参数说明

  • --scsi0:将磁盘挂载至第一块SCSI控制器,作为系统盘;路径格式存储池:VMID/磁盘文件名

2.4 初始化CloudInit基础默认配置(模板基准参数)

bash 复制代码
qm set 9000 \
--ciuser ubuntu \
--cipassword 'Ubuntu123456' \
--searchdomain ubuntu-24.04-cloud-base-v1.0 \
--ipconfig0 ip=dhcp \
--nameserver 223.5.5.5

CloudInit参数详解

参数 释义
--ciuser 虚拟机默认登录用户名ubuntu,cloudimg镜像仅支持ubuntu用户
--cipassword 默认登录密码,模板基准密码,克隆业务机可单独修改
--searchdomain 主机域名,模板默认域名,克隆后自动替换为业务主机名
--ipconfig0 ip=dhcp 网卡IP配置,dhcp自动获取地址;如需静态IP克隆后修改
--nameserver 全局DNS服务器,阿里公共DNS 223.5.5.5

2.5 启动虚拟机并串口登录

bash 复制代码
qm start 9000
# 串口终端登录虚拟机
qm terminal 9000

登录账号:ubuntu,密码:Ubuntu123456


第三部分:虚拟机内系统固化、模板清理(ubuntu用户执行)

3.1 全量更新系统软件包

bash 复制代码
sudo apt update && sudo apt upgrade -y

dpkg锁占用异常修复(出现waiting for cache lock执行)

bash 复制代码
sudo killall apt-get
sudo rm /var/lib/dpkg/lock-frontend
sudo dpkg --configure -a
sudo apt update && sudo apt upgrade -y

说明

多进程同时操作apt会产生锁文件,删除锁并修复损坏包依赖即可恢复更新。

3.2 安装并开机自启 QEMU Guest Agent

bash 复制代码
sudo apt install -y qemu-guest-agent
sudo systemctl enable --now qemu-guest-agent
# 校验运行状态
systemctl status qemu-guest-agent

校验标准

输出内容包含 active (running) 代表代理正常运行。

3.3 清理CloudInit缓存(模板核心步骤,必执行)

bash 复制代码
sudo cloud-init clean

作用

清除本机已执行的cloudinit初始化记录,克隆出新虚拟机时会完整重新执行初始化,避免主机名、IP、账号配置不刷新。

3.4 删除系统唯一硬件标识,杜绝多机ID冲突

bash 复制代码
sudo rm -rf /etc/machine-id /var/lib/dbus/machine-id

作用

machine-id为系统全局唯一标识,多台克隆机ID一致会导致网络、服务认证异常,模板制作必须删除。

3.5 清空临时文件、系统日志,压缩模板占用体积

bash 复制代码
sudo rm -rf /tmp/*
sudo truncate -s 0 /var/log/*.log

说明

  1. /tmp/* 临时文件全部删除,减小镜像体积;
  2. truncate -s 0 清空日志内容但保留日志文件,防止系统启动报文件缺失错误。

3.6 正常关机,等待宿主机识别停机状态

bash 复制代码
sudo poweroff

校验标准

网页虚拟机状态变为「已停止」后,再执行模板转换命令。


第四部分:宿主机将停机虚拟机转换为标准模板

4.1 转换模板命令

bash 复制代码
qm template 9000

功能说明

  1. 标记VMID=9000为模板;
  2. 模板禁止直接启动,仅支持克隆、备份;
  3. 底层磁盘变为只读快照基底,所有克隆机使用差分磁盘,节省存储空间。

4.2 模板转换成功校验

方式1:命令行批量筛选模板(适配PVE9.2.2无--template参数)

bash 复制代码
for vmid in $(qm list | awk 'NR>1 {print $1}');do
  if qm config $vmid | grep -q 'template: 1';then
    echo "===== 模板VMID:$vmid ==="
    qm config $vmid | grep name
  fi
done

输出包含 template: 1 代表转换完成。

方式2:网页图形校验

  1. 左侧虚拟机列表9000图标为文件夹样式
  2. 选中9000后页面无「启动」按钮,仅存在【克隆、备份】功能,模板生效。

第五部分:模板日常使用操作手册

5.1 网页可视化克隆新业务虚拟机(生产推荐)

  1. 左侧选中模板9000 → 右上角【更多】→【克隆】;
  2. 弹窗参数规范填写:
    • 目标节点:homelab
    • VM ID:自定义未占用数字(如9001、100)
    • 名称:业务主机标识(web01/app01/db01)
    • 克隆模式:完整克隆(推荐,脱离模板底层磁盘依赖,后续可删除模板不影响业务机)
    • 目标存储:data-ext4-2t
  3. 点击克隆,等待后台任务执行完成;
  4. 选中新生成虚拟机,切换【Cloud-Init】标签,自定义登录账号、密码、主机名、静态IP/DHCP;
  5. 进入【硬件】页面调整CPU、内存、扩容磁盘,最后启动虚拟机。

5.2 命令行批量自动化克隆

bash 复制代码
# 模板9000完整克隆至9001,主机名web01
qm clone 9000 9001 --name web01 --full true
# 自定义新机器CloudInit配置
qm set 9001 \
--ciuser ubuntu \
--cipassword Web@6666 \
--searchdomain web01 \
--ipconfig0 ip=dhcp \
--nameserver 223.5.5.5
# 磁盘扩容至100G
qm resize 9001 scsi0 100G
# 启动新虚拟机
qm start 9001

参数说明

--full true:完整克隆,生成独立磁盘,不依赖模板底层快照;不添加该参数为链接克隆,模板删除后业务机损坏。

5.3 修改模板内容(更新系统/预装软件)

模板本身禁止启动,如需更新系统必须先取消模板标记:

bash 复制代码
# 取消模板属性,变回可启动虚拟机
qm template --delete 9000
# 启动虚拟机完成系统修改
qm start 9000
# 修改完成后重复【第三部分】系统清理全套流程,关机后重新转为模板
qm template 9000

第六部分:模板导出跨平台通用qcow2镜像完整流程(适配LVM-Thin/目录存储,无报错)

前置说明

  1. PVE内置vzdump生成.vma.zst压缩备份包,vma extract无法直接读取压缩包,必须先解压;
  2. vma提取出磁盘为raw裸盘,需转换为qcow2通用镜像;
  3. PVE网页【ISO镜像】仅识别.iso/.img后缀,.qcow2默认隐藏,无法直接网页下载。

6.1 克隆临时完整导出虚拟机(脱离模板依赖)

bash 复制代码
qm clone 9000 9099 --name tmp-export-vm --full true

6.2 整机停机备份临时虚拟机

bash 复制代码
vzdump 9099 --storage data-ext4-2t --mode stop --compress zstd

参数释义

  • --mode stop:备份前停止虚拟机,保证磁盘数据完整;
  • --compress zstd:zstd高压缩格式,备份体积更小。

6.3 查找备份文件并复制至ISO目录

bash 复制代码
# 自动匹配最新生成的备份文件
BK_FILE=$(find /mnt/pve/data-ext4/dump/ -name "vzdump-qemu-9099*.vma.zst" | tail -n1)
# 复制备份到ISO目录
cp $BK_FILE /mnt/pve/data-ext4/template/iso/

6.4 解压zstd压缩包,得到裸vma文件

bash 复制代码
cd /mnt/pve/data-ext4/template/iso/
# 解压zst压缩包
zstd -d $(basename $BK_FILE)
# 获取解压后的纯vma文件名
VMA_RAW=$(basename $BK_FILE .zst)

6.5 提取vma备份内磁盘文件

bash 复制代码
# 删除旧临时目录
rm -rf ./tmp_extract_vma
# 创建临时目录并提取vma
mkdir -p ./tmp_extract_vma
vma extract $VMA_RAW ./tmp_extract_vma

文件说明

提取目录内生成 disk-drive-scsi0.raw(裸RAW磁盘)、qemu-server.conf(PVE专属硬件配置,跨平台无使用价值)。

6.6 raw裸盘转换为通用qcow2镜像

bash 复制代码
qemu-img convert -f raw ./tmp_extract_vma/disk-drive-scsi0.raw -O qcow2 ubuntu2404-base-final.qcow2

参数释义

  • -f raw:源文件格式为raw裸盘;
  • -O qcow2:输出格式为通用稀疏qcow2镜像,兼容KVM、VMware、OpenStack、其他PVE节点。

6.7 清理全部中间临时文件

bash 复制代码
rm -rf ./tmp_extract_vma
rm $VMA_RAW
rm $(basename $BK_FILE)
# 销毁临时导出虚拟机释放存储空间
qm destroy 9099

6.8 qcow2镜像网页下载两种方案

方案A:重命名后缀为img(网页ISO列表可见)

bash 复制代码
mv ubuntu2404-base-final.qcow2 ubuntu2404-base-final.img

刷新data-ext4-2t存储→ISO镜像页面,直接下载,本地使用时改回.qcow2后缀即可。

方案B:浏览器直链下载(无需修改文件名)

浏览器访问地址:http|PVE节点IP:8008/template/iso/ubuntu2404-base-final.qcow2,直接弹出下载。

6.9 qcow2镜像导入其他PVE使用方法

bash 复制代码
# 新建空白虚拟机后,导入外部qcow2镜像
qm importdisk 目标VMID /mnt/pve/data-ext4/template/iso/ubuntu2404-base-final.qcow2 data-ext4-2t --format qcow2
# 绑定磁盘为启动盘
qm set 目标VMID --scsi0 data-ext4-2t:目标VMID/vm-目标VMID-disk-0.qcow2
# 设置启动顺序
qm set 目标VMID --boot order=scsi0

第七部分:全局常见故障避坑清单

  1. qm export 命令不存在:PVE9.3及以上版本新增,9.2.2不支持,统一使用vzdump备份导出;
  2. qemu-img /dev/mapper 文件不存在:LVM-Thin存储无持久块设备,禁止该写法,统一vzdump+vma extract流程;
  3. vma: not a vma file - wrong magic number:vma.zst为压缩包,必须先执行zstd -d解压;
  4. 网页ISO列表看不到qcow2:PVE仅识别.iso/.img,重命名后缀或直链下载;
  5. 克隆多台机器主机名/ID重复:模板关机前必须执行sudo cloud-init clean并删除machine-id;
  6. apt软件锁占用:多终端同时更新系统导致,执行锁清理命令修复;
  7. 链接克隆无法删除模板:克隆模式必须选择「完整克隆」,链接克隆磁盘依赖模板底层快照;
  8. 存储目录混淆:data-ext4-2t是存储ID,物理路径统一为/mnt/pve/data-ext4,二者为同一存储,仅名称标识不同。