Skip to content

④ 创建 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

关键要求(否则开出来的机器有问题) ​

  1. 必须装 qemu-guest-agent(脚本已通过 vendor cloud-init 处理):系统用它来改密码、扩容磁盘、换 IP、配内网 IP、绑弹性 IP。
  2. 必须允许 root 密码登录(同上处理):客户拿到的是密码,不是密钥。
  3. DNS 要同时给 IPv4:模板的 nameserver 必须包含 1.1.1.1 8.8.8.8,否则只有 NAT(无 IPv6)的机器解析不了域名(装不了任何东西)。
  4. cloud-init 盘要挂上(脚本的 --ide2 local:cloudinit):否则开机器时无法注入 IPv6/密码。
  5. 模板不要启动(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"

下一步:首次配置

NKXCLOUD · 自研云服务器 / 游戏服务器管理系统