Proxmox VE 中使用 Cloud-init 模板快速创建虚拟机

Cloud-Init 的作用

Cloud-init 是一个 Linux 虚拟机的初始化工具,被广泛应用在阿里云、华为云、AWS、OpenStack 等主流云平台中,用于快速新建虚拟机,并进行一些系统初始化的任务,包括 NTP、软件源、主机名、IP、磁盘和 SSH 密钥等。

获取 Cloud Images

Cloud Images 是什么?

  1. 使用对象:Cloud Images 主要面向公有云用户,包括 AWS、Azure、GCP、阿里云和腾讯云等云服务器。它支持二次定制与批量部署,适合在虚拟机环境中使用。
  2. 文件格式:Cloud Images 是一种虚拟磁盘镜像,通常采用 rawvmdkqcow2img 格式,区别于一般发行版常见的 iso 格式。
  3. 功能:Cloud Images 的功能与 Server 版本相似,但精简了无用的软件包,体积更小,性能消耗也更低。
  4. 安装方式:与其他版本的安装方式不同,Cloud Images 使用的并不是 ISO 文件,而是将虚拟磁盘镜像文件直接挂载到虚拟机上。通过内置的 Cloud-init 组件,Cloud Images 可以自动配置 root 账号和密码,无需手动创建账号,开机即用。这种方式实现了快速部署,非常适合虚拟环境。

总而言之,Cloud Images 镜像已内置 Cloud-init 组件,无需额外安装。以下是一些常见 Linux 发行版 Cloud Images 的下载地址:

制作虚拟机模板

  1. 下载你需要的系统对应的 Cloud Images 镜像(PVE 支持两种 Cloud Images 类型,分别为 nocloud v1configdrive v2),这里以 Debian 11 为例。可以直接使用 wget 在 PVE 里下载。

    wget https://cloud.debian.org/images/cloud/bullseye/latest/debian-11-nocloud-amd64.qcow2
  1. 创建一个虚拟机,注意 SCSI 控制器必须是 VirtIO SCSI,无需创建硬盘,如果创建了自行分离删除。

  2. 在创建的虚拟机硬件设置里添加 CloudInit 设备

  3. 使用 SSH 或者 Xftp 工具将镜像文件上传到 PVE 服务器(wget 下载的跳过此步),使用下面的命令将磁盘镜像导入到虚拟机,成功后 PVE 面板的 VM 硬件里会出现未使用的磁盘。

    # 900 为虚拟机ID
    qm importdisk 900 debian-11-nocloud-amd64.qcow2 local-lvm


  1. 双击这个未使用磁盘启用它,总线/设置选择 SCSI,然后在 选项-引导顺序 中,将此磁盘设置为第一项。

  2. 修改 Cloud-Init,填入你需要设置的信息,Cloud-Init 会将 VM 的名字作为主机名。

    用户名:在 Debian 11 的模板系统中,默认用户名为 debian。如果您配置的是 root 用户或其他用户登录,请直接输入相应的用户名。如果不输入用户名,将自动使用默认用户进行登录。

    密码:请在此处输入上述用户的密码。建议填写密码,否则您将无法通过控制台登录系统。

    DNS 域:您可以在此输入虚拟机的域名。如果不输入,将继承 PVE 主机的域名设置。

    DNS 服务器:如果虚拟机使用其他域名解析服务器,请在此输入相应的地址。如果不输入,将继承 PVE 主机的 DNS 服务器地址。

    SSH 公钥:在此输入用于 SSH 连接虚拟机的公钥,以实现密钥登录。

    IP 配置:如果不输入任何信息,虚拟机将会使用 DHCP 自动分配 IPv4 和 IPv6 地址。您也可以在此定义虚拟机的 IP 地址、子网掩码和网关地址。

  1. 扩容硬盘,启动 VM 即可,初次启动可能比较慢,如果卡了尝试重启试试。

  2. 如果 Cloud-Init 配置没有生效,使用 PVE 的控制台登录虚拟机,使用 cloud-init -v 命令查看是否安装了 Cloud-Init。如果没有返回值,则使用下方的安装命令安装即可:

    # CentOS
    yum install cloud-init -y
    # Debian
    apt install cloud-init -y
  1. 设置完毕后只需右击 VM 保存为模板以后即可快速创建虚拟机。

常见问题

  1. hosts 文件 /etc/hosts 重启会重置

    修改 /etc/cloud/cloud.cfg 文件内容,将 update_etc_hosts 注释或删除掉即可

  2. DNS 配置文件 /etc/resolv.conf 重启会重置

    参考:如何在Linux实例中自定义配置DNS

引用

https://pve.proxmox.com/wiki/Qemu/KVM_Virtual_Machines
https://pve.proxmox.com/wiki/Cloud-Init_FAQ#What_is_cloud-init.3F
https://foxi.buduanwang.vip/virtualization/372.html

评论区
头像
    头像
    yubao
      

    注意,
    不要在pve这台宿主机上执行apt install cloud-init -y
    不要在pve这台宿主机上执行apt install cloud-init -y
    不要在pve这台宿主机上执行apt install cloud-init -y
    是在创建的虚拟机镜像上执行

    头像
    0x5c0f
      

    插眼,有用存一下

    头像
    悠米
      

    非常有帮助的内容,爱来自瓷器(=・ω・=)

    头像
    冷藏库干面
      

    大佬,请教一下,如此操作之后,创建虚拟机就使用从template克隆是么?

      头像
      chaochao3321
        
      @冷藏库干面

      可以试试直接完整克隆创建好的虚拟机,克隆好之后,直接修改新克隆虚拟机的cloud-init配置应该就可以了