zoukankan      html  css  js  c++  java
  • 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"	"$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"	"$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 $sizeG          #创建虚拟磁盘文件 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)/23.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)(.*)(/)(.*)(/>)/123$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)(.*)(/)(.*)(/>)/123$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$num613/" $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
  • 相关阅读:
    Lucene学习总结之二:Lucene的总体架构
    Lucene学习总结之三:Lucene的索引文件格式(1)
    android开发_SeekBar进度条
    android开发_mp3_player音乐播放器
    Lucene学习总结之一:全文检索的基本原理
    android开发_Intent_requestCode_resultCode页面之间的跳转
    android开发_Location位置定位
    .NET Remoting Basic(7)信道
    .NET Remoting Basic(1)概览
    .NET Remoting Basic(5)多服务器访问和程序集共享
  • 原文地址:https://www.cnblogs.com/Xinenhui/p/13915648.html
Copyright © 2011-2022 走看看