脚本实现的功能:
- 1.查看当前所有虚拟机
- 2.快速创建虚拟机
- 3.创建一个全新的虚拟机
- 4.添加硬件
- 5.创建快照
- 6.删除快照
- 7.删除硬盘
- 8.删除网卡
利用模板安装虚拟机模块
#!/bin/bash
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虚拟机
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)"
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
}
硬盘模块
#!/bin/bash
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
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
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
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
