相关连接:
在 KVM 虚拟化环境中,你可以将已经安装好的Linux虚拟机制作成系统镜像模板,供后续快速创建新虚拟机使用。
1、创建一个模板虚拟机
我们使用Rocky-10.0-x86_64-minimal.iso镜像来创建虚拟机
#创建虚拟机
virt-install \
--name rocky10 \
--vcpu 2 \
--memory 4096 \
--disk path=/data/libvirt/images/rocky10.qcow2,size=40,bus=virtio \
--cdrom /data/libvirt/iso/Rocky-10.0-x86_64-minimal.iso \
--network bridge=br0 \
--graphics vnc \
--os-variant rocky10 \
--noautoconsole
#虚拟机创建完成后,我们进入web控制台安装系统,直到系统安装完成
2、登录模板虚拟机中进行操作
#模板虚拟机中安装cloud-init工具
#cloud-init工具是实现自动化配置的工具
yum install cloud-init cloud-utils-growpart
#验证安装是否成功
rpm -qa | grep cloud-init
#查看版本
cloud-init -v
#启用cloud-init相关服务,不启动服务
systemctl enable cloud-init-local.service
systemctl enable cloud-init.service
systemctl enable cloud-config.service
systemctl enable cloud-final.service
#配置文件位于/etc/cloud目录,主配置文件为/etc/cloud/cloud.cfg
vi /etc/cloud/cloud.cfg
preserve_hostname: false #避免克隆出的虚拟机有相同主机名
:wq! #保存退出
#清除已有实例数据
执行rm -rf /var/lib/cloud/*
#清除ssh密钥
rm -f /etc/ssh/ssh_host_*
#清除缓存
cloud-init clean
#重置机器ID,这个配置特别适合需要批量部署相同配置但不同主机名的虚拟机场景。
truncate -s 0 /etc/machine-id
#网络配置保持DHCP模式
3、登录kvm宿主机操作
3.1关闭模板虚拟机
virsh list --all #查看虚拟机
virsh shutdown rocky10 #关闭
virsh destroy #或强制关闭(如果无法正常关机)
3.2清理模板虚拟机(移除临时文件、主机名等)
#清理模板虚拟机
virt-sysprep -d rocky10
#验证清理效果
virt-cat -d rocky10 /etc/machine-id
3.3将原始磁盘镜像转换为压缩优化的模板镜像
qemu-img convert -O qcow2 -c /data/libvirt/images/rocky10.qcow2 /data/libvirt/images/rocky10_template.qcow2
3.4使用模板创建新虚拟机
#编辑创建新虚拟机的执行脚本
vi create_vm_rocky10.sh
#!/bin/bash
#生成随机主机名和密码
HOSTNAME="rocky10-vm-$(date +%s | md5sum | head -c 4)"
#生成6位密码
PASSWORD=$(openssl rand -base64 9 | tr -dc 'A-Za-z0-9!@#$%^&*' | head -c6)
#创建cloud-init配置临时文件
cat > /tmp/user-data-${HOSTNAME} <<EOF
#cloud-config
hostname: ${HOSTNAME}
fqdn: ${HOSTNAME}
manage_etc_hosts: true
chpasswd:
list: |
root:${PASSWORD}
expire: false
ssh_pwauth: true
EOF
#显示生成的密码(生产环境建议记录到安全位置)
echo "VM ${HOSTNAME} 的 root 密码: ${PASSWORD}" | tee /tmp/vm_${HOSTNAME}_cred.txt
#定义虚拟机模板镜像,40GB
DISK_TEMPLATE=/data/libvirt/images/rocky10_template.qcow2
#定义虚拟机磁盘镜像目录
VM_DIR=/data/libvirt/images
#拷贝模板镜像为新的虚拟机磁盘镜像
cp $DISK_TEMPLATE $VM_DIR/${HOSTNAME}.qcow2
#扩容到60GB,文件系统仍然是40GB,需要在虚拟机内部扩展分区
#qemu-img resize $VM_DIR/${HOSTNAME}.qcow2 60G
#启动虚拟机
virt-install \
--name ${HOSTNAME} \
--memory 2048 \
--vcpus 2 \
--disk path=$VM_DIR/${HOSTNAME}.qcow2,size=40,bus=virtio \
--import \
--os-variant rocky10 \
--network bridge=br0 \
--graphics vnc \
--noautoconsole \
--cloud-init user-data=/tmp/user-data-${HOSTNAME}
:wq! #保存退出
chmod +x create_vm_rocky10.sh #添加执行权限
sh create_vm_rocky10.sh #执行脚本创建新虚拟机
3.5登录到web控制台可以看到刚才创建的虚拟机
输入虚拟机账号密码即可登录到虚拟机内部。
可以继续执行创建脚本,继续创建新的虚拟机。
扩容虚拟机:
登录到虚拟机里面进行操作
#修复 GPT 分区表
parted -l /dev/vda
fdisk -l
再对磁盘进行扩容操作
至此,Linux下使用KVM虚拟机制作系统镜像模板完成。



