kvm基本管理
阿新 • • 發佈:2020-11-02
#!/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