记录下具体的操作步骤,期间也遇到一些问题,把解决办法也做个记录。其实以前也记录过系统模板制作的步骤,只是现在觉得直接用各种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自动匹配就失效了,这个问题困扰我许久,找了半天,最终在这个贴子找到一个比较简单的解决办法:
转到对应vm-“选项”,编辑“SMBIOS设置”:
在“串行”写入如下内容,其中h=后面的内容就是你要设置的hostname:
ds=nocloud;h=prod-test
如图所示:
这样hostname的问题就解决了。
现在转到“硬件”-“硬盘”,可以看到默认的大小只有2GB:
你可以点击“磁盘操作”-“调整大小”,然后在界面内输入增量大小:
然后转到“cloud-init”,在这里我们需要配置vm的ip:
我没有配置dhcp/slaac,这里直接用静态地址:
启动vm检查相关配置:
由此可见,以后要创建一台vm就非常轻松了,步骤大概是:从系统模板克隆vm-根据需要调整磁盘大小-配置IP地址-[可选]配置hostname。
这可比挂载iso安装要方便多了,而且还能定制系统内容。