#!/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