创建Proxmox Debian12 cloud-init模板

最后编辑时间: 2024-02-21

记录下具体的操作步骤,期间也遇到一些问题,把解决办法也做个记录。其实以前也记录过系统模板制作的步骤,只是现在觉得直接用各种cloud image更方便省事。

在pve内把debian的cloud image下载下来:

wget https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-genericcloud-amd64.qcow2

我用的是genericcloud,这个更小巧一点。但据说和q35机型不兼容。。不过我也没用q35。。需要其他的也可以在这里下载:

https://cloud.debian.org/images/cloud/bookworm/latest/

然后创建vm,注意网络配置,如不是vmbr0则需要修改:

qm create 20000 \
--name debian12-cloud-init \
--cpu host \
--cores 2 \
--memory 2048 \
--net0 virtio,bridge=vmbr0 \
--scsihw virtio-scsi-pci \
--agent enabled=1

导入刚下载的image:

qm set 20000 --scsi0 local-zfs:0,import-from=/root/debian-12-genericcloud-amd64.qcow2,cache=writeback

这里要注意存储的id,我这里是local-zfs,存储id可在pve面板的“数据中心”-“存储”找到,同时该存储id的内容要有“磁盘映像”权限:

[可选]如果后续要修改vm磁盘的配置,可以用这个命令:

qm set 20000 --scsi0 local-zfs:vm-20000-disk-0,cache=writeback

添加cloud-init设备:

qm set 20000 --ide2 local-zfs:cloudinit

修改vm启动顺序:

qm set 20000 --boot order=scsi0

添加串行端口:

qm set 20000 --serial0 socket --vga serial0

设置系统的root账户和密码:

qm set 20000 --ciuser=root --cipassword="setyourpassword"

设置dns服务器,我准备是开only ipv6,所以这里就只配了2个ipv6的dns:

qm set 20000 --nameserver="2001:4860:4860::8888 2001:4860:4860::8844"

转换成系统模板:

qm template 20000

到这里其实这个模板就已经可以用了,但是默认的debian cloud image不能满足我的需求,所以还需要进行定制。

cloud-init可以做的事情很多,包括但不限于pve面板上面的那些内容,pve面板其实只实现了很基本的cloud-init功能。

实际上我们可以自己创建一个cloud-init片段来自定义所有cloud-init的配置。

首先还是转到pve面板的“数据中心”-“存储”,单击“添加”-“目录”:

进到对应的目录:

cd /cloud-init-snippets/snippets

导出刚才系统模板的默认cloud-init配置:

qm cloudinit dump 20000 user

输出的内容类似于:

#cloud-config
hostname: debian12-cloud-init
manage_etc_hosts: true
fqdn: debian12-cloud-init
user: root
disable_root: False
password: hidden
chpasswd:
  expire: False
package_upgrade: true

新建一个配置文件:

nano /cloud-init-snippets/snippets/userdata.yaml

把刚才导出的默认内容写入,同时加入我们自定义的内容:

#cloud-config
manage_etc_hosts: true
timezone: Asia/Shanghai
user: root
disable_root: False
password: hidden
chpasswd:
  expire: False
package_upgrade: true
packages:
  - qemu-guest-agent
runcmd:
  - sed -i 's/#PermitRootLogin.*/PermitRootLogin yes/g' /etc/ssh/sshd_config
  - sed -i 's/PasswordAuthentication.*/PasswordAuthentication yes/g' /etc/ssh/sshd_config
  - systemctl reload sshd
  - systemctl enable --now qemu-guest-agent

我删掉了hostname和fqdn相关的配置,因为一旦使用自定义配置文件后,这两个参数就没配置的意义了,后面会说到原因。

其次安装并启动了qemu-guest-agent,如果不使用qemu代理的话pve面板里面的“重启”和“关机”将不能正常工作。

debian cloud image内默认的ssh配置不允许root登录,也不允许使用密码登录,我进行了修改,方便用户登录ssh进行管理。

如果还有其他的需求,可根据cloud-init的文档来慢慢搓配置文件:

https://cloudinit.readthedocs.io/en/latest/reference/examples.html
https://cloudinit.readthedocs.io/en/latest/reference/modules.html

然后配置系统模板使用我们的自定义配置文件:

qm set 20000 --cicustom "user=snippets:snippets/userdata.yaml"

如果要删除自定义配置:

qm set 20000 --delete cicustom

回到pve面板,克隆一台vm:

注意这里的名称,如果没有使用自定义的cloud-init配置文件,则vm的hostname将匹配这里的名称。

一旦使用了自定义的cloud-init配置文件,则hostname自动匹配就失效了,这个问题困扰我许久,找了半天,最终在这个贴子找到一个比较简单的解决办法:

https://forum.proxmox.com/threads/hostname-not-set-via-cloudinit-with-cicustom-and-ubuntu-22-04.110446/

转到对应vm-“选项”,编辑“SMBIOS设置”:

在“串行”写入如下内容,其中h=后面的内容就是你要设置的hostname:

ds=nocloud;h=prod-test

如图所示:

这样hostname的问题就解决了。

现在转到“硬件”-“硬盘”,可以看到默认的大小只有2GB:

你可以点击“磁盘操作”-“调整大小”,然后在界面内输入增量大小:

然后转到“cloud-init”,在这里我们需要配置vm的ip:

我没有配置dhcp/slaac,这里直接用静态地址:

启动vm检查相关配置:

由此可见,以后要创建一台vm就非常轻松了,步骤大概是:从系统模板克隆vm-根据需要调整磁盘大小-配置IP地址-[可选]配置hostname。

这可比挂载iso安装要方便多了,而且还能定制系统内容。

请在下方留下您的评论.加入TG吹水群