自动化KVM虚拟机创建脚本详解:从模板到高效部署的线上实践
以下是包含详细步骤解释的完整脚本及说明文档
vim kvm-vm-creator.sh
#!/bin/bash
# --------------------------
# 📌 环境配置与全局变量
# --------------------------
# 设置关键路径和基础配置(可根据环境修改)
export IMG_DIR="/data1/qcow_images" # 虚拟机磁盘存储目录(需提前创建)
export XML_DIR="/etc/libvirt/qemu" # 虚拟机XML配置模板目录
BASE_VM="base-centos79" # 基础模板名称(需与实际模板名一致)
VM_PREFIX="centos79-node" # 新建虚拟机名称前缀
MAC_PREFIX="52:54:00" # 合规MAC地址前缀(QEMU官方OUI)
# --------------------------
# 🔧 预检与依赖检查
# --------------------------
check_prerequisites() {
# 检查关键命令是否存在
command -v qemu-img >/dev/null 2>&1 || { echo -e "\n❌ 错误:未安装qemu-img工具"; exit 101; }
command -v virsh >/dev/null 2>&1 || { echo -e "\n❌ 错误:未安装libvirt管理工具"; exit 102; }
# 验证存储目录权限
[ -w "$IMG_DIR" ] || { echo -e "\n❌ 错误:无写入权限 $IMG_DIR"; exit 103; }
# 确认模板文件存在
[ -f "${XML_DIR}/${BASE_VM}.xml" ] || {
echo -e "\n❌ 错误:未找到模板配置文件 ${XML_DIR}/${BASE_VM}.xml"
echo "请先创建基础模板并导出XML配置"
exit 104
}
}
# --------------------------
# 🖥 用户交互模块
# --------------------------
get_vm_number() {
local input
while true; do
# 输入提示(带颜色高亮)
read -p "$(echo -e "\n\e[33m请输入虚拟机编号(1-250): \e[0m")" input
# 数字验证
[[ "$input" =~ ^[0-9]+$ ]] || {
echo -e "\n⚠️ 警告:必须输入纯数字"
continue
}
# 范围检查
(( input >=1 && input <=250 )) && break
echo -e "\n⚠️ 警告:范围限制为1-250"
done
echo "$input" # 返回有效编号
}
# --------------------------
# ⚙️ 核心创建流程
# --------------------------
create_vm() {
local vm_num=$1
local new_vm="${VM_PREFIX}${vm_num}"
local tmp_xml="/tmp/${new_vm}.xml"
# 阶段1:磁盘镜像准备
echo -n "⏳ 正在创建差异磁盘镜像... "
if ! qemu-img create -f qcow2 -b "${IMG_DIR}/${BASE_VM}.qcow2" \
"${IMG_DIR}/${new_vm}.qcow2" &>/dev/null; then
echo -e "\n❌ [错误] 磁盘创建失败,请检查存储空间"
return 1
fi
echo -e "\n\e[32m✅ [完成] 磁盘创建成功\e[0m"
# 阶段2:配置文件生成
echo -n "⏳ 正在生成虚拟机配置... "
cp "${XML_DIR}/${BASE_VM}.xml" "$tmp_xml" # 复制模板
# 批量替换关键标识(使用sed正则替换)
sed -i "s|${BASE_VM}|${new_vm}|g" "$tmp_xml"
sed -i "s|<uuid>.*</uuid>|<uuid>$(uuidgen)</uuid>|" "$tmp_xml"
# 生成合规MAC地址(保留QEMU官方OUI前缀)
local mac_suffix=$(tr -dc '0-9a-f' < /dev/urandom | head -c 6 | sed 's/\(..\)/\1:/g; s/:$//')
local new_mac="${MAC_PREFIX}:${mac_suffix}"
# 更新MAC地址(精确匹配模板中的mac标签)
sed -i "s|<mac address='..:..:..:..:..:..'/>|<mac address='${new_mac}'/>|" "$tmp_xml"
# 阶段3:注册虚拟机到libvirt
echo -n "⏳ 正在注册虚拟机配置... "
if ! virsh define "$tmp_xml" &>/dev/null; then
echo -e "\n❌ [错误] 虚拟机注册失败,请检查libvirt服务状态"
# 失败回滚:清理残留文件
rm -f "${IMG_DIR}/${new_vm}.qcow2" "$tmp_xml"
return 1
fi
echo -e "\n\e[32m✅ [完成] 虚拟机注册成功\e[0m"
# 最终确认信息
echo -e "\n\e[34;1m🎉 虚拟机创建成功!\e[0m"
echo "🖥 名称: ${new_vm}"
echo "💾 磁盘路径: ${IMG_DIR}/${new_vm}.qcow2"
echo "⚙️ 配置预览: $(virsh dumpxml ${new_vm} | grep '<source file')"
echo "🌐 MAC地址: ${new_mac}"
}
# --------------------------
# 🚀 主执行流程
# --------------------------
main() {
echo -e "\n\e[36m🚀 启动KVM虚拟机自动化创建流程\e[0m"
check_prerequisites # 执行环境检查
VM_NUMBER=$(get_vm_number) # 获取用户输入
create_vm "$VM_NUMBER" # 执行创建流程
}
# --------------------------
# 🔌 程序入口
# --------------------------
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
main "$@"
fi
📝 完整流程解析
1. 环境配置阶段
-
变量定义:通过全局变量集中管理关键路径和配置,便于快速适配不同环境
-
OUI前缀:使用QEMU官方分配的MAC地址前缀(52:54:00),确保网络兼容性
2. 预检机制
-
依赖检查 :验证
qemu-img
和virsh
命令可用性 -
权限验证:确保对镜像存储目录有写入权限
-
模板检查:确认基础模板XML文件存在
3. 用户交互
-
输入验证:
-
正则表达式匹配纯数字输入
-
数值范围限制(1-250)
-
循环输入直到获得有效值
-
4. 磁盘创建
-
写时复制技术 :基于
-b
参数创建差异磁盘,节省存储空间 -
静默模式 :
&>/dev/null
抑制命令行输出 -
错误处理:创建失败时自动终止流程
5. 配置生成
-
模板继承:复制基础XML配置文件
-
关键替换:
-
虚拟机名称替换(
sed
全局替换) -
UUID生成(
uuidgen
系统命令) -
MAC地址生成(保留OUI前缀的随机后缀)
-
-
精准替换:使用XML标签定位确保替换准确性
6. 注册流程
-
持久化配置 :
virsh define
将配置写入libvirt -
失败回滚:
-
删除残留磁盘文件
-
清理临时XML文件
-
返回非零退出码
-
7. 结果反馈
-
彩色输出:使用ANSI转义码实现状态可视化
-
信息汇总:显示关键虚拟机信息
-
后续指导:提示常用管理命令
🛠 使用指南
1. 环境准备
# 创建存储目录
mkdir -p /data1/qcow_images
# 准备基础模板
# 1. 创建基础虚拟机并安装系统
# 2. 关机后转换为qcow2格式
qemu-img convert -O qcow2 -p /var/lib/libvirt/images/base-centos79.qcow2 \
/data1/qcow_images/base-centos79.qcow2
# 导出模板XML配置
virsh dumpxml base-centos79 > /etc/libvirt/qemu/base-centos79.xml
2. 执行创建
chmod +x kvm-vm-creator.sh
sudo ./kvm-vm-creator.sh
# 按提示输入编号(例如:42)
3. 验证结果
virsh list --all # 查看虚拟机列表
virsh domblklist centos79-node42 # 查看磁盘信息
virsh domifaddr centos79-node42 # 查看网络配置
该脚本通过模块化设计和详细错误处理,实现了从磁盘创建到配置注册的全自动化流程。