在虚拟化环境中,自动化配置虚拟机(VM)是提高效率的关键。Proxmox VE(PVE)是一款流行的开源虚拟化平台,而Cloud-Init是一种用于初始化云实例的工具。结合PVE和Cloud-Init,我们可以快速创建和配置虚拟机镜像。本教程将详细介绍如何在PVE上利用Cloud-Init构造自己的镜像
什么是 Cloud-Init?
Cloud-Init 是一个用于初始化云实例的开源工具。它被广泛应用于各种云计算平台,如Amazon Web Services (AWS)、Microsoft Azure、Google Cloud Platform (GCP)、OpenStack等。Cloud-Init允许在实例首次启动时,自动化执行各种配置任务,如设置主机名、用户和组、安装软件包、配置网络等。
Cloud-Init 的工作原理
Cloud-Init在实例的首次启动时运行,并根据用户提供的元数据和用户数据执行配置。这些数据通常以YAML格式提供,可以包含以下几类信息:
- Meta-data(元数据):描述实例的基本信息,如实例ID、主机名等。
- User-data(用户数据):定义实例启动时要执行的具体配置和脚本。
前提条件
- 一台运行Proxmox VE的服务器
- 基本的Linux命令行操作知识
官方镜像下载
# cloud images下载地址
# centos:
http://cloud.centos.org/centos/
# ubuntu:
http://cloud-images.ubuntu.com/releases/
# debian:
https://cloud.debian.org/images/cloud/OpenStack/
# fedora:
https://alt.fedoraproject.org/cloud/
# rehat7:
https://access.redhat.com/downloads/content/69/ver=/rhel---7/x86_64/product-downloads
# opensuse:
https://software.opensuse.org/distributions/leap#JeOS-ports
构造镜像模板
在本教程中,我们将使用Ubuntu镜像作为示例 :
- 先从官方下载ubuntu的云镜像。执行如下命令:
wwget https://cloud-images.ubuntu.com/jammy/20240601/jammy-server-cloudimg-amd64-disk-kvm.img
- 使用下面的命令创建虚拟机:
VM_ID=999
qm create $VM_ID --cores 4 --memory 4096 --name ubuntu --net0 virtio,bridge=vmbr0
- 给虚拟机导入镜像
qm importdisk $VM_ID jammy-server-cloudimg-amd64-disk-kvm.img local-lvm
- 挂载创建好的硬盘到虚拟机
qm set $VM_ID --sata0 local-lvm:vm-$VM_ID-disk-0
- 创建cloudinit
qm set $VM_ID --sata1 local-lvm:cloudinit
- 设置默认启动项
qm set $VM_ID --boot c --bootdisk sata0
- 设置用户名和密码
qm set $VM_ID --ciuser root --cipassword 123123
- 配置网络
qm set $VM_ID --ipconfig0 ip=10.0.10.123/24,gw=10.0.10.1,ip6=dhcp #静态配置
qm set $VM_ID --ipconfig0 ip=dhcp,ip6=dhcp #动态配置
- 启动虚拟机
qm start $VM_ID
10.修改Cloud-init的配置
开启PasswordAuthentication
认证,编辑/etc/cloud/cloud.cfg
这个文件,添加 ssh_pwauth:true
,如下图:
添加这个配置后,会在对应命令添加如下配置文件。
root@ubuntu:~# cat /etc/ssh/sshd_config.d/50-cloud-init.conf
PasswordAuthentication yes
修改SSH配置文件,允许root用户登录
PermitRootLogin yes
- 添加国内的镜像源,本案中添加清华大学源为例。
在/etc/apt/sources.list.d
创建一个名为tsinghua.sources
的文件,添加如下内容:
Types: deb
URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu
Suites: noble noble-updates noble-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
# Types: deb-src
# URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu
# Suites: noble noble-updates noble-backports
# Components: main restricted universe multiverse
# Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
# 以下安全更新软件源包含了官方源与镜像站配置,如有需要可自行修改注释切换
Types: deb
URIs: http://security.ubuntu.com/ubuntu/
Suites: noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
# Types: deb-src
# URIs: http://security.ubuntu.com/ubuntu/
# Suites: noble-security
# Components: main restricted universe multiverse
# Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
# 预发布软件源,不建议启用
# Types: deb
# URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu
# Suites: noble-proposed
# Components: main restricted universe multiverse
# Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
# # Types: deb-src
# # URIs: https://mirrors.tuna.tsinghua.edu.cn/ubuntu
# # Suites: noble-proposed
# # Components: main restricted universe multiverse
# # Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
- 所有配置完成后,清除历史命令并关机
history -c && init 0
- 把该虚拟机转成模板
qm template $VM_ID
使用脚本批量创建虚拟机
批量创建需求如下:
- 利用虚拟机模板 999,批量创建 3 个虚拟机
- 新建的虚拟机 ID 为 20x,虚拟机名称为 demo-vmx
- 指定存储名称为 local
- 每个虚拟机 2 插槽 2 核心即 4 线程,内存 4G
- 每个虚拟机添加一块 50G 的数据盘
- 每个虚拟机添加一个内网网卡,即网络设备 (net0),网卡 IP 为 192.168.31.24x,网关为 192.168.31.254
- 设置系统 root 用户的密码为 password
for id in $(seq 1 1 3)
do
qm clone 999 24${id} --name demo-vm${id} -full true -storage local
qm set 24${id} --sockets 2 --cores 2 --memory 4096
qm set 24${id} --scsi1 iothread=1,local:100
qm set 24${id} --nameserver 114.114.114.114 --ipconfig1 ip=192.168.31.24${id}/24,gw=192.168.31.254 --ciuser root --cipassword password
qm start 24${id}
done