🚀 在 PVE 上创建 CentOS 7 模板
本文记录了如何在 Proxmox VE(PVE)中创建一个 CentOS 7 Cloud-init 模板,方便后续快速批量创建虚拟机。
1️⃣ 下载镜像和创建虚拟机
# 下载 CentOS 7 Cloud 镜像(qcow2 格式)
wget https://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud.qcow2
# 定义虚拟机 ID
VM_ID=7788
# 创建 2 核 2G 虚拟机
qm create $VM_ID --memory 2048 --cores 2 --name centos7 --net0 virtio,bridge=vmbr0
# 导入磁盘到 local
qm importdisk $VM_ID CentOS-7-x86_64-GenericCloud.qcow2 local
# 设置 SCSI 控制器和磁盘
qm set $VM_ID --scsihw virtio-scsi-pci --scsi0 local:$VM_ID/vm-$VM_ID-disk-0.raw
# 调整磁盘为 20GB
qm resize $VM_ID scsi0 20G
# 添加 cloud-init 设备
qm set $VM_ID --ide0 local:cloudinit
# 设置启动顺序
qm set $VM_ID --boot c --bootdisk scsi0
# 启用 QEMU Guest Agent(可选)
# 作用:开启后,PVE 可以通过 Guest Agent 获取虚拟机 IP、执行安全关机、快照一致性等操作。
# 注意:虚拟机内必须先安装并启动 qemu-guest-agent 服务才能生效。
qm set ${VM_ID} --agent enabled=1
# 配置默认 cloud-init
qm set $VM_ID --ipconfig0 ip=dhcp --ciupgrade 0 --ciuser "root" --cipassword "root"
# 启动虚拟机
qm start $VM_ID
2️⃣ 启动虚拟机后初始化(VNC 连接执行)
# 开启 root 密码登录 SSH
sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin yes/g' /etc/ssh/sshd_config
sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication yes/g' /etc/ssh/sshd_config
systemctl restart sshd
# 更换 yum 源为阿里云源
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# 更新软件
yum clean all
yum makecache fast
yum update -y
# 安装 qemu-guest-agent(方便获取 IP、状态等)
yum install -y qemu-guest-agent
systemctl enable --now qemu-guest-agent
# 设置时区为上海
timedatectl set-timezone Asia/Shanghai
# 清理 machine-id(避免克隆 VM 获取相同 IP)
echo > /etc/machine-id
# 清理历史命令
rm -rf ~/.bash_history && history -c
3️⃣ 使用 Cloud-init 永久开启 root 密码登录(解决 SSH 配置被覆盖问题)
因为 Cloud-init 会在首次启动时覆盖 /etc/ssh/sshd_config,所以手动修改文件可能无效。
推荐在模板中直接配置 cloud-init,让克隆的 VM 默认允许 root 登录和密码认证:
# 编辑 cloud-init 配置,让它在初始化阶段就允许 root 登录并启用密码认证
找到并调整以下字段
disable_root: 0
ssh_pwauth: 1
# 清理 cloud-init 状态(保证模板克隆后生效)
cloud-init clean
这样,模板克隆出的每台新虚拟机都会继承 root 密码登录和密码认证设置,无需每次手动修改 sshd_config。
4️⃣ 转换为模板
qm template ${VM_ID}
后续虚拟机创建后可通过以下命令获取虚拟机网络信息:
qm guest cmd ${VM_ID} network-get-interfaces
