proxmox 使用 xxx-cloud.img 创建模板实战

使用 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"
© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
评论 共1条

请登录后发表评论

    暂无评论内容