shell kvm 虚拟机镜像管理-自动创建删除停止和启动 qcow2 虚拟机

简介: 这是一个用于自动创建 KVM 虚拟机的 Bash 脚本。用户可以选择创建、删除、启动、关闭虚拟机或查看虚拟机的 IP 地址。脚本支持 Debian 12 和 Ubuntu 22.04 系统,并允许用户配置 CPU 线程数和内存大小。脚本会检查服务器的资源情况,确保输入的配置不会超过可用资源。
#!/bin/bash
# shell 自动创建 qcow2  虚拟机,注意虚拟机镜像制作的时候需要自动获取ip 
# virt-install --osinfo list | grep win | awk -F"," '{print $1}'            # 查看ubuntu镜像系统支持的版本

eiscRunDir=/datadisk/vm/eiscAUTO  
debianSourceQcow=/datadisk/myfolder/iso/public/qcow2/linux/debian12-username-eisc-000000.qcow2
#debianSourceQcow=/datadisk/myfolder/iso/qcow2/linux/debian12-username-eisc-000000.qcow2
#debianSourceQcow=/datadisk/myfolder/iso/public/qcow2/linux/debian12-manualConfig-homeip60-80GB-username-eisc-000000.qcow2
ubuntuSourceQcow=/datadisk/myfolder/iso/public/qcow2/linux/ubuntu22-username-eisc-000000.qcow2

sudo mkdir -p $eiscRunDir
sudo chmod 777 $eiscRunDir

echo "
######### kvm 虚拟机自动创建脚本 #########
1. 当前提供 debian12 和  ubuntu-lts-latest, ubuntu22.04 系统。   选择 12 
2. 配置 cpu 和 内存,单位GB, 内存允许输入小数     1 线程 2.5G 为:空格隔开  1  2.5 
3. 案例 debian12系统镜像,cpu为1线程,2.5G内存:    1    1    2.5    
"

systemMessage(){
   

    cputype=$(grep "model name" /proc/cpuinfo | uniq | awk -F ': ' '{print $2}')
    cores=$(cat /proc/cpuinfo | grep "cores" | uniq | awk '{print $NF}')
    processor=$(cat /proc/cpuinfo | grep "processor" | wc -l)
    # 获取 CPU 核心数和处理器线程数

    totalMemFree=$(free  -h |  awk 'NR==2{print $2}'    | sed "s/[A-Za-z]//g" )
    totalDiskFree=$(free -h |  awk 'NR==3{print $2}'    | sed "s/[A-Za-z]//g")
    memFree=$(free  -h      |  awk 'NR==2{print $NF}'   | sed "s/[A-Za-z]//g" )
    diskFree=$(free -h      |  awk 'NR==3{print $NF}'   | sed "s/[A-Za-z]//g")
    # 获取物理内存和虚拟内存的空闲量(单位:GB)

    totalFree=$(echo "$memFree + $diskFree" | bc)
    # 计算小数

    echo "服务器CPU配置信息 $cputype 核心数:$cores; 线程数:$processor" 
    echo "物理内存单位(GB):$totalMemFree 空闲:$memFree;     虚拟内存:$totalDiskFree 空闲:$diskFree;   总内存空闲: $totalFree GB"

}

inputData()
{
   
    read -p "请输入:" inputBuff ; buff=( $inputBuff ) 
    result=$(echo "${buff[2]} < $totalFree" | bc)

    if [ "${#buff[*]}" = "3" ] && [ ${
   buff[1]} -le $processor ] && [ $result -eq 1 ]; then
        echo "你输入的信息为: ${buff[*]}"
    else
        echo "输入错误, 原因: 1.输入参数超过3个 2.cpu 线程数超标 3.设置的内存超出空闲内存; 请重新输入"
        exit
    fi

    case ${
   buff[0]} in 
        "1")    SystemVersion=debian12 ;
                sourceQcow=$debianSourceQcow ;;

        "2")    SystemVersion=ubuntu22.04 ;
                sourceQcow=$ubuntuSourceQcow ;;
        *)      echo "未设置源镜像,当前选择镜像序号: ${buff[0]}" ; exit ;;
    esac
    # case 每一句命令分割 如果是换行,必须在上一行加分号 ; 


}

createImage(){
   

    inputData

    # 固定参数 
    sourceQcow=$sourceQcow
    ImgexistFlag=0
    SystemVersion=$SystemVersion
    cpu=${
   buff[1]}
    free=$(echo "${buff[2]} * 1000" | bc | awk -F"." '{print $1}')
    # 取整数

    # 动态参数
    for (( i=0;i<9999;i++ ))
    do 
        findQcow=$(ls $eiscRunDir | grep "debian12-$i")
        SystemIDName=debian12-$i
        qcow2=$eiscRunDir/debian12-$i.qcow2

        if [ "${#findQcow}" -lt "10" ]; then
            sudo cp $sourceQcow $qcow2
            echo "正在创建: $SystemIDName $qcow2"
            break 
        else 
            echo "当前虚拟机存在:$SystemIDName $qcow2  正在继续创建中..."
        fi 
    done


    listimage=`virsh list --all | grep $SystemIDName`
    if [ "${#listimage}" -lt "7" ]
    then
        echo "正在创建虚拟机: $SystemVersion  配置信息 cpu: ${buff[1]} 内存: ${buff[2]} "
        ImgexistFlag=0
    else
        echo "虚拟机存在:$listimage "
        ImgexistFlag=1
    fi

    if [ "$ImgexistFlag" = "0" ]
    then
        virt-install --import --name $SystemIDName --ram $free --vcpus=$cpu --cpu host-model --disk path=$qcow2,bus=virtio,format=qcow2 \
        --network network=default,model=virtio --os-type=linux --video qxl,vgamem=16384,heads=1 --os-variant=$SystemVersion --noautoconsole
        echo "等待6秒启动" ; sleep 6
   fi

    imageName=$SystemIDName
    catImageIP

}

delectImage()
{
   
    echo "";echo "";
    echo "please back image , dir=$eiscRunDir"
    read -p "Please input the name of the image to be deleted: " imageName

    virsh destroy  $imageName                                # 强制 关闭  镜像
    virsh undefine $imageName                                # 删除虚拟机
    sudo rm -rf $eiscRunDir/$imageName.qcow2                 # 删除镜像文件 

}

startImage()
{
   
    read -p "Please input the name of the image to be start: " imageName
    virsh start $imageName
}

stopImage()
{
   
    read -p "Please input the name of the image to be shutdown: " imageName
    virsh shutdown $imageName ; sleep 10
    virsh destroy  $imageName  
}

catImageIP()
{
   
    sudo netplan apply 
    virsh list --all 
    if [ "${#imageName}" -lt "6" ]
    then 
        read -p "Please input the name of the image to be cat IP: " imageName
    fi

    mac=`virsh domiflist $imageName | grep -v MAC | awk -F " " '{print $5}'` ;
    ip=`arp -n | grep $mac`                             # 通过max 地址查看 ip 地址

    echo "host $imageName mac is: $mac ip is : $ip"            
    # 查看所有虚拟机,和创建虚拟的 ip地址
}

catMagess(){
   

    imageList=(` virsh list --all | grep -vE "Id|----" | awk -F" " '{print $2}'`) 
    echo "当前所有虚拟机为:  ${imageList[*]} "

}

main(){
   
    systemMessage
    catMagess

    read -p "提供功能: 1.创建虚拟机  2.删除虚拟机   3.启动虚拟机   4.关闭虚拟机   5.查看虚拟机ip;   please input number: " FunctionSelect

    case $FunctionSelect in 
        "1") echo "create Image: " ; createImage ;;
        "2") echo "delect Image: " ; delectImage ;;
        "3") echo "start  Image: " ; startImage  ;;
        "4") echo "stop   Image: " ; stopImage   ;;
        "5") echo "cat ip Image: " ; catImageIP  ;;
        *)   echo "There are no defined functions.";;
    esac 

}
main


# 一键下载使用: wget ddoss.cn/file/ubuntu/shell/server/kvmCreateQcow.sh ; chmod +x kvmCreateQcow.sh ; ./kvmCreateQcow.sh
目录
相关文章
|
2月前
|
KVM 虚拟化
kvm虚拟机快照
这篇文章主要介绍了KVM虚拟机快照的创建、管理、恢复以及删除的详细步骤,包括查看快照信息、创建快照、模拟系统破坏后基于快照恢复虚拟机、使用快照的注意事项以及如何删除快照。
58 2
|
6月前
|
Linux KVM 数据库
服务器数据恢复—服务器误删除KVM虚拟机数据恢复案例
服务器数据恢复环境: 一台服务器安装Linux操作系统+EXT4文件系统。服务器上运行数台KVM虚拟机,每台虚拟机包含一个qcow2格式的磁盘文件和一个raw格式的磁盘文件。 服务器故障: 工作人员操作失误删除了服务器上的3台KVM虚拟机,虚拟机中运行数据库,需恢复误删除虚拟机中raw格式的磁盘文件。
服务器数据恢复—服务器误删除KVM虚拟机数据恢复案例
|
2月前
|
KVM 虚拟化
KVM虚拟机的桥接网络
文章主要介绍了KVM虚拟机的NAT和桥接网络类型的工作原理、配置方法以及如何进行网络模式的切换。
44 3
KVM虚拟机的桥接网络
|
2月前
|
KVM 虚拟化
KVM虚拟机的克隆
这篇文章介绍了如何使用KVM虚拟机进行完整克隆和链接克隆,包括手动克隆和使用virt-clone工具克隆的方法,以及如何编写脚本来实现自动化克隆和删除虚拟机。
67 3
KVM虚拟机的克隆
|
2月前
|
KVM 虚拟化
KVM虚拟机的热迁移
这篇文章详细介绍了KVM虚拟机的热迁移过程,包括临时迁移和永久迁移的步骤,以及可能遇到的故障和解决方案。
112 1
KVM虚拟机的热迁移
|
2月前
|
KVM 虚拟化
kvm虚拟机磁盘管理
文章详细介绍了KVM虚拟机磁盘管理,包括磁盘格式概述、创建虚拟机时如何指定磁盘格式、以及磁盘工具的常用命令,旨在帮助用户更好地理解和操作KVM虚拟机的磁盘管理。
83 1
kvm虚拟机磁盘管理
|
2月前
|
KVM 虚拟化 数据安全/隐私保护
KVM虚拟机安装实战
本文讲述了如何创建并使用VNC连接KVM虚拟机的详细教程,包括安装图解和命令行参数说明。
111 8
|
2月前
|
KVM 虚拟化
KVM虚拟机的冷迁移
这篇文章详细描述了KVM虚拟机的冷迁移过程,包括无依赖环境迁移、有链接克隆虚拟机迁移、多块磁盘迁移的案例,以及可能遇到的错误和解决方案。
90 3
|
3月前
|
Linux KVM 数据库
虚拟机数据恢复—Linux系统下误删除KVM虚拟机的数据恢复案例
虚拟机数据恢复环境: Linux操作系统服务器,EXT4文件系统。服务器中有数台KVM虚拟机。 虚拟机故障: KVM虚拟机被删除,需要恢复raw格式的磁盘文件。
虚拟机数据恢复—Linux系统下误删除KVM虚拟机的数据恢复案例
|
3月前
|
KVM 虚拟化
[kvm]创建虚拟机
[kvm]创建虚拟机