二、服务器建议安装图形界面、便于通过图形界面管理虚拟机,新的虚拟机可通过以下脚本快速创建
前言
环境描述:centos7的kvm虚拟化。在自己服务器上搭建kvm虚拟化后,通过原始的镜像文件快速创建新的虚拟机。
一、kvm虚拟化简介
KVM(Kernel-based Virtual Machine)是一种开源的虚拟化技术,它利用硬件虚拟化扩展(如Intel VT-x、AMD-V等)来提供高效的虚拟化支持。KVM使得用户可以将物理服务器的资源(如CPU、内存、存储等)分割成多个虚拟机,每个虚拟机都像独立的物理机器一样运行操作系统和应用程序。
1. 虚拟化概述
虚拟化(Virtualization)是指通过软件或硬件技术,将物理资源(如CPU、内存、硬盘等)抽象成多个逻辑资源,使得多个虚拟环境(虚拟机)能够共享同一物理资源。虚拟化技术使得资源的利用率得到最大化,并且能提供隔离、可扩展性和灵活的资源管理。
虚拟化的实现程度可以分为以下几种类型:
- 完全虚拟化:虚拟机能够完全模拟硬件环境,操作系统可以在虚拟机中运行,无需做特别的修改。
- 部分虚拟化:虚拟化技术在操作系统中进行一定程度的支持,虚拟机和宿主机之间有更多的相互依赖。
- 硬件辅助虚拟化:现代CPU(如Intel VT-x、AMD-V)提供硬件支持,虚拟机能够直接访问硬件资源,提升性能。
2. KVM 虚拟化组件
KVM虚拟化部署通常需要以下软件包来实现虚拟化功能:
- qemu-kvm:提供KVM的底层仿真支持。QEMU是一个开放源码的虚拟化工具,可以将虚拟机硬件与实际硬件进行仿真,结合KVM实现虚拟化。
- libvirt-daemon:
libvirtd
守护进程,用于管理虚拟机的生命周期,包括创建、启动、停止虚拟机等操作。它与宿主机的KVM虚拟化系统进行交互,提供了一个统一的管理接口。 - libvirt-client:客户端工具,提供命令行管理虚拟机的命令。用户可以通过
virsh
等命令行工具与虚拟化环境交互。 - libvirt-daemon-driver-qemu:
libvirtd
连接QEMU的驱动,提供与QEMU的通信功能,帮助管理虚拟机的运行。 - virt-manager:图形管理工具,提供一个用户友好的界面来管理虚拟机。通过该工具,用户可以方便地创建、删除、启动和管理虚拟机。
3. libvirtd与KVM
libvirtd是虚拟化服务的核心部分,它管理虚拟机的生命周期,包括虚拟机的创建、删除、启动、停止、资源管理等。libvirtd
与QEMU/KVM结合,提供了强大的虚拟化支持。它使得管理员和用户能够方便地管理虚拟机,不论是通过命令行(virsh
)、图形界面(virt-manager
)还是编程接口(API)。
二、服务器建议安装图形界面、便于通过图形界面管理虚拟机,新的虚拟机可通过以下脚本快速创建
sed的修改主要是修改名称、uuid、新的qcow2的文件、mac地址,这里uuid和mac地址的处理方式比较暴力,直接删除了, 新的虚拟机会自动创建唯一的地址和uuid参数。当然也可以用命令uuidgen生成新的uuid,或者手动修改的方式,但是在脚本中删除是最易实现的。也可以用uuidgen生成一个类似的mac地址随机值:
uuidgen | tr '[:upper:]' '[:lower:]' | sed 's/\(..\)/\1:/g' | cut -c1-17
遇到的问题:
前面的行删除后,后面行数变了,比如:原本要修改的第40行,变成了第39行,那么写的时候也需要注意这个问题。
代码如下(示例):
#!/bin/bash
# 快速创建新的虚拟机
# 用法提示函数
usage() {
echo "用法: $0 <源虚拟机名称> <新虚拟机名称>"
echo "例子: $0 centos7 new_vm"
exit 1
}
# 检查参数数量
if [ $# -ne 2 ]; then
echo "错误: 必须提供两个参数!"
usage
fi
# 检查源虚拟机镜像文件是否存在
dir="/var/lib/libvirt/images"
conf="/etc/libvirt/qemu"
if [ ! -f "$dir/$1.qcow2" ]; then
echo "错误: 源虚拟机镜像文件 $1.qcow2 不存在!"
exit 1
fi
if [ ! -f "$conf/$1.xml" ]; then
echo "错误: 源虚拟机配置文件 $1.xml 不存在!"
exit 1
fi
# 旋转进度指示器
spin() {
local spinstr='/|\\-' # 定义旋转字符
local i=0 # 初始字符位置
local delay=0.2 # 调整延迟时间为0.2秒
while true; do
# 使用 tput 清除当前行并输出旋转字符
tput cr # 将光标移到行首
echo -n "${spinstr:$i:1}" # 输出旋转符号
sleep $delay # 延迟,控制旋转速度
((i=(i+1)%4)) # 符号循环
done
}
# 启动旋转的进度指示器
spin &
# 获取 spin 函数的进程ID
spin_pid=$!
# 捕获退出信号,确保进度指示器退出
trap "kill -9 $spin_pid; wait $spin_pid &>/dev/null; echo '进度指示器已成功终止'" EXIT
# 复制原始虚拟机镜像和配置文件
cp $dir/$1.qcow2 $dir/$2.qcow2
cp $conf/$1.xml $conf/$2.xml
# 修改新的 XML 配置文件
sed -i "9c <name>$2</name>" $conf/$2.xml
sed -i '10d' $conf/$2.xml
sed -i "40c <source file='$dir/$2.qcow2'/>" $conf/$2.xml
sed -i '73d' $conf/$2.xml
# 定义新的虚拟机
virsh define $conf/$2.xml
virsh_status=$? # 捕获 virsh define 命令的返回值
# 检查 virsh define 命令的执行结果
if [ $virsh_status -eq 0 ]; then
echo "success, $2 创建成功!"
else
echo "fail, 虚拟机定义失败."
fi
三、另一种写法
原来的进度指示器函数如下:
之前的代码确实是使用 \r
来回到行首而不是 tput cr
。"\r"
是一个转义字符,用于将光标移到当前行的开始位置,也能达到相同的效果,类似于清屏。这里需要注意"\r"不能放在echo这行的末尾,像下面这样,会导致输出结果与预期不符。
echo -n -e "${spinstr:$i:1}\r"
tput
是一个用于控制终端的工具,它可以通过发送控制字符来操作终端的行为。cr
是tput
的一个参数,表示 "Carriage Return"(回车),它的功能与 ASCII 控制字符\r
类似,都是将光标移到当前行的开始位置。
spin() {
local spinstr='/|\\-' # 定义旋转字符
local i=0 # 初始字符位置
local delay=0.2 # 调整延迟时间为0.2秒
while true; do
# 使用 \r 将光标移到行首并输出旋转字符
echo -n -e "\r${spinstr:$i:1}" # 输出旋转符号
sleep $delay # 延迟,控制旋转速度
((i=(i+1)%4)) # 符号循环
done
}
spin
总结
如果你已经搭建了kvm的虚拟化环境,那么可以上上述脚本快速创建新的虚拟机,建议做一个原始机来克隆新的虚拟机,原始机环境配置好之后不动。