Linux:实现管理kvm的脚本(下)

3 篇文章 0 订阅

实现管理kvm的脚本(下)

上一篇博客已经分享了所有的选单脚本,这一篇将会分析真正的函数脚本,里面有很多注释,应该比较容易看懂,如果真的要使用,请阅读一下大概的逻辑以及提供了何种功能,还有很多没有完善,如果使用过程中有问题,欢迎交流!


  • functions.sh

#!/bin/bash
#kvm所有功能的核心部分,所有的函数都存储在这个文件

#=======================================基本管理功能========================================================

#查看所有kvm
showKvm(){ 
	list1=(`virsh list --all|awk 'NR>=3{print $2}'`)  #将所有kvm的名称做成一个列表,方便后面调用
	[ ${#list1[*]} -ne 0 ] && virsh list --all  || echo "当前没有任何KVM可以管理。"   #列表为空时说明没有还没有kvm
}
#查看所有正在运行的kvm
showKvmAlived(){
    list2=(`virsh list|awk 'NR>=3{print $2}'`)        #将所有的正在运行的kvm做成列表,方便后面调用
    result=${#list2[*]}
    if [ ${result} -eq 0 ];then
        echo "当前没有KVM在运行。"
    else
        virsh list
    fi
}
#关闭kvm
shutdownKvm(){
    showKvmAlived &> /dev/null                         #先调用showKvmAlived函数,可以获得函数内的列表等,用于后续判断
    if [ ${result} -eq 0 ];then						   #showKvmAlived函数的result,如果为0,直接退出,不进行任何判断
        echo "当前没有KVM在运行。"
    else
        echo "当前正在运行的KVM:${list2[*]}"
        read -p "请输入您要关闭的KVM:" name
		flag=0      #定义一个标志,如果最后这个标志没有改变,则说明输入的kvm不在运行列表中
        for i in `seq 0 ${#list2[*]}`;do            #遍历对比,看看用户输入的名称是否存在
            listName=${list2[$i]}
            [[ "${name}" == "${listName}" ]] && virsh shutdown ${name} && flag=1 && break    #若成功关机,则改变flag的值
        done
		[ ${flag} -eq 0 ] && echo "关机失败!此KVM没有在运行。"      #通过flag判断告知结果
        
    fi
}
#启动kvm
startKvm(){
	showKvm > /dev/null                                      #以下类似的调用的作用都是一样的
	if [ ${#list1[*]} -eq 0 ];then
	    echo "当前没有任何KVM可以启动。"
	else
		echo "当前拥有的KVM:${list1[*]}"
		read -p "请输入您要开启的KVM:" name
		flag=0
        for i in `seq 0 ${#list1[*]}`;do
            listName=${list1[$i]}
            [[ "${name}" == "${listName}" ]] && virsh start ${name} && flag=1 && break
        done
        [ ${flag} -eq 0 ] && echo "开机失败!此KVM不存在或正在运行。"                 #正在运行或不存在的kvm无法执行开机操作
    fi
}
#重启kvm
rebootKvm(){
	showKvmAlived &> /dev/null
        if [ ${result} -eq 0 ];then
            echo "当前没有KVM在运行。"
        else
            echo "当前正在运行的KVM:${list2[*]}"
            read -p "请输入您要重启的KVM:" name
			flag=0
            for i in `seq 0 ${#list2[*]}`;do
                listName=${list2[$i]}
                [[ "${name}" == "${listName}" ]] && virsh reboot ${name} && flag=1 && break
            done
            [ ${flag} -eq 0 ] && echo "重启失败!此KVM没有在运行。" #这里实际上缺少一个对于输入的名称是否存在与kvm名单的判断,不过不影响功能实现
        fi
}
#强制关闭kvm
destroyKvm(){
	showKvmAlived &> /dev/null
        if [ ${result} -eq 0 ];then
            echo "当前没有KVM在运行。"
        else
            echo "当前正在运行的KVM:${list2[*]}"
            read -p "请输入您要强制关闭的KVM:" name
			flag=0
            for i in `seq 0 ${#list2[*]}`;do
                listName=${list2[$i]}
                [[ "${name}" == "${listName}" ]] && virsh destroy ${name} && flag=1 && break
            done
            [ $flag -eq 0 ] && echo "强制关机失败!此KVM没有在运行。"   #强制重启动作只能作用与已经处于运行状态的kvm
        fi
}
#删除kvm
deleteKvm(){
	read -p "请输入您要删除的KVM:" name
	read -p "此操作不可逆,您确定要进行删除吗?【Y/N】" answer1    #确认删除
	case ${answer1} in
	Y|y)
		showKvmAlived &> /dev/null
		showKvm &> /dev/null
		for i in ${list1[*]};do                 #检查输入的名称是否属于已存在的kvm
			if [ "${i}" == "${name}" ];then
				flag=0                            #flag标志和mark标志都是为了方便后面的判断
				mark=0
				for j in ${list2[*]};do               #若输入的名称属于已存在的kvm,则继续检查此kvm是否处于运行状态
					[ "${j}" == "${name}" ] && echo "${name} 正在运行,无法直接删除,请先停止机器。" && flag=1 && break
				done
				#检查该机器是否为链接克隆的原机器
				[ -e ./cloneRelationship ] && checkClone=($(awk -F"[ |.]" '/^A/{print $5}' ./cloneRelationship))
				for x in ${checkClone[*]};do
					#判断要删除的机器是否为链接克隆的源机器,是源机器则不能删除
					[[ "${x}" == "${name}" ]] && echo "注意: ${name} 是链接克隆的源机器,删除后其克隆机将不可用。若您确实希望删除此机器,请您先处理其链接克隆的机器。" && flag=2 && break
				done
				if [ ${flag} -eq 0 ];then                #flag的值若没有被改变,则说明满足删除KVM的条件
					flag=1                              #判断完之后要马上将flag的值变成非0值,否则一旦执行了一次成功的删除,flag的值就会一直是0,影响后面判断
					diskName=(`virsh domblklist $name|awk 'NR>=3{print $2}'`)      #先获取kvm的磁盘文件再执行删除动作,否则先删除的话就无法使用domblklist命令获取
					virsh undefine ${name}  &> /dev/null
					[ -e ./cloneRelationship ] && sed -ri "/${name} /d" cloneRelationship  #要先判断一下这个文件是否存在,若不存在则说明当前还没有克隆关系
					rm -rf /var/lib/libvirt/qemu/snapshot/${name}/    &> /dev/null                #删除该机器相关的快照文件
					read -p "已为您删除$name,您要删除$name的磁盘文件吗?【Y/N】" answer2    #undefine不会删除相应的磁盘文件,需要下一步操作
					case ${answer2} in
					Y|y)
						for n in ${diskName[*]};do                   #一台kvm的可能有多个磁盘,也就是多个磁盘文件,这里是直接把对应的磁盘文件全都删除了
							rm -rf ${n}
						done
						echo "已为您删除磁盘文件。"
						;;
					N|n)
						echo "磁盘文件已保留,您可以通过磁盘文件恢复此KVM的数据"
						;;
					*)
						echo "输入有误,请手动删除${name}的磁盘文件,否则磁盘文件将保留。"
					esac
				fi
			fi
		done
		[ "${mark}" != "0" ] && echo "$name 不存在!"
		mark=1			#mark如果没有被改变,则说明不存在该名称的kvm,用完之后要将mark改成非0,否则成功删除一次之后,他就一直是0了,影响后面的判断
		;;
	N|n)
		echo "已取消删除操作"
		;;
	*)
		echo "输入有误,请输入<Y/y|N/n>"
	esac
}

#=======================================克隆功能========================================================

#完整克隆
fullClone(){
	showKvm &> /dev/null
	if [ ${#list1[*]} -eq 0 ];then
		echo "当前没有任何KVM可以克隆。"
	else
		echo "当前可以克隆的机器有:${list1[*]}"     #提示当前可进行克隆的机器
		read -p "请输入您要克隆的机器:" ori_machine
		read -p "请输入新机器的名字:" new_machine
		check1=0
		check2=1
        for i in `seq 0 ${#list1[*]}`;do 
            listName=${list1[$i]}
            [[ "${ori_machine}" == "${listName}" ]]  && check1=1   #克隆的原机器必须要存在
			[[ "${new_machine}" == "${listName}" ]]  && check2=0   #新的机器名称不能与已存在的机器冲突
        done
	fi
	if [[ ${check1} -eq 1  && ${check2} -eq 1 ]];then               #两个条件要同时满足才能进行克隆
		echo "完整克隆需要一点时间,请稍后..."
		cp /etc/libvirt/qemu/${ori_machine}.xml /etc/libvirt/qemu/${new_machine}.xml		#创建xml文件
		#对xml文件进行对应的修改
		sed -ri "/<name>/ s/(<.*>)(.*)(<.*)/\1$new_machine\3/" /etc/libvirt/qemu/${new_machine}.xml  #修改名字
		new_uuid=$(uuidgen)
		sed -ri "/uuid/ s/(<.*>)(.*)(<.*)/\1$new_uuid\3/" /etc/libvirt/qemu/${new_machine}.xml        #修改UUID
		sed -ri "/source file/ s/(.*)($ori_machine)(.*)/\1$new_machine\3/p" /etc/libvirt/qemu/${new_machine}.xml  #修改文件路径
		sed -ri "/mac add/d" /etc/libvirt/qemu/${new_machine}.xml                                                 #修改mac地址,直接删除,克隆后会自动生成
		cp /var/lib/libvirt/images/${ori_machine}.img /var/lib/libvirt/images/${new_machine}.img                   #复制磁盘文件
		virsh define /etc/libvirt/qemu/${new_machine}.xml &> /dev/null                                             #克隆
		echo "$new_machine克隆成功!"
		echo "F 完整克隆: ${new_machine} 来自 ${ori_machine}." >> ./cloneRelationship                                #将克隆关系写入文件保存,方便其他功能进行调用
	elif [[ ${check1} -eq 0 ]];then
		echo "克隆失败!${ori_machine}不存在!"
	else
		echo "克隆失败!${new_machine}已存在!"
	fi
}
#增量克隆
addClone(){
	showKvm &> /dev/null                                                #增量克隆的思路和完整克隆的思路是一样的
	if [ ${#list1[*]} -eq 0 ];then
		echo "当前没有任何KVM可以克隆。"
	else
		echo "当前可以克隆的机器有:${list1[*]}"
		read -p "请输入您要克隆的机器:" ori_machine
		read -p "请输入新机器的名字:" new_machine
		check1=0
		check2=1
        for i in `seq 0 ${#list1[*]}`;do 
            listName=${list1[$i]}
            [[ "${ori_machine}" == "${listName}" ]]  && check1=1
			[[ "${new_machine}" == "${listName}" ]]  && check2=0
        done
	fi
	if [[ ${check1} -eq 1  && ${check2} -eq 1 ]];then
		cp /etc/libvirt/qemu/${ori_machine}.xml /etc/libvirt/qemu/${new_machine}.xml
		sed -ri "/<name>/ s/(<.*>)(.*)(<.*)/\1$new_machine\3/" /etc/libvirt/qemu/${new_machine}.xml
		new_uuid=$(uuidgen)
		sed -ri "/uuid/ s/(<.*>)(.*)(<.*)/\1$new_uuid\3/" /etc/libvirt/qemu/${new_machine}.xml
		sed -ri "/source file/ s/(.*)($ori_machine)(.*)/\1$new_machine\3/p" /etc/libvirt/qemu/${new_machine}.xml
		sed -ri "/mac add/d" /etc/libvirt/qemu/${new_machine}.xml
		qemu-img create -f qcow2 -b /var/lib/libvirt/images/${ori_machine}.img /var/lib/libvirt/images/${new_machine}.img &> /dev/null
		virsh define /etc/libvirt/qemu/${new_machine}.xml &> /dev/null
		echo "$new_machine克隆成功!"
		echo "A 增量克隆: ${new_machine} 来自 ${ori_machine}." >> ./cloneRelationship
	elif [[ ${check1} -eq 0 ]];then
		echo "克隆失败!${ori_machine}不存在!"
	else
		echo "克隆失败!${new_machine}已存在!"
	fi
}

#查看克隆关系
showCloneRelationship(){
	[ -e ./cloneRelationship ] && sed '' ./cloneRelationship || echo "当前还未产生任何克隆关系。"   #直接读取文件的内容即可
}

#=======================================快照功能========================================================

#拍摄快照
makeSnapshot(){
	showKvm &> /dev/null
	showKvmAlived &> /dev/null
	if [ ${#list1[*]} -eq 0 ];then
		echo "当前没有任何KVM可以拍摄快照。"
	else
		read -p  "请输入需要拍摄快照的机器名称:" name
		read -p  "请输入快照名称:"  snapshotName
		for i in ${list1[*]};do 
			if [ "${i}" == "${name}" ];then
				flag=0   
				mark=0
				for j in ${list2[*]};do        #检查该机器是否处于运行状态,不建议对处于运行状态的机器拍摄快照s
					[ "${j}" == "${name}" ] && echo "${name} 正在运行,请您先停止机器再拍摄快照!" && flag=1 && break
				done
				snapshotList=($(virsh snapshot-list ${name}|awk 'NR>=3{count[$1]++}END{for(i in count){print i}}'))  #提取出该机器所有的快照的名称
				for x in ${snapshotList[*]};do
					[[ "${x}" == "${snapshotName}" ]] && echo "该快照已经存在!" && flag=2 && break  #同一机器的快照名称不能重复
				done
				if [ ${flag} -eq 0 ];then               
					flag=1                             
					virsh snapshot-create-as ${name} ${snapshotName}  &> /dev/null                       #拍摄快照
					echo "快照创建成功!"
				fi
			fi
		done
	fi
	[ "${mark}" != "0" ] && echo "$name 不存在!"
	mark=1
}
#恢复快照
recoverSnapshot(){
	showKvm &> /dev/null
	showKvmAlived &> /dev/null
	if [ ${#list1[*]} -eq 0 ];then
		echo "当前没有任何KVM可以进行快照恢复。"
	else
		read -p  "请输入需要恢复快照的机器名称:" name
		read -p  "请输入快照名称:"  snapshotName
		for i in ${list1[*]};do 
			if [ "${i}" == "${name}" ];then
				flag=0   
				mark=0
				symbol=0
				for j in ${list2[*]};do
					[ "${j}" == "${name}" ] && echo "${name} 正在运行,请您先停止机器再恢复快照!" && flag=1 && break  #先关机再进行恢复
				done
				snapshotList=($(virsh snapshot-list ${name}|awk 'NR>=3{count[$1]++}END{for(i in count){print i}}'))  #将快照名称提取出来
				for x in ${snapshotList[*]};do
					[[ "${x}" == "${snapshotName}" ]] && symbol=1 && break
				done
				[[ ${symbol} -eq 0 ]] && echo "${snapshotName}不存在!"         #要判断输入的快照是否存在
				if [[ ${flag} -eq 0 && ${symbol} -eq 1 ]];then               
					flag=1
					symbol=0
					virsh snapshot-revert ${name} ${snapshotName}  &> /dev/null
					echo "快照恢复成功!"
				fi
			fi
		done
	fi
	[ "${mark}" != "0" ] && echo "${name} 不存在!"
	mark=1
}
#删除快照
deleteSnapshot(){
	showKvm &> /dev/null
	showKvmAlived &> /dev/null
	if [ ${#list1[*]} -eq 0 ];then
		echo "当前没有任何KVM可以进行快照删除。"
	else
		read -p  "请输入需要删除快照的机器名称:" name
		read -p  "请输入快照名称:"  snapshotName
		for i in ${list1[*]};do 
			if [ "${i}" == "${name}" ];then
				flag=0   
				mark=0
				symbol=0
				for j in ${list2[*]};do
					[ "${j}" == "${name}" ] && echo "${name} 正在运行,请您先停止机器再删除快照!" && flag=1 && break
				done
				snapshotList=($(virsh snapshot-list ${name}|awk 'NR>=3{count[$1]++}END{for(i in count){print i}}'))  #将指定的机器的快照名称取出来做成列表
				for x in ${snapshotList[*]};do
					[[ "${x}" == "${snapshotName}" ]] && symbol=1 && break
				done
				[[ ${symbol} -eq 0 ]] && echo "${snapshotName}不存在!"
				[[ ${#snapshotList[*]} -eq 0 ]] && echo "${name}没有快照可删除!"
				if [[ ${flag} -eq 0 && ${symbol} -eq 1 ]];then 
					flag=1
					symbol=0
					virsh snapshot-delete ${name} ${snapshotName}  &> /dev/null
					echo "快照删除成功!"
				fi
			fi
		done
	fi
	[ "${mark}" != "0" ] && echo "${name} 不存在!"
	mark=1
}
#查看快照
findSnapshot(){
	showKvm &> /dev/null
	showKvmAlived &> /dev/null
	if [ ${#list1[*]} -eq 0 ];then
		echo "当前没有KVM可查看。"
	else
		read -p  "请输入需要查看快照的机器名称:" name
		read -p  "请输入快照名称【直接Enter查看所有快照】:"  snapshotName
		for i in ${list1[*]};do 
			if [ "${i}" == "${name}" ];then
				mark=0
				symbol=0
				snapshotList=($(virsh snapshot-list ${name}|awk 'NR>=3{count[$1]++}END{for(i in count){print i}}'))
				[[ ${#snapshotList[*]} -eq 0 ]] && echo "${name}还未拍摄过快照。" && break
				if [[ "${snapshotName}" == "" ]];then
					virsh snapshot-list ${name}
				else
					for x in ${snapshotList[*]};do
						[[ "${x}" == "${snapshotName}" ]] && symbol=1 && break
					done
					[[ ${symbol} -eq 0 ]] && echo "${snapshotName}不存在!"
					[[ ${symbol} -eq 1 ]] && virsh snapshot-info ${name} ${snapshotName}
				fi
			fi
		done
	fi
	[ "${mark}" != "0" ] && echo "${name} 不存在!"
	mark=1
}
#=======================================资源变配功能========================================================
#查看真机硬件信息
showPhysicalMachineIfo(){
	#利用命令获取几个主要的有关真机的硬件信息
	numCPU=$(sed -rn '/physical id/p' /proc/cpuinfo|uniq|wc -l)
	memeory_M=$(free -m|awk 'NR==2{print $2}')
	memeory_G=$(free -h|awk 'NR==2{print $2}')
	memeory_K=$(echo "$memeory_M*1024"|bc)
	diskAvailable_k=$(df -T|awk '/root /{print $5}')
	diskAvailable_G=$(df -h|awk '/root /{print $4}'|tr -d "G"})
	echo -e "物理CPU:${numCPU}\n物理内存:${memeory_K}k => ${memeory_M}m => ${memeory_G}G\n磁盘可用容量:${diskAvailable_k}k => ${diskAvailable_G}G"
}
#查看KVM硬件信息
showVirtualMachineInfo(){
	#利用命令获取几个关于某一台kvm机器的硬件信息
	showKvm &> /dev/null
	if [ ${#list1[*]} -eq 0 ];then
		echo "当前没有KVM。"
	else
		read -p  "请输入机器名称:" name
		for i in ${list1[*]};do 
			if [ "${i}" == "${name}" ];then
				mark=0
				numCPU=$(virsh dominfo ${name}|awk '/^CPU\(s\)/{print $2}')
				maxMemeory_k=$(virsh dominfo mini|awk '/Max memory/{print $3}')
				usedMemeory_k=$(virsh dominfo mini|awk '/Used memory/{print $3}')
				maxMemeory_G=$(echo "${maxMemeory_k}/1024"|bc)
				usedMemeory_G=$(echo "${usedMemeory_k}/1024"|bc)
				mainDiskCapacity=$(qemu-img info /var/lib/libvirt/images/mini.img |awk -F"[ |()]" '/virtual size/{print $3,$5"("$6")"}')
				numDisk=$(virsh domblklist ${name}|awk 'NR>=3 && !/hda|^$/{count[$1]++}END{for (i in count){print i}}'|wc -l)
				macList=($(virsh domiflist ${name}|awk 'NR>=3{print $5}'))
				numCard=${#macList[*]}
				echo -e "CPU个数:${numCPU}\n最大内存:${maxMemeory_k}k => ${maxMemeory_G}G\n已使用内存:${usedMemeory_k}k => ${usedMemeory_G}G\n主硬盘容量:${mainDiskCapacity}\n磁盘个数:${numDisk}\n网卡个数:${numCard}"
			fi
		done
	fi
	[ "${mark}" != "0" ] && echo "$name 不存在!"
	mark=1
}
#增加磁盘
addDisk(){
	showKvm &> /dev/null
	showPhysicalMachineIfo &> /dev/null
	if [ ${#list1[*]} -eq 0 ];then
		echo "当前没有KVM。"
	else
		read -p  "请输入机器名称:" name
		diskFileName=${name}-$(date +\%F-\%H-\%M-\%S)    #磁盘文件的命名直接使用时间戳,并没有让用户进行输入
		for i in ${list1[*]};do
			if [ "${i}" == "${name}" ];then
				read -p  "请输入要扩容的容量[只支持单位G]:" capacity         #只支持单位G
				read -p  "请输入盘符【只需输入一个字母[a-z]】:" symbol       #盘符只让用户定义最后一个字母,全名盘符直接根据系统盘的类型进行确定,即只允许用户添加跟系统盘同一类型的磁盘
				mark=0
				check_capacity=0
				check_symbol=0
				break_symbol=0
				if [[ "${capacity}" =~ ^[0-9]+$ ]];then                          #判断用户输入是否为纯数字
					if [[ $(echo "${capacity} > ${diskAvailable_G}" | bc) -eq 1 ]];then  #判断添加的磁盘容量是否已经超出真机的磁盘可用容量
						echo "您添加的磁盘容量已经超出物理机的磁盘可用容量,添加失败!" && break
					else
						check_capacity=1   #如果满足条件,打上标签
					fi
				else
					echo "输入有误!请输入数字!" && break
				fi
				diskSymbol=($(virsh domblklist ${name} | awk 'NR>=3 && !/hda|^$/{print $1}'))  #将目标kvm的所有磁盘盘符做成列表
				bus_symbol=${diskSymbol[0]::1}  #截取系统盘盘符的第一个字母
				if [[ "${symbol}" =~ ^[a-z]$ ]];then   #判断用户输入的是否是单个英文字符
					for ch in ${diskSymbol[*]};do
						cut_ch=${ch:2:1}  #截出盘符的最后一个字母进行比较
						if [[ "${symbol}" == "${cut_ch}" ]];then
							echo "此盘符已经被占用,请输入其他字母。" && break_symbol=1 && break
						else
							check_symbol=1   #满足条件则打上标签
							if [[ "${bus_symbol}" == "s" ]];then   #根据系统盘盘符的第一个字母确定bus的类型,只支持一下三种类型
								bus=scsi
							elif [[ "${bus_symbol}" == "h" ]];then
								bus=ide
							elif [[ "${bus_symbol}" == "v" ]];then
								bus=virtio
							fi
						fi
					done
				else
					echo "输入有误!请输入[a-z]之间的一个字母!" && break
				fi
				[[ ${break_symbol} -eq 1 ]] && break
			fi
		done
		if [[ ${check_capacity} -eq 1 && ${check_symbol} -eq 1 ]];then  #两个条件都满足则进行磁盘添加
			qemu-img create -f qcow2 /var/lib/libvirt/images/${diskFileName}.img ${capacity}G &> /dev/null  #创建磁盘
			echo "磁盘创建成功!"
			cat > /etc/libvirt/qemu/${diskFileName}.xml <<- eof                 #编写磁盘文件
			<disk type='file' device='disk'>
       			<driver name='qemu' type='qcow2'/> 
       			<source file='/var/lib/libvirt/images/${diskFileName}.img'/>
      			<target dev="${bus_symbol}d${symbol}" bus="${bus}"/>
			</disk>
			eof
			virsh attach-device ${name} /etc/libvirt/qemu/${diskFileName}.xml --persistent &> /dev/null   #添加磁盘
			sleep 2
			echo "磁盘添加成功!"
		fi
	fi
	[ "${mark}" != "0" ] && echo "$name 不存在!"
	mark=1
}

#增加网卡
addCard(){
	showKvm &> /dev/null
	#添加网卡的功能比较单一,没有提供选项给用户,只要kvm存在直接添加一张默认类型的网卡,有待改进
	if [ ${#list1[*]} -eq 0 ];then
		echo "当前没有KVM。"
	else
		read -p  "请输入机器名称:" name
		for i in ${list1[*]};do
			if [ "${i}" == "${name}" ];then
				mark=0
				virsh attach-interface ${name} network default --model virtio --persistent  &> /dev/null
				echo "添加网卡成功!"
			fi
		done
		
	fi
	[ "${mark}" != "0" ] && echo "$name 不存在!"
	mark=1
}

#增加CPU
addCPU(){
	#思路差不多,不写了,没空
	echo "暂无此功能!自己用命令添加吧。"
}

#删除磁盘
deleteDisk(){
	showKvm &> /dev/null
	if [ ${#list1[*]} -eq 0 ];then
		echo "当前没有KVM。"
	else
		read -p  "请输入机器名称:" name
		for i in ${list1[*]};do 
			if [ "${i}" == "${name}" ];then
				mark=0
				echo "${name}的所有盘符如下:"
				diskSymbol=($(virsh domblklist ${name} | awk 'NR>=3 && !/hda|^$/{print $1}'))  #获取所有盘符
				echo ${diskSymbol[*]}
				echo "【注意】:盘符可能与实际的磁盘名称不完全对应,删除前请确定正确的对应关系!"
				sleep 2
				read -p  "请输入您要删除的磁盘盘符【只需输入盘符最后一个字母】:" symbol  #依然是使用最后一个字母进行判断
				if [[ "${symbol}" =~ ^[a-z]$ ]];then
					flag=0
					for ch in ${diskSymbol[*]};do
						cut_ch=${ch:2:1}
						if [[ "${symbol}" == "${cut_ch}" ]];then
							[[ "${symbol}" == "a" ]] && echo "${ch}是系统盘,无法删除!" && flag=1 && break  #一般系统盘都是xxa命名的,所以通过a来判断系统盘不能被删除,不过不严谨,有待改进
							read -p "您确定要删除此磁盘吗?【Y/N】" answer2   #重复确认
							case ${answer2} in
							Y|y)
								virsh detach-disk ${name} ${ch} --persistent &> /dev/null 
								echo "磁盘删除成功!" && flag=1 && break
								;;
							N|n)
								echo "已为你取消本次操作!" && flag=1
								;;
							*)
								echo "输入有误!本次操作失败!" && flag=1
							esac
						fi
					done
					[[ ${flag} -eq 0 ]] && echo "此盘符不存在!" && break
				else
					echo "输入有误!请输入[a-z]之间的一个字母!" && break
				fi
				
			fi
		done
	fi
	[ "${mark}" != "0" ] && echo "$name 不存在!"
	mark=1	
}
#删除网卡
deletCar(){
	showKvm &> /dev/null
	if [ ${#list1[*]} -eq 0 ];then
		echo "当前没有KVM。"
	else
		read -p  "请输入机器名称:" name
		for i in ${list1[*]};do
			if [ "${i}" == "${name}" ];then
				mark=0
				echo "${name}的网卡信息如下:"
				virsh domiflist ${name}
				read -p "请输入您要删除的网卡的mac地址:" macName
				check_mac=0
				macList=($(virsh domiflist ${name}|awk 'NR>=3{print $5}'))  #获取指定机器的mac地址
				for mac in ${macList[*]};do
					#删除网卡也是基于添加网卡时考虑的,并没有考虑多种类型,有待改进
					[[ "${mac}" == "${macName}" ]] && virsh detach-interface ${name} --type network --mac ${macName} --persistent &> /dev/null && echo "删除网卡成功!" && check_mac=1 && break
				done
			fi
		done
		[[ ${check_mac} -eq 0 ]] && echo "删除网卡失败!无此网卡!"
	fi
	[ "${mark}" != "0" ] && echo "$name 不存在!"
	mark=1
}

#删除CPU
deleteCPU(){
	#思路差不多,不写了,没空
	echo "暂无此功能!自己用命令删除吧。"
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值