使用 cloud images 和 cloud-init 可以很方便地在 pve 创建一个快捷高效的虚拟机克隆模板。首先选择自己偏好的 cloud image,例如 Ubuntu 的可以在 Ubuntu cloud init 镜像 下载, CentOS 的可以在 Centos cloud images 下载。
提供下载的镜像有好几种格式, ubuntu 的一般用 img 就可以,centos 下载 qcow2c 就可以,后面导入的时候都会转换成 raw 格式。’
下载镜像:
wget https://cloud-images.ubuntu.com/noble/20260108/noble-server-cloudimg-amd64.img
下载好所需的镜像之后(假设下载的是 jammy-server-cloudimg-amd64.img ),就开始按以下步骤制作虚拟机模板:
1、创建一个新的虚拟机
qm create 105 --memory 8196 --core 4 --cpu host --numa 1 --name tech-ubuntu2404-cloud-tpl --net0 virtio,bridge=vmbr2,firewall=1,tag=1016 --bios ovmf --machine q35 --scsihw virtio-scsi-single --efidisk0 tech:1,efitype=4m,pre-enrolled-keys=0,size=1M --agent 1,type=virtio
--vga serial0 --serial0 socket 这两个参数待选。
2、导入下载好的云镜像到 tech 存储;前提是需要将镜像上传到执行命令的节点上
qm importdisk 105 noble-server-cloudimg-amd64.img tech
3、将新导入的磁盘以 scsi 驱动器的方式装载到新建的虚拟机的 scsi 控制器,并配置对应参数
qm set 105 --scsihw virtio-scsi-single --scsi0 tech:vm-105-disk-1,discard=on,iothread=1,ssd=1,cache=none,backup=0,replicate=0
将磁盘扩容到40G,该扩容方式将直接 / 目录进行扩容。
qm disk resize 105 scsi0 40G
4、添加 cloud init 驱动器
qm set 105 --scsi1 tech:cloudinit
5、将 cloud init 驱动器设置为可启动并限制 BIOS 仅从磁盘启动
qm set 105 --boot c --bootdisk scsi0
6、配置Cloud-init
现在可以配置新虚拟机的硬件和 cloud init 选项,配置好之后转换成模板。磁盘大小的调整可以在转换成模板前调整,或者从模板克隆出新的虚拟机时候再调整。
- 设置默认用户名和密码
- 设置 SSH公钥
- 设置 net0 配置,使用静态IP还是DHCP
- 设置 DNS
qm set 105 --ciuser inboc --cipassword '$6$JeSDlzJ.2dDKpRA6$rzsBw5WSCWuVClQnUSd1s4eAGJgbUBWzoF0RgIru07shdmQwi.fAow6.DPXYJryWe7pGLReqB8yCTnGYkAr/I/' --ipconfig0 ip=10.16.1.250/24,gw=10.16.1.254 --nameserver "10.12.1.1 10.12.1.2" --searchdomain .
其中加密后的密码可通过下面的命令生成:
# openssl passwd -6
Password:
Verifying - Password:
$6$JeSDlzJ.2dDKpRA6$rzsBw5WSCWuVClQnUSd1s4eAGJgbUBWzoF0RgIru07shdmQwi.fAow6.DPXYJryWe7pGLReqB8yCTnGYkAr/I/
7、启动虚拟机,并进入到虚拟机中进行如下配置
systemctl status systemd-networkd日志中显示eth0: Failed to configure DHCPv6 client: No such file or directory,同时eth0: Failed,说明IPv6 的 DHCP 配置失败,进而导致网卡的网络配置未完全生效(即使配置了 IPv4 静态 IP,IPv6 的错误可能阻塞了整体网络初始化)。
# vim /etc/netplan/50-cloud-init.yaml
network:
ethernets:
eth0:
# 原有配置...
# 仅启用IPv4的链路本地地址
link-local: []
version: 2
# netplan apply
# systemctl restart systemd-networkd
link-local: [ipv4]:默认值,表示启用 IPv4 的链路本地地址(会生成 169.254 开头的地址);link-local: []:表示禁用 IPv4 链路本地地址,系统启动时不会再分配 169.254 的地址;link-local: [ipv6]:仅启用 IPv6 的链路本地地址(不影响 IPv4)。
但是再将该模板克隆成虚拟机后,cloud-init还是会使用自己的模板进行初始化,这也将导致link-local: []无法被配置上。Cloud-Init 生成50-cloud-init.yaml时,会读取内置模板,我们直接修改这个模板,让它默认就包含link-local: []:
# vim /usr/lib/python3/dist-packages/cloudinit/net/netplan.py
# 在102行左右加上 entry["link-local"] = [],后面的代码不变
102 entry["link-local"] = []
103 addresses = []
104 routes = []
105 nameservers = []
106 searchdomains = []
清理缓存
cloud-init clean --logs --seed
rm -rf /var/lib/cloud/instance
修改SSHD配置,允许使用密码登录:
# vim /etc/ssh/sshd_config.d/60-cloudimg-settings.conf
PasswordAuthentication yes
# systemctl restart ssh
安装guest agent:
apt update
apt install qemu-guest-agent -y
systemctl enable --now qemu-guest-agent
重置机器ID
rm -f /etc/machine-id
rm -f /var/lib/dbus/machine-id
下次启动会生成新的机器 id,如果没有生成,可以运行以下命令:
sudo systemd-machine-id-setup
最后清理痕迹,并关机
history -w
> .bash_history
history -c
8、创建模板
qm template 105
9、克隆模板
qm clone 105 17001 --name temp-sys-kind --full 1
配置网络:
qm set 17001 --ipconfig0 ip=10.16.1.1/24,gw=10.16.1.254 --nameserver "10.12.1.1 10.12.1.2"
























暂无评论内容