暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Cloud-init 概述及 PVE 下创建步骤说明

老柴杂货铺 2025-04-07
19

Cloud-Init是一个开源的云初始化程序,广泛应用于各种云计算平台,如AWS、Microsoft Azure、Google Cloud Platform(GCP)、OpenStack等。在Proxmox VE(PVE)虚拟化环境中,Cloud-Init用于在虚拟机(VM)首次启动时自动执行配置任务,如设置主机名、用户和组、安装软件包、配置网络等。

工作原理

Cloud-Init在实例首次启动时运行,根据用户提供的元数据和用户数据执行配置。这些数据通常以YAML格式提供,包含元数据(如实例ID、主机名)和用户数据(定义启动时要执行的具体配置和脚本)。

在不同操作系统的云服务器上安装Cloud-Init工具的方法不同,请在root用户下执行相关安装操作

cloud-init-23.2.2.tar.gz源码包下载地址:https://launchpad.net/cloud-init/trunk/23.2.2/+download/cloud-init-23.2.2.tar.gz

1.CentOS7

    # 查询当前系统环境是否已安装cloud-init, 执行有结果表示已经安装
    cloud-init -v
    # 删除cloud-init缓存目录
    rm -rf /var/lib/cloud/*
    # 安装cloud-init依赖包(依赖python3 环境)
    yum install python3-pip -y
    yum install python3-devel -y
    # 下载cloud-init压缩包
    wget https://launchpad.net/cloud-init/trunk/23.2.2/+download/cloud-init-23.2.2.tar.gz
    # 解压cloud-init压缩包
    tar -zxvf cloud-init-23.2.2.tar.gz
    # 进入cloud-init-23.2.2目录文件夹,并安装所有依赖库
    cd cloud-init-23.2.2
    pip3 install -r requirements.txt
    # 安装cloud-init
    python3 setup.py build
    python3 setup.py install --init-system systemd
    # 重启cloud-init并查看cloud-init状态
    systemctl restart cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
    systemctl status cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
    # 设置cloud-init相关服务为开机自启动
    systemctl enable cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
    # 检查cloud-init版本以及是否正常运行
    cloud-init -v
    cloud-init init --local 
    复制

    2.Debian和Ubuntu操作系统

      # 查询当前系统环境是否已安装cloud-init, 执行有结果表示已经安装
      cloud-init -v
      # 删除cloud-init缓存目录
      rm -rf /var/lib/cloud/*
      rm -/var/log/cloud-init*
      # 更新apt,检查是否有wget,没有则安装
      sudo apt update
      sudo apt install wget 
      # 安装依赖包
      apt-get install cloud-guest-utils -y
      apt-get install python3-pip -y
      apt-get install python3-devel
      # 下载cloud-init压缩包
      wget https://launchpad.net/cloud-init/trunk/23.2.2/+download/cloud-init-23.2.2.tar.gz
      # 解压cloud-init压缩包
      tar -zxvf cloud-init-23.2.2.tar.gz
      # 进入cloud-init-23.2.2目录文件夹,并安装所有依赖库
      cd cloud-init-23.2.2
      pip3 install -r requirements.txt
      # 安装cloud-init
      python3 setup.py build
      python3 setup.py install --init-system systemd
      # 重启cloud-init并查看cloud-init状态
      systemctl restart cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
      systemctl status cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
      # 设置cloud-init相关服务为开机自启动
      systemctl enable cloud-init-local.service cloud-init.service cloud-config.service cloud-final.service
      # 检查cloud-init版本以及是否正常运行
      cloud-init -v
      cloud-init init --local 
      复制

      在PVE上使用Cloud-Init的步骤

      准备Cloud-Init模板:下载支持Cloud-Init的镜像(如Ubuntu或CentOS的云镜像),创建虚拟机并导入镜像1。

      配置虚拟机:添加Cloud-Init设备,设置启动项和网络配置,如设置用户名、密码、IP地址等。

      启动虚拟机:启动后,Cloud-Init会自动执行配置任务,完成虚拟机的初始化

      一、准备 Cloud-Init 模板

      许多发行版本已经提供了即时可用的 Cloud-Init 映像(作为 .qcow2 文件) ,所以你也可以直接下载和导入这样的镜像。

      官方镜像下载

        # CentOS
        https://cloud.centos.org/centos/
        # 例如,CentOS 7 用于 PVE 虚拟平台 Cloud Image 镜像
        https://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud-2211.qcow2


        # Ubuntu:
        https://cloud-images.ubuntu.com/releases/
        # 例如,Ubuntu 24.04 用于 PVE 虚拟平台 Cloud Image 镜像
        https://cloud-images.ubuntu.com/releases/24.04/release/ubuntu-24.04-server-cloudimg-amd64.vmdk


        # Openeuler
        https://www.openeuler.org/zh/download/?version=openEuler%2024.03%20LTS
        # 例如,Openeuler 24.03 用于 PVE 虚拟平台 Cloud Image 镜像
        https://mirrors.163.com/openeuler/openEuler-24.03-LTS/virtual_machine_img/x86_64/openEuler-24.03-LTS-x86_64.qcow2.xz


        # OpenAnolis
        https://openanolis.cn/download
        # 例如,OpenAnolis 3 LTS 3.2104.20240819 用于 PVE 虚拟平台 Cloud Image 镜像
        https://alinux3.oss-cn-hangzhou.aliyuncs.com/aliyun_3_x64_20G_nocloud_alibase_20240819.qcow2


        # Debian:
        https://cloud.debian.org/images/cloud/
        # 例如,debian-12 用于 PVE 虚拟平台 Cloud Image 镜像
        https://cloud.debian.org/images/cloud/bookworm/latest/debian-12-generic-amd64.qcow2


        # Fedora:
        https://alt.fedoraproject.org/cloud/


        # Opensuse:
        https://software.opensuse.org/distributions/leap#JeOS-ports


        # Redhat:
        https://access.redhat.com/downloads/content/69/ver=/rhel---7/x86_64/product-downloads
        复制

        在下面的例子中,我们将使用 Ubuntu 中心提供的云映像。

          # 下载镜像
          wget https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64.img
          # 创建新的虚拟机
          qm create 9000 --memory 2048 --net0 virtio,bridge=vmbr0
          # 将下载好的磁盘镜像导入 local-lvm 存储
          qm importdisk 9000 bionic-server-cloudimg-amd64.img local-lvm --format=raw
          # 最后将新的磁盘加载到虚拟机上作为 scsi 设备
          # Ubuntu Cloud-Init 映像需要 SCSI 驱动器的 virtio-SCSI-pci 控制器类型。
          qm set 9000 --scsihw virtio-scsi-pci --scsi0 local-lvm:vm-9000-disk-0
          # 配置 CD-ROM 驱动器,用于将 Cloud-Init 数据传递给 VM
          qm set 9000 --ide2 local-lvm:cloudinit
          # 将引导磁盘参数设置为 scsi0 ,并将 BIOS 限制为仅从磁盘引导。这将加速引导,因为 VM BIOS 会跳过可引导 CD-ROM 的测试。
          qm set 9000 --boot c --bootdisk scsi0
          # 启动新建的镜像
          qm start 9000
          复制

          注:经过实测,除了 importdisk 步骤外,其余步骤均可在 PVE 的 web 面板上完成,建议终端操作并观察 web 变化后,再尝试纯 web 界面操作。

          二、配置Cloud-Init工具

          通过pve 控制台登录VM9000的配置

          1.用户可以根据需要根据用户类型配置登录云服务器的用户权限。使用root账户登录,需要开启root用户的ssh权限,并开启密码远程登录。

          若用户选择注入密码,则通过自己注入的密码进行远程SSH或noVNC登录。

          若用户选择注入密钥,则通过自己注入的密钥进行远程SSH登录。

          2.设置开放root密码远程登录并开启root用户的ssh权限。

          以CentOS 6.7系列操作系统为例,在“/etc/cloud/cloud.cfg”设置“disable_root”值为“0”表示不禁用(部分OS的Cloud-Init配置使用“true”表示禁用,“false”表示不禁用),设置“ssh_pwauth”为“1”启用密码远程登录,“lock_passwd”设置为“False”表示不锁住用户密码。

            users:
             - name: root
               lock_passwd: False
            disable_root: 0
            ssh_pwauth: 1
            复制

            3.在配置文件“/etc/cloud/cloud.cfg”中禁用Cloud-Init接管网络。

            当Cloud-Init版本等于或高于0.7.9版本时,在配置文件“/etc/cloud/cloud.cfg”中增加如下内容,禁用Cloud-Init接管网络。

              network:
                config: disabled
              复制

              4.配置agent访问OpenStack数据源。

              在“/etc/cloud/cloud.cfg”最后一行添加如下内容,配置agent访问OpenStack数据源。

                datasource_list: [ OpenStack ]
                datasource:
                  OpenStack:
                    metadata_urls: ['http://169.254.169.254']
                    max_wait120
                    timeout5
                    apply_network_config: false
                复制

                说明:

                max_wait和timeout可由用户自定义是否需要配置,上述回显信息中max_wait和timeout的取值仅供参考。

                当操作系统版本低于Debian8、CentOS 5时,不支持配置agent访问OpenStack数据源。

                CentOS、EulerOS操作系统云服务器必须要禁用默认的zeroconf路由,以便精确访问OpenStack数据源。

                echo "NOZEROCONF=yes" >> etc/sysconfig/network

                apply_network_config: false为可选项,对于使用Cloud-Init 18.3及以上版本的用户,需添加此配置项。

                5.在配置文件“/etc/cloud/cloud.cfg”中补充如下内容。

                manage_etc_hosts: localhost

                防止启动云服务器时,系统长时间卡在“Waiting for cloudResetPwdAgent”状态。

                6.执行vi etc/ssh/sshd_config命令,在vi编辑器中打开“/etc/ssh/sshd_config”。

                将“sshd_config”中的“PasswordAuthentication”的值修改为“yes”。

                如果是SUSE和openSUSE操作系统,需要同时配置“sshd_config”文件中的以下两个参数为“yes”。

                  PasswordAuthentication
                  ChallengeResponseAuthentication
                  复制

                  7.修改cloud.cfg配置文件里面的cloud_init_modules配置。

                  将ssh从最后提前到第一位处理,提高云服务器ssh登录速度。

                  开启机器名更新机制,请勿注释或删除“ - update_hostname”语句。

                    cloud_init_modules:
                     - ssh
                     - migrator
                     - bootcmd
                     - write-files
                     - growpart
                     - resizefs
                     - set_hostname
                     - update_hostname
                     - update_etc_hosts
                     - rsyslog
                     - users-groups
                    复制
                    8.确保Cloud-Init启用。

                    若存在/etc/cloud/cloud-init.disabled文件,则执行cloud-init clean --machine-id,否则跳过。

                    9.检查Cloud-Init工具相关配置是否成功

                    执行以下命令,无错误发生,说明Cloud-Init配置成功。

                      cloud-init init --local
                      复制

                      正确安装的Cloud-Init会显示Cloud-Init的版本详细信息,并且无任何错误信息。例如,正确安装的情况下,不含有缺少文件的提示信息。

                      10.最后一个步骤,将 VM 转换为模板会很有帮助。然后,您可以从这个模板快速创建链接克隆。从 VM 模板进行部署要比创建完整的克隆(副本)快得多。

                        qm template 9000
                        复制

                        三、 部署 Cloud-Init 模板

                        可以通过克隆轻松地部署这样的模板:

                          qm clone 9000 123 --name ubuntu2
                          #调整系统盘为100G
                          qm disk resize 123 scsi0 100G
                          复制
                          配置用于身份验证的 SSH 公钥,并配置 IP 设置(可选)
                            qm set 123 --sshkey ~/.ssh/id_rsa.pub
                            #静态配置
                            qm set 123 --ipconfig0 ip=10.168.2.123/24,gw=10.168.2.1,ip6=dhcp 
                            #动态配置
                            qm set 123 --ipconfig0 ip=dhcp,ip6=dhcp
                            #设置用户名和密码
                            qm set 123 --ciuser root --cipassword 123123 
                            # 配置DNS
                            qm set 123 --nameserver 223.5.5.5
                            #添加一块100G的数据盘
                            #qm set 123 --scsi1 iothread=1,local-lvm:100
                            复制

                            注意事项

                            确保虚拟机镜像支持Cloud-Init,否则需要手动安装和配置。

                            在创建虚拟机时,添加Cloud-Init设备,以便传递配置数据。

                            可以通过修改/etc/cloud/cloud.cfg文件来配置Cloud-Init的行为,如允许密码认证、设置主机名等。

                            还可以配置 DNS 域等,更多配置项请查看 PVE 官网 Cloud-Init Support (https://pve.proxmox.com/wiki/Cloud-Init_Support)
                            启动虚拟机,验证之前的配置是否生效
                              qm start 123
                              复制
                              移除虚拟机
                                # 谨慎操作 ,vmid 虚拟机ID 一定要再三确认
                                $ qm destroy 123 
                                复制
                                四、配置模板系统
                                CentOS
                                  # 配置yum源
                                  sudo sed -e 's|^mirrorlist=|#mirrorlist=|g' -e 's|^#baseurl=http://mirror.centos.org/centos|baseurl=https://mirrors.ustc.edu.cn/centos|g' -i.bak etc/yum.repos.d/CentOS-Base.repo


                                  # 设置时区
                                  timedatectl set-timezone Asia/Shanghai


                                  # 安装vim
                                  yum install vim bash-completion


                                  # 修改ssh远程
                                  vim etc/ssh/sshd_config
                                  # 开启root登录(如果需要的话;这里开启了之后Cloud-Init用户就可以设置root)
                                  PermitRootLogin yes
                                  # 开启密钥登录
                                  PubkeyAuthentication yes
                                  # 密钥路径
                                  AuthorizedKeysFile
                                  # 开启密码登录(默认只允许密钥登录)
                                  PasswordAuthentication yes
                                  # 不允许空密码登录
                                  PermitEmptyPasswords no
                                  # 关闭连接的DNS解析
                                  UseDNS no
                                  复制
                                  Ubuntu
                                    # 设置时区
                                    timedatectl set-timezone Asia/Shanghai


                                    # 设置APT仓库源
                                    sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list


                                    # 更新源和安装常用软件
                                    apt update && sudo apt install vim bash-completion -y


                                    # 更新系统
                                    sudo apt upgrade


                                    # 修改SSH配置
                                    vim /etc/ssh/sshd_config
                                    # 开启root登录(如果需要的话;这里开启了之后Cloud-Init用户就可以设置root)
                                    PermitRootLogin yes
                                    # 开启密钥登录
                                    PubkeyAuthentication yes
                                    # 密钥路径
                                    AuthorizedKeysFile
                                    # 开启密码登录(默认只允许密钥登录)
                                    PasswordAuthentication yes
                                    # 不允许空密码登录
                                    PermitEmptyPasswords no
                                    # 关闭连接的DNS解析
                                    UseDNS no
                                    复制
                                    五、PVE常用命令
                                      qm monitor <vmid>         # 连接到虚拟机控制监视器
                                      qm clone <vmid> <newid> [OPTIONS]  # 克隆虚拟机
                                      qm start <vmid>               # 启动实例
                                      qm shutdown <vmid>      # 优雅停止实例 发送关机命令
                                      qm wait <vmid> [time]   wait until vm is stopped
                                      qm stop <vmid>               # 停止实例 强制停止
                                      qm reset <vmid>              # 重启实例 相当于stop然后再start
                                      qm suspend <vmid>        # 暂停实例
                                      qm resume <vmid>         # 恢复实例
                                      qm cad <vmid>               #发送按键 ctrl-alt-delete
                                      qm destroy <vmid>        # 销毁实例(删除所有已使用/拥有的卷)
                                      qm unlock <vmid>         # 清除迁移/备份锁
                                      qm status <vmid>          # 显示实例状态
                                      qm cdrom <vmid> [<device>] <path>  set cdrom path. <device is ide2 by default>
                                      qm cdrom <vmid> [<device>] eject   eject cdrom
                                      qm unlink <vmid> <volume>  delete unused disk images
                                      qm vncproxy <vmid> <ticket>  open vnc proxy
                                      qm vnc <vmid>           start (X11) vncviewer (experimental)
                                      qm showcmd <vmid>     # 显示命令行(调试信息)
                                      qm list                             # 列出所有虚拟机
                                      qm startall                       # 启动所有虚拟机 当onboot=1时
                                      qm stopall [timeout]       # 停止所有虚拟机(默认超时为3分钟)
                                      qm [create|set] <vmid>  # 创建虚拟机
                                          --memory  <MBYTES>    memory in MB (64 - 8192)
                                          --sockets <N>         set number of CPU sockets <N>
                                          --cores <N>           set cores per socket to <N>
                                          --ostype NAME         specify OS type
                                          --onboot [yes|no]     start at boot
                                          --keyboard XX         set vnc keyboard layout
                                          --cpuunits <num>      CPU weight for a VM
                                          --name <text>         set a name for the VM
                                          --description <text>  set VM description
                                          --boot [a|c|d|n]      specify boot order
                                          --bootdisk <disk>     enable booting from <disk>
                                          --acpi (yes|no)       enable/disable ACPI
                                          --kvm (yes|no)        enable/disable KVM
                                          --tdf (yes|no)        enable/disable time drift fix
                                          --localtime (yes|no)  set the RTC to local time
                                          --vga (gd5446|vesa)   specify VGA type
                                          --vlan[0-9u]          MODEL=XX:XX:XX:XX:XX:XX[,MODEL=YY:YY:YY:YY:YY:YY]
                                          --ide<N>              [volume=]volume,[,media=cdrom|disk]
                                                                [,cyls=c,heads=h,secs=s[,trans=t]]
                                                                [,cache=none|writethrough|writeback]
                                                                [,snapshot=on|off][,cache=on|off][,format=f]
                                                                [,werror=enospc|ignore|report|stop]
                                                                [,rerror=ignore|report|stop]
                                                                [,backup=no|yes]
                                          --ide<N> <GBYTES>     create new disk
                                          --ide<N> delete       remove drive - destroy image
                                          --ide<N> undef        remove drive - keep image
                                          --cdrom <file>        is an alias for --ide2 <file>,media=cdrom
                                          --scsi<N>             [volume=]volume,[,media=cdrom|disk]
                                                                [,cyls=c,heads=h,secs=s[,trans=t]]
                                                                [,snapshot=on|off][,format=f]
                                                                [,cache=none|writethrough|writeback]
                                                                [,werror=enospc|ignore|report|stop]
                                                                [,backup=no|yes]
                                          --scsi<N> <GBYTES>    create new disk
                                          --scsi<N> delete      remove drive - destroy image
                                          --scsi<N> undef       remove drive - keep image
                                          --virtio<N>           [volume=]volume,[,media=cdrom|disk]
                                                                [,cyls=c,heads=h,secs=s[,trans=t]]
                                                                [,snapshot=on|off][,format=f]
                                                                [,cache=none|writethrough|writeback]
                                                                [,werror=enospc|ignore|report|stop]
                                                                [,rerror=ignore|report|stop]
                                                                [,backup=no|yes]
                                          --virtio<N> <GBYTES>  create new disk
                                          --virtio<N> delete    remove drive - destroy image
                                          --virtio<N> undef     remove drive - keep image


                                      pveperf    # 基准脚本
                                      pvesr list    # 列出存储复制作业
                                      ha-manager status   # 查看HA状态
                                      pvecm nodes    # 查看集群节点
                                      pvecm status    # 查看集群状态
                                      pve-firewall compile  # 查看防火墙规则
                                      pve-firewall localnet  # 输出本地网络信息
                                      pve-firewall restart    # 重启防火墙
                                      pve-firewall stop       # 停止防火墙
                                      pve-firewall start      # 启动防火墙


                                      pvesh get /version   # 查看集群
                                      pvesh get /cluster/resources  #查看集群资源状况
                                      pvesh get /nodes   # 显示所有node
                                      pvesh get /nodes/<nodeid>/qemu   # 显示某节点中的虚拟机
                                      pvesh get /nodes/<nodeid>/qemu/<vmid>/status/current    # 显示某虚拟机状态
                                      pvesh create /nodes/<nodeid>/qemu/<vmid>/status/start    # 开启一个虚拟机 [注意是create哦,不是get了]
                                      pvesh get /nodes/<nodeid>/lxc/<ctid>/snapshot    # 显示某节点下容器快照
                                      pvesh get /nodes/<nodeid>/disks/zfs    # 显示某节点的ZFS存储区
                                      pvesh get /nodes/<nodeid>/disks/list  # 显示某节点的磁盘列表
                                      复制

                                      文章转载自老柴杂货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                      评论