kvm虚拟化快速创建新的虚拟机

  文章目录

前言

一、kvm虚拟化简介

1. 虚拟化概述

2. KVM 虚拟化组件

3. libvirtd与KVM

二、服务器建议安装图形界面、便于通过图形界面管理虚拟机,新的虚拟机可通过以下脚本快速创建

遇到的问题:

三、另一种写法

总结


前言

环境描述: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-daemonlibvirtd守护进程,用于管理虚拟机的生命周期,包括创建、启动、停止虚拟机等操作。它与宿主机的KVM虚拟化系统进行交互,提供了一个统一的管理接口。
  • libvirt-client:客户端工具,提供命令行管理虚拟机的命令。用户可以通过virsh等命令行工具与虚拟化环境交互。
  • libvirt-daemon-driver-qemulibvirtd连接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 是一个用于控制终端的工具,它可以通过发送控制字符来操作终端的行为。
  • crtput 的一个参数,表示 "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的虚拟化环境,那么可以上上述脚本快速创建新的虚拟机,建议做一个原始机来克隆新的虚拟机,原始机环境配置好之后不动。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值