PVE 创建 Centos 7 模板

发表于 2025-08-13 23:09:11 分类于 Linux运维 阅读量 306

🚀 在 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

🔗 参考来源