1. 程式人生 > 實用技巧 >kvm基本管理

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