深色模式
④ 创建 PVE 云模板
被控开虚拟机的方式是:克隆一个云模板 → 注入 cloud-init(IPv6 / 密码 / 主机名)→ 启动。 所以每台被控都要有云模板,系统默认要求 VMID 9000(可在被控 config.json 的 template_id 改)。
一键脚本
在被控(杜甫)上保存为 /opt/pvepanel/build_tpl.sh 并执行 bash /opt/pvepanel/build_tpl.sh,会自动下载镜像并构建 4 个模板:
bash
#!/bin/bash
set -e
cd /var/lib/vz/template/iso
# 下载云镜像(genericcloud / cloudimg,体积小、自带 cloud-init)
[ -s debian-12-genericcloud-amd64.qcow2 ] || wget -q -O debian-12-genericcloud-amd64.qcow2 https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-genericcloud-amd64.qcow2
[ -s ubuntu-22.04-server-cloudimg-amd64.img ] || wget -q -O ubuntu-22.04-server-cloudimg-amd64.img https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img
[ -s ubuntu-24.04-server-cloudimg-amd64.img ] || wget -q -O ubuntu-24.04-server-cloudimg-amd64.img https://cloud-images.ubuntu.com/noble/current/noble-server-cloudimg-amd64.img
[ -s centos-stream-9.qcow2 ] || wget -q -O centos-stream-9.qcow2 https://cloud.centos.org/centos/9-stream/x86_64/images/CentOS-Stream-GenericCloud-9-latest.x86_64.qcow2
# cloud-init 出厂配置:装 qemu-guest-agent、开 SSH 密码登录、开串口
mkdir -p /var/lib/vz/snippets
cat > /var/lib/vz/snippets/nkx-vendor.yaml <<'YAML'
#cloud-config
ssh_pwauth: true
packages:
- qemu-guest-agent
runcmd:
- systemctl enable --now qemu-guest-agent
- systemctl enable --now serial-getty@ttyS0
- mkdir -p /etc/ssh/sshd_config.d
- printf 'PermitRootLogin yes\nPasswordAuthentication yes\nKbdInteractiveAuthentication yes\n' > /etc/ssh/sshd_config.d/99-nkx.conf
- systemctl restart ssh
YAML
build() {
ID=$1; NAME=$2; IMG=$3
qm destroy $ID --purge 2>/dev/null || true
qm create $ID --name "$NAME" --memory 2048 --cores 2 --cpu host --ostype l26 \
--scsihw virtio-scsi-single --net0 virtio,bridge=vmbr0 --agent enabled=1 --serial0 socket --vga serial0
qm disk import $ID "$IMG" local --format qcow2 >/dev/null 2>&1
VOL=$(qm config $ID | grep -oE '^unused0: [^ ]+' | awk '{print $2}')
qm set $ID --scsi0 "${VOL},discard=on,ssd=1,iothread=1"
qm set $ID --ide2 local:cloudinit --boot order=scsi0 --bootdisk scsi0
qm set $ID --ciuser root --cipassword 'ChangeMe123' --nameserver "1.1.1.1 8.8.8.8 2606:4700:4700::1111 2001:4860:4860::8888"
qm set $ID --cicustom "vendor=local:snippets/nkx-vendor.yaml"
qm template $ID
echo "$NAME 完成"
}
build 9000 debian13-cloudinit debian-13-genericcloud-amd64.qcow2 # 系统默认模板
build 9001 debian12-cloudinit debian-12-genericcloud-amd64.qcow2
build 9002 ubuntu2204-cloudinit ubuntu-22.04-server-cloudimg-amd64.img
build 9003 ubuntu2404-cloudinit ubuntu-24.04-server-cloudimg-amd64.img
build 9004 centos9-cloudinit centos-stream-9.qcow2关于 Debian 13
把 build 9000 的镜像换成 Debian 13: https://cloud.debian.org/images/cloud/trixie/latest/debian-13-genericcloud-amd64.qcow2
关键要求(否则开出来的机器有问题)
- 必须装
qemu-guest-agent(脚本已通过 vendor cloud-init 处理):系统用它来改密码、扩容磁盘、换 IP、配内网 IP、绑弹性 IP。 - 必须允许 root 密码登录(同上处理):客户拿到的是密码,不是密钥。
- DNS 要同时给 IPv4:模板的 nameserver 必须包含
1.1.1.1 8.8.8.8,否则只有 NAT(无 IPv6)的机器解析不了域名(装不了任何东西)。 - cloud-init 盘要挂上(脚本的
--ide2 local:cloudinit):否则开机器时无法注入 IPv6/密码。 - 模板不要启动(
qm template后就是模板态),开机由系统克隆时处理。
在面板里登记模板
被控面板(杜甫本机 443)→ 模板管理,确认 9000-9004 都在列表里;config.json 的 templates 字段决定客户重装时能选哪些系统。
验证:开一台测试机
主控 → 机器总览 → 或用财务端客户账号买一台最便宜的套餐,确认:
- 40 秒内变成「运行中」
- 客户机内
ip -6 addr能看到分配的 IPv6 - 面板能连上(VNC / 终端)
出问题看被控日志:
bash
journalctl -u nkx-panel -n 100 --no-pager | grep -iE "clone|error|fail"下一步:首次配置