0
点赞
收藏
分享

微信扫一扫

KVM--基本管理

#!/bin/bash
iso=/iso/CentOS-7-x86_64-Minimal-1708.iso  #本机镜像文件位置
centos=centos7.0                 #操作系统版本
disk_path=/var/lib/libvirt/images        #虚拟磁盘文件存储路径
file_path=/etc/libvirt/qemu          #虚拟机配置文件存储路径
HANSHU(){                    #定义函数
if [ $num == 1 ];then
    read -p "输入数字:1 开启指定虚拟机
          2 开启所有虚拟机
          3 关闭指定虚拟机(使用shutdown)
          4 关闭所有已开启虚拟机
          5 开启多台虚拟机
          6 关闭多台虚拟机(使用shutdown)
请选择您想实现的功能:" num1            #根据标准输入实现不同的功能
    if [ $num1 == 1 ];then
        virsh list --inactive          #显示所有未开启的虚拟机
        read -p "请输入需开启的虚拟机的名称:" vm1
        virsh start $vm1
    elif [ $num1 == 2 ];then
        for i in `virsh list --inactive |sed "$ d" |awk 'NR>2{print $2}'`;do  #截取出所有未开启虚拟机的名称
            virsh start $i
        done
    elif [ $num1 == 3 ];then
        virsh list
        read -p "请输入需关闭的虚拟机的Id:" vm1
        virsh shutdown $vm1            #使用shutdown命令关闭 防止强制关闭可能引起的数据丢失
    elif [ $num1 == 4 ];then
        for i in `virsh list |sed "$ d" |awk 'NR>2{print $1}'`;do
            virsh shutdown $i
        done
    elif [ $num1 == 5 ];then
        virsh list --inactive|sed -e '1,2d' -e '$d' -e 's/-//'|cat -n
        read -p "请输入想要开启的虚拟机的编号(以空格隔开):" num11
        array=(0)                  #定义数组
        for i in $num11;do
            vm_name=`virsh list --inactive|sed -e '1,2d' -e '$d' -e 's/-//'|cat -n|awk 'NR=='$i'{print $2}'`    #截取出未开启虚拟机名称
            array[$i]=$vm_name          #名称写入数组
        done
        vm_start=`echo ${array[*]}`        #列出数组值
        for n in $vm_start;do
            [ $n != 0 ] && virsh start $n
        done
    elif [ $num1 == 6 ];then
        virsh list |sed -e '1,2d' -e '$d'|awk '{print $2"\t"$3}'|cat -n
        read -p "请输入关闭开启的虚拟机的编号(以空格隔开):" num11
        array=(0)
        for i in $num11;do
            vm_name=`virsh list|sed -e '1,2d' -e '$d'|awk '{print $2"\t"$3}'|cat -n|awk 'NR=='$i'{print $2}'`
            array[$i]=$vm_name
        done
        vm_start=`echo ${array[*]}`
        for n in $vm_start;do
            [ $n != 0 ] && virsh shutdown $n
        done
    fi
elif [ $num == 2 ];then
    read -p "输入数字:1 安装虚拟机
          2 删除虚拟机
请选择您想实现的功能:" num2
    if [ $num2 == 1 ];then            #建议使用文本方式安装 图形安装太慢
        read -p "输入数字:1 命令安装
              2 文本方式安装(建议)
镜像文件存储在/iso/目录下 如需更换镜像请将新镜像存储在这里并修改校本中的iso值
请选择您的安装方式:" num21
        virsh list --all
        read -p "请输入您安装的虚拟机的名称:" name          #标准输入虚拟机各项参数值
        read -p "请输入您安装的虚拟机的运行内存大小(单位为kb):" kb
        read -p "请输入您安装的虚拟机的cpu数量:" cpu
        read -p "请输入您安装的虚拟机的内存大小(单位为G):" g
        if [ $num21 == 1 ];then
            virt-install -n $name --memory $kb --vcpus $cpu --cdrom $iso --disk $disk_path/$name.img,size=$g,format=qcow2,bus=scsi
        elif [ $num21 == 2 ];then
            echo "默认版本为centos7.0 如需更换请修改脚本中centos值"
            virt-install --connect qemu:///system -n $name -r $kb --disk /var/lib/libvirt/images/$name.img,size=$g  --os-type=linux --os-variant=$centos --vcpus=$cpu  --location=$iso -x console=ttyS0 --nographics
        fi
    elif [ $num2 == 2 ];then
        virsh list --all
        read -p "请输入您想删除的虚拟机的名称:" vm2
        virsh destroy $vm2 &> /dev/null              #先强制关闭虚拟机 并将回显输出到黑洞文件中
        a=`virsh domblklist $vm2|awk 'NR==3{print $2}'`     #截取出虚拟机磁盘文件存储路径
        b=`virsh snapshot-list $vm2|sed -n '3p'`        #虚拟机快照(若虚拟机存在快照 则无法直接删除)
        if [ -z "$b" ];then                    #若b值为空 则此虚拟机没有快照 可以直接删除
            virsh undefine $vm2                  #取消定义虚拟机(相当于删除)
            rm -rf $a                        #删除此虚拟机磁盘文件
            rm -rf $file_path/$vm2.xml              #删除此虚拟机配置文件
        else
            for i in `virsh snapshot-list $vm2|awk 'NR>2{print $1}'`;do  #若存在快照 则先删除快照
                virsh snapshot-delete $vm2 $i          #删除快照
            done
            virsh undefine $vm2
            rm -rf $a
            rm -rf $file_path/$vm2.xml
        fi
    fi
elif [ $num == 3 ];then
    read -p "输入数字:1 添加硬盘
          2 删除硬盘
          3 添加网卡
          4 删除网卡
请选择您想实现的功能:" num3
    if [ $num3 == 1 ];then
        virsh list --all
        read -p "请输入想要添加磁盘的虚拟机名称:" vm3
        virsh domblklist $vm3                      #列出已存在的磁盘文件
        read -p "请输入磁盘文件名称(无需后缀):" name
        if [ -f $disk_path/$name.img ] || [ -f $file_path/$name.xml ];then  #判断磁盘文件名或配置文件名是否已存在
            for ((i=0;i<10;));do                    #若存在 则重新输入 直至不重复为止
                read -p "文件名已存在 请重新输入:" name1  
                [ ! -f $disk_path/$name1.img ] && [ ! -f $file_path/$name1.xml ] && break
            done
            name=$name1
        fi
        read -p "请输入磁盘大小(单位为G):" size                    #输入各项值
        echo "若选用sata类型 若虚拟机在运行将会关闭虚拟机(sata无法热拔)"
        read -p "请输入磁盘bus类型(virtio|sata|scsi|ide):" bus
        read -p "请输入磁盘名称(一一对应上表vd..|sd...|sd..|hd..):" dev
        qemu-img create -f qcow2 $disk_path/$name.img $size\G          #创建虚拟磁盘文件
        cat > $file_path/$name.xml <<- eof                    #创建虚拟配置文件
        <disk type='file' device='disk'>
            <driver name='qemu' type='qcow2'/>
            <source file='$disk_path/$name.img'/>
            <target dev='$dev' bus='$bus'/>
        </disk>
        eof
        [ "$bus" == "sata" ] && virsh shutdown $vm3 &> /dev/null        #当选用sata类型且虚拟机正运行时先关闭虚拟机
        sleep 3
        virsh attach-device $vm3 $file_path/$name.xml --persistent      #添加磁盘
    elif [ $num3 == 2 ];then
        virsh list --all
        read -p "请输入想要删除磁盘的虚拟机名称:" vm3
        virsh domblklist $vm3
        read -p "请输入磁盘名称:" name
        a=`virsh domblklist $vm3|grep "$name"|awk '{print $2}'`      #截取出磁盘文件路径
        b=`echo "$a"|sed -r "s/(.*)($vm3)(.*)(\.img)/\2\3.xml/"`      #截取出虚拟配置文件路径
        virsh detach-disk $vm3 $name --persistent               #删除磁盘
        rm -rf $a
        rm -rf $file_path/$b
    elif [ $num3 == 3 ];then
        virsh list --all
        read -p "请输入想要添加网卡的虚拟机名称:" vm3
        ls $file_path |grep "$vm3"
        read -p "请输入网卡文件名称:" name
        if [ -f $disk_path/$name.img ] || [ -f $file_path/$name.xml ];then
            for ((i=0;i<10;));do
                read -p "文件名已存在 请重新输入:" name1
                [ ! -f $disk_path/$name1.img ] && [ ! -f $file_path/$name1.xml ] && break
            done
            name=$name1
        fi
        virsh domiflist $vm3
        read -p "请输入网卡类型(推荐使用相同网卡类型):" type
        cat > $file_path/$name.xml <<- eof
        <interface type='$type'>
            <source network='default' bridge='virbr0'/>
            <model type='virtio'/>
        </interface>
        eof
        virsh attach-device $vm3 $file_path/$name.xml --persistent  #添加网卡
    elif [ $num3 == 4 ];then
        virsh list --all
        read -p "请输入想要删除网卡的虚拟机名称:" vm3
        virsh domiflist $vm3
        read -p "请输入想要删除网卡的类型:" type
        read -p "请输入想要删除网卡的mac地址:" mac
        virsh  detach-interface $vm3 $type --mac $mac --persistent  #删除网卡
    fi
elif [ $num == 4 ];then
    read -p "输入数字:1 链接克隆(默认)
          2 完整克隆
请选择您要实现的功能:" num4
    if [ $num4 == 2 ];then
        virsh list --all
        read -p "请输入想要克隆的虚拟机的名字:" vm4
        read -p "请输入克隆后的虚拟机的名称(克隆后虚拟机磁盘文件/配置文件
默认为虚拟机名称+后缀):" vm41
        if [ -f $disk_path/$vm41.img ] || [ -f $file_path/$vm41.xml ];then
            for ((i=0;i<10;));do
                read -p "虚拟机文件名已存在 请重新输入:" name1
                [ ! -f $disk_path/$name1.img ] && [ ! -f $file_path/$name1.xml ] && break
            done
            vm41=$name1
        fi
        for i in `virsh domblklist $vm4|awk 'NR>2{print $2}'`;do  #截取出克隆的虚拟机的虚拟磁盘文件路径
            if [ -n "$i" ] && [ "$i" != "-" ];then
                src=$i
                path=`dirname $src`
                cp -p $src $path/$vm41.img                #拷贝克隆的虚拟机的虚拟磁盘文件
            else
                continue
            fi
        done
        virsh dumpxml $vm4 > $file_path/$vm41.xml            #查看克隆的虚拟机的虚拟配置文件信息并写入
        sed -i "s/>$vm4</>$vm41</" $file_path/$vm41.xml        #修改虚拟配置文件相关信息
        sed -ri "/<\/uuid>/d" $file_path/$vm41.xml
        sed -ri "s/(<source fi)(.*)(\/)(.*)(\/>)/\1\2\3$vm41.img'\5/" $file_path/$vm41.xml
        sed -ri '/<mac/ d' $file_path/$vm41.xml
        virsh define $file_path/$vm41.xml                #从虚拟配置文件定义(创建)虚拟机
    else
        virsh list --all
        read -p "请输入您想要克隆的虚拟机的名称:" vm4
        read -p "请输入克隆后的虚拟机的名称(克隆后的虚拟机磁盘文件/配置文
件默认为虚拟机名称+后缀):" vm41
        if [ -f $disk_path/$vm41.img ] || [ -f $file_path/$vm41.xml ];then
            for ((i=0;i<10;));do
                read -p "虚拟机文件名已存在 请重新输入:" name1
                [ ! -f $disk_path/$name1.img ] && [ ! -f $file_path/$name1.xml ] && break
            done
            vm41=$name1
        fi
        src=`virsh domblklist $vm4|awk 'NR==3{print $2}'`
        path=`dirname $src`
        qemu-img create -f qcow2 -b $src $path/$vm41.img
        virsh dumpxml $vm4 > $file_path/$vm41.xml
        sed -i "s/>$vm4</>$vm41</" $file_path/$vm41.xml
        sed -ri "/<\/uuid>/d" $file_path/$vm41.xml
        sed -ri "s/(<source fi)(.*)(\/)(.*)(\/>)/\1\2\3$vm41.img'\5/" $file_path/$vm41.xml
        sed -ri '/<mac/ d' $file_path/$vm41.xml
        virsh define $file_path/$vm41.xml
    fi
elif [ $num == 5 ];then
    read -p "输入数字选择:1 拍摄快照
          2 删除快照
          3 删除所选虚拟机所有快照
          4 从快照恢复虚拟机
请选择您想实现的功能:" num5
    if [ $num5 == 1 ];then
        virsh list --all
        read -p "请输入您要创建快照的虚拟机的名称:" vm5
        virsh snapshot-list $vm5            #列出此虚拟机所有快照
        read -p "请输入您要创建的快照的名称:" sna
        virsh snapshot-create-as $vm5 $sna
    elif [ $num5 == 2 ];then
        virsh list --all
        read -p "请输入您要删除快照的虚拟机的名称:" vm5
        virsh snapshot-list $vm5
        read -p "请输入您要删除的快照的名称:" sna
        virsh snapshot-delete $vm5 $sna
    elif [ $num5 == 3 ];then
        virsh list --all
        read -p "请输入您要删除所有快照的虚拟机的名称:" vm5
        b=`virsh snapshot-list $vm5|sed -n '3p'`
        if [ -n "$b" ];then
            for i in `virsh snapshot-list $vm5|awk 'NR>2{print $1}'`;do
                virsh snapshot-delete $vm5 $i
            done
        fi
    elif [ $num5 == 4 ];then
        virsh list --all
        read -p "请输入您想要恢复快照的虚拟机的名称:" vm5
        virsh snapshot-list $vm5
        read -p "请输入您想要恢复快照的名称:" sna
        virsh destroy $vm5 &> /dev/null
        virsh snapshot-revert $vm5 $sna
    fi
elif [ $num == 6 ];then
    read -p "输入数字:1 内存管理
          2 CPU管理
请选择您想要实现的功能:" num6
    if [ $num6 == 1 ];then
        virsh list --all
        read -p "请输入您想要修改内存的虚拟机的名称:" vm6
        virsh dumpxml $vm6|grep "K"
        read -p "请输入修改的内存大小(单位为kib)(将关闭虚拟机):" num61
        virsh shutdown $vm6
        sleep 3
        sed -ri "/memory/ s/(.*>)([0-9]+)(<\/.*)/\1$num61\3/" $file_path/$vm6.xml    #修改虚拟配置文件
    elif [ $num6 == 2 ];then
        virsh list --all
        read -p "请输入您想要修改cpu的虚拟机的名称:" vm6
        virsh dumpxml $vm6|grep vcpu|grep auto > /dev/null    #判断虚拟机是否支持热添加
        ech=`echo $?`
        lscpu|grep "CPU(s):"
        virsh dumpxml $vm6|grep "vcpu"
        if [ $ech != 0 ];then
            echo "当前不支持热添加CPU 请修改配置文件"
            echo "将重启启动虚拟机使配置文件生效"
            echo 
            read -p "请输入虚拟机最大CPU个数:" num61
            read -p "请输入虚拟机运行CPU个数:" num62
            sed -ri "/vcpu/ s/.*/<vcpu placement='auto' current=\"$num62\">$num61<\/vcpu>/" $file_path/$vm6.xml
            virsh reboot $vm6
        elif [ $ech == 0 ];then
            read -p "输入数字:1 修改运行CPU(减少时会停止当前虚拟机)
                  2 修改最大CPU
请选择您想实现的功能:" num61
            if [ $num61 == 1 ];then
                read -p "请输入修改后的CPU个数:" num62
                num621=`virsh dumpxml $vm6|grep "vcpu"|awk -F "=" '{print $3}'|awk -F ">" '{print $1}'`
                [ $num62 -le $num621 ] && virsh destroy $vm6
                virsh setvcpus $vm6 $num62 --live  --config
            elif [ $num61 == 2 ];then
                read -p "请输入最大CPU个数(不能超过最大物理CPU个数):" num63
                virsh setvcpus $vm6 $num63 --maximum --config
            fi
        fi
    fi
fi
}
read -p "输入数字:1 开启或关闭虚拟机
          2 安装或删除虚拟机
          3 磁盘/网卡管理
          4 克隆虚拟机
          5 快照管理
          6 内存/CPU管理
请选择您想实现的功能:" num            #根据标准输入实现不同功能
if [[ ! $num =~ ^[1|2|3|4|5|6]$ ]];then  #判断标准输入是否是正确的格式
    for ((i=0;i<10;));do
        read -p "请输入正确的数字:" num7
        [[ $num7 =~ ^[1|2|3|4|5|6]$ ]] && break
    done
    num=$num7
    HANSHU
else
    HANSHU
fi

 



举报

相关推荐

0 条评论