模块化编程(汇总kvm管理脚本)

本文档介绍了一个强大的KVM管理脚本,涵盖了快速创建虚拟机、全新安装、硬件添加、创建快照、删除操作等功能,通过模板安装简化流程,适用于Linux管理员和开发人员.

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


脚本实现的功能:

  • 1.查看当前所有虚拟机
  • 2.快速创建虚拟机
  • 3.创建一个全新的虚拟机
  • 4.添加硬件
  • 5.创建快照
  • 6.删除快照
  • 7.删除硬盘
  • 8.删除网卡

利用模板安装虚拟机模块

#!/bin/bash
##利用模板快速创建虚拟机
## zy.小强
modkvm_install(){
    def_name=`openssl rand -hex 5`
    read -p "请输入虚拟机的名字[默认名字:$def_name]:" vm_name
    read -p "请输入内存大小[默认1G],不要输入单位:" vm_mem
    vm_name=${vm_name:-$def_name} #定义默认名字
    vm_uuid=`uuidgen`
    def_mem=1
    vm_mem=${vm_mem:-$def_mem} #定义默认内存
    vm_mac=`openssl rand -hex 3 | sed -r 's/..\B/&:/g'`
    vm_mem=${vm_mem}00000
    #源镜像位置
    sourceimage=/home/kvm/virtual-img/centos-lwq-1.qcow2
    #源模板位置
    sourcexml=/etc/libvirt/qemu/centos7-mod.xml
    
    #新的镜像位置
    newimg=/home/kvm/virtual-img/${vm_name}.qcow2
    #新的模板位置
    newxml=/etc/libvirt/qemu/${vm_name}.xml
    echo "正在复制模板和镜像"
    cp $sourceimage  $newimg
    cp $sourcexml    $newxml
    echo "正在修改模板"
    sed -r \
    -e s%vm_name%$vm_name% \
    -e s%vm_uuid%$vm_uuid% \
    -e s%vm_mem%$vm_mem% \
    -e s%vm_disk_path%$newimg% \
    -e s%vm_mac%$vm_mac% $sourcexml   > $newxml
    echo "正在重启libvirtd服务"
    systemctl restart libvirtd
    echo "正在启动虚拟机"
    virsh start $vm_name
	if [ $? -eq  0 ];then
		echo "启动成功自动列出所有虚拟机信息"
		virsh list --all | grep $vm_name | awk '{print $2"——————"$3}'
		
	else
		echo "启动失败!!!!!!!!"

	fi
}

全新安装kvm虚拟机

#!/usr/bin/env bash


kvm_install(){
    set -ue
    set -o pipefail
    
    # 创建相关目录
    ls /home/kvm/{ks,virtualhost,virtual-img} 1>/dev/null 2>&1 || mkdir -p /home/kvm/{virtualhost,virtual-img}
    
    
    # 此程序的变量
    KVM_HOME=/home/kvm
    KVM_ISO=${KVM_HOME}/iso/centos7.iso
    KVM_KS_FILE=${KVM_HOME}/ks.cfg
    KVM_IMG_DIR=${KVM_HOME}/virtual-img
    
    OS_TYPE="linux"
    DEF_OS_VARIANT="rhel7"
    DEF_VM_NAME="centos$(date +%Y%m%dT%H%M%S)"
    
    # 设置默认内存大小 1024 M,这个单位是固定的 M,不支持其他单位
    DEF_MEM_SIZE=1024
    DEF_VCPUS=1
    DEF_DISK_SIZE=10G
    
    #  交互式安装
    echo  "输入将要创建的KVM虚拟机名称,不是主机名哦"
    read -p "默认值${DEF_VM_NAME}>>:" VM_NAME
    
    
    echo  "输入将要创建的服务器主机名"
    read -p "默认 localhost>>:"  HOST_NAME
    
    read -p "输入虚拟机 CPU 核心数默认 1 示例:2>>:" VCPUS
    
    echo "输入虚拟机内存大小,默认1024M,不支持其他单位"
    read -p "只需要添数字即可>>:" MEM_SIZE
    
    echo "输入虚拟机使用的磁盘容量"
    read -p "默认 10G,[示例写法:15G]>>:"  DISK_SIZE
    
    
    # 变量替换, 假如没有输入值, 就使用默认值
    VM_NAME=${VM_NAME:-$DEF_VM_NAME}
    HOST_NAME=${HOST_NAME:-localhost.localdomain}
    
    VCPUS=${VCPUS:-$DEF_VCPUS}
    MEM_SIZE=${MEM_SIZE:-$DEF_MEM_SIZE}
    DISK_SIZE=${DISK_SIZE:-$DEF_DISK_SIZE}
    OS_VARIANT=${OS_VARIANT:-$DEF_OS_VARIANT}
    
    new_disk=${KVM_IMG_DIR}/${VM_NAME}.qcow2
    
    
    if [[ ! "${DISK_SIZE}" =~ G$ ]] || [[ ! "${DISK_SIZE::-1}" =~ ^[0-9]+$ ]]
    then
        echo "格式不正确,正确示例:20G"
        exit
    fi
    
    
    if [ ! -f "${new_disk}" ];then
        qemu-img create -f qcow2 ${new_disk} ${DISK_SIZE}
    fi
    
    
    # 开始创建
    
    virt-install -v \
         --arch x86_64 --virt-type kvm \
         --name ${VM_NAME} \
         --memory ${MEM_SIZE} \
         --vcpus ${VCPUS} \
         --os-type ${OS_TYPE} \
         --location ${KVM_ISO} \
         --network default \
         --graphics none \
         --os-variant     ${OS_VARIANT} \
         --initrd-inject  "${KVM_KS_FILE}" \
         --extra-args     "ks=file:/ks.cfg  \
                           console=tty0 console=ttyS0,115200n8 \
                           hostname=${HOST_NAME}" \
         --disk ${new_disk},cache=writeback,io=threads,bus=virtio
    
    # 桥接模式,前提是你已经建立好了网桥
    #     --network bridge=br0  \
    
    
    # end
}

硬盘模块

#!/bin/bash
## 添加虚拟机硬盘
## zy.小强

disk_install(){
    virsh list --all
    read -p "请输入要添加硬盘的虚拟机:" vm_name
    
    #获取未使用的盘符
    for i in {a..z}
    do
        virsh domblklist $vm_name | grep "^vd${i}" > /dev/null
        if [ $? -ne 0 ];then
          break
        fi
    done
    
    echo "1"
    disk=vd${i}
    
    
    #制作磁盘模板
    #创建空磁盘
    mkdir /centos7 &>/dev/null
    disk_home=/centos7/${vm_name}-${disk}.qcow2
    echo $disk_home
    
    disk_path=${disk_home}
    source ./disk.mod > disk.xml
    echo "2"
    
    
    
    read -p "添加多少G的硬盘[1G]:" size
    
    #创建空磁盘
    qemu-img create -f qcow2  ${disk_home}  ${size} 
    echo "3"
    
    
    #添加硬盘
    virsh attach-device ${vm_name} disk.xml --persistent
    
    
    
    #查看磁盘
    virsh domblklist ${vm_name}
}
disk_del(){
	read -p "请输入你要删除硬盘的虚拟机: " vm_name
	virsh domblklist $vm_name
	read -p "请输入要删除的硬盘名[例如:vdb]" disk_v	
	virsh detach-disk $vm_name  $disk_v --persistent 	
}

网卡模块

#!/bin/bash
## 添加虚拟网卡 
## zy.小强

#添加虚拟网卡
net_install(){
virsh list --all
read -p "请输入要添加的虚拟机:" vm_name

echo "添加虚拟网卡"
s=`openssl rand -hex 3 | sed -r 's/..\B/&:/g'`

source ./net.mod >  net.xml

virsh attach-device ${vm_name} net.xml --persistent
echo "查看虚拟网卡"
virsh domiflist ${vm_name}
}
net_del(){
	virsh list --all
	read -p "请输入虚拟机名字:" vm_name
	virsh domiflist $vm_name
	read -p "请输入接口名字:" net
	mac_in=`virsh domiflist $vm_name  | grep $net | awk '{print $5}'`
	virsh detach-interface $vm_name network $mac_in --persistent
}

快照模块

#!/bin/bash
## 添加快照
## zy.小强

snap_create(){
    disk_home=/home/kvm/virtual-img/
    
    
    virsh list --all
    read -p "请输入你要创建快照的虚拟机: " vm_name
    virsh list --all | grep  $vm_name &>/dev/null
    if [ $? -eq 0  ];then
    	stat=`virsh list --all | grep $vm_name | awk   '{print $3}'`
    	echo "当前虚拟机状态为$stat"
    	read -p "是否继续创建快照[y/n]" option	
    	case $option in
    	y|Y)
    		read -p "请输入快照的名字: " snap
    		echo "正在创建快照"
    		disk_type=`qemu-img info ${disk_home}${vm_name}.qcow2 | awk -F ":[ ]" 'NR==2 {print $2}'`
    
    			if [ "$disk_type"  =  "qcow2"  ];then
    				
    				virsh snapshot-create-as  $vm_name  $snap
    				virsh snapshot-list $vm_name
    				if [ $? -eq 0  ];then
    					echo "创建成功"
    					
    				else
    					echo "创建失败"
    					break
    			
    				fi
    			else
    				echo "类型不支持,正在退出!!!"
    				break			
    
    			fi
    	;;
    
    
    	n|N)
    		break
    	;;
    
    
    	*)
    		break
    	;;
    	esac
    else 
    	echo "虚拟机不存在,请重新输入!"
    		
    	continue
    fi
}

snap_delete(){
	
    	virsh list --all
        read -p "请输入删除快照的虚拟机: " vm_name
	virsh snapshot-list $vm_name 
	read -p "请输入删除快照的虚拟机: " vm_snap
	virsh snapshot-delete $vm_name --snapshotname $vm_snap
	virsh snapshot-list $vm_name   
}

汇总脚本

#!/bin/bash
##  kvm管理脚本
##  zy.小强


# 加载模块
source ./disk_install.sh   #加载硬盘模块
source ./kvm_install.sh	   #加载全新安装模块
source ./modkvm_install.sh #加载模板安装模块
source ./net_install.sh		#加载网卡模块
source ./snap.sh			#加载快照模块


while :
do
cat <<-EOF
————————————————————————————————————————————————————————————————————————————————————————————————
1.查看当前所有虚拟机
2.快速创建虚拟机
3.创建一个全新的虚拟机
4.添加硬件
5.创建快照
6.删除快照
7.删除硬盘
8.删除网卡
q/Q.输入退出
———————————————————————————————————————————————————————————————————————————————————————————————
EOF
read -p "请输入你的选择:" option

case "$option" in 
1)
virsh list --all
;;
2)
modkvm_install
;;
3)
kvm_install
;;
4)
	read -p "[1]添加网卡,[2]添加硬盘,[q/Q]退出: "  HW
	case "$HW" in
	2)
		disk_install
	;;
	1)
		net_install
	;;
	q|Q)
		exit
	esac

;;
5)
snap_create
;;
6)
snap_delete
;;
7)
disk_del
;;
8)
net_del
;;
q|Q)
break
;;
esac

done

在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值