1.KVM仮想マシンのモジュラーインストールと管理
#!/bin/bash
##kvm管理脚本
##ShanHai
#source加载模块脚本
source /shanhai/install-virtualhost.sh #创建一个全新虚拟机的模块脚本
source /shanhai/mod.sh #使用虚拟机模板快速创建新虚拟机的模块脚本
source /shanhai/disk.sh #添加硬盘的模块脚本
source /shanhai/net.sh #添加网卡的模块脚本
source /shanhai/snap.sh #创建快照的模块脚本
source /shanhai/vm_del.sh #删除虚拟机硬件,快照的模块脚本
while :
do
cat <<-EOF
————————————————————————————————————————————————————————————————————————————————————————————————
1.查看当前所有虚拟机
2.创建一个全新的虚拟机
3.使用模板快速创建虚拟机
4.添加虚拟机硬件
5.创建虚拟机快照
6.删除虚拟机硬件、快照
*.退出
———————————————————————————————————————————————————————————————————————————————————————————————
EOF
read -p "请输入要进行的操作:" kvm_num
case "$kvm_num" in
1)
virsh list --all
;;
2)
vm_install
;;
3)
vm_mod
;;
4)
read -p "(1)添加硬盘,(2)添加网卡,(Q/q)退出" vm_num
case "$vm_num" in
1)
vm_disk
;;
2)
vm_net
;;
Q|q)
exit
esac
;;
5)
vm_snap
;;
6)
read -p "(1)删除硬盘,(2)删除网卡,(3)删除快照,(Q/q):" del_num
case "$del_num" in
1)
disk_del
;;
2)
net_del
;;
3)
snap_del
;;
Q|q)
exit
;;
esac
;;
*)
exit
;;
esac
done
1.新しい仮想マシンモジュールスクリプトを作成します
#!/usr/bin/env bash
##vm_install
##ShanHai
vm_install(){
set -ue
set -o pipefail
# 创建相关目录
ls /home/kvm/{
ks,virtualhost,virtual-img} 1>/dev/null 2>&1 || mkdir -p /home/kvm/{
ks,virtualhost,virtual-img}
# 此程序的变量
KVM_HOME=/home/kvm
KVM_ISO=${
KVM_HOME}/iso/CentOS-7-x86_64-Minimal-1708.iso
KVM_KS_FILE=${
KVM_HOME}/ks/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
}
2.既存の仮想マシンテンプレートを使用して、新しい仮想マシンのモジュールスクリプトをすばやく作成します
#!/usr/bin/bash
##MOD
##ShanHai
vm_mod(){
read -p "请输入创建的新虚拟机名称:" vm_name
vm_uuid=`uuidgen`
vm_mem=1048576
vm_mac=`openssl rand -hex 3 | sed -r 's/..\B/&:/g'`
#源镜像路径
image=/home/kvm/virtual-img/shanhai.qcow2
#源模板位置
mod=/etc/libvirt/qemu/centos7-mod.xml
#新镜像位置
new_image=/home/kvm/virtual-img/${
vm_name}.qcow2
#新模板位置
new_mod=/etc/libvirt/qemu/${
vm_name}.xml
cp $image $new_image
cp $mod $new_mod
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%$new_image% \
-e s%vm-mac%$vm_mac% \
$mod > $new_mod
echo "查看创建的虚拟机"
virsh define /etc/libvirt/qemu/${
vm_name}.xml &>> /dev/null
systemctl restart libvirtd
virsh start $vm_name
virsh list --all | grep $vm_name
}
3.仮想マシンのハードディスクのモジュールスクリプトを追加します
#!/bin/bash
##disk
##ShanHai
#添加虚拟硬盘
vm_disk(){
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
disk=vd${
i}
read -p "请输入创建的磁盘容量(如2G):" disk_size
disk_file=/shanhai/${
vm_name}-${
disk}.qcow2
qemu-img create -f qcow2 ${
disk_file} ${
disk_size}G
source /shanhai/disk.mod > /shanhai/disk.xml
virsh attach-device ${
vm_name} /shanhai/disk.xml --persistent
echo "查看虚拟硬盘"
virsh domblklist ${
vm_name}
}
4.仮想マシンネットワークカードのモジュールスクリプトを追加します
#!/bin/bash
##net
##ShanHai
#添加虚拟网卡
vm_net(){
echo "添加虚拟网卡"
s=`openssl rand -hex 3 | sed -r 's/..\B/&:/g'`
source /shanhai/net.mod > /shanhai/net.xml
virsh attach-device ${
vm_name} net.xml --persistent
echo "查看虚拟网卡"
virsh domiflist ${
vm_name}
}
5.仮想マシンのスナップショットを作成するためのモジュールスクリプト
#!/bin/bash
##snap
##ShanHai
#创建快照
vm_snap(){
virsh list --all
read -p "请输入想要创建快照的虚拟机名称:" vm_name
vm_stat=`virsh list --all | grep $vm_name | awk '{print $3" "$4}'`
qemu-img info /home/kvm/virtual-img/${
vm_name}.qcow2 &>>/dev/null
disk_type=`qemu-img info /home/kvm/virtual-img/${
vm_name}.qcow2 | grep file | awk '{print $3}'`
echo $disk_type
exit
echo "当前虚拟机磁盘类型为:$disk_type"
echo "当前虚拟机状态为:$vm_stat"
read -p "是否继续创建快照?[Y/n]:" snap_num
case "$snap_num" in
Y|y)
if [ "$disk_type" = "qcow2" ];then
read -p "请输入创建的快照名称:" snap_name
virsh snapshot-create-as $vm_name ${
vm_name}.${
snap_name}
echo "查看指定虚拟机的快照:"
virsh snapshot-list $vm_name
else
echo "当前磁盘类型不支持创建快照"
fi
;;
N|n)
echo "正在退出..."
;;
esac
}
6.仮想マシンハードウェア、スナップショットモジュールスクリプトを削除します
#!/usr/bin/bash
##vm_del
##ShanHai
#删除虚拟机硬盘
disk_del(){
virsh list --all
read -p "请输入想要删除硬盘的虚拟机:" vm_name
echo "查看当前虚拟机硬盘信息:"
virsh domblklist $vm_name
read -p "请输入想要删除的硬盘:" vm_disk
virsh detach-disk ${
vm_name} ${
vm_disk} --persistent
}
#删除虚拟机网卡
net_del(){
virsh list --all
read -p "请输入想要删除网卡的虚拟机名称:" vm_name
echo "查看当前虚拟机网卡信息:"
virsh domiflist ${
vm_name}
read -p "请输入想要删除的网卡mac名称:" net_name
virsh detach-interface ${
vm_name} network ${
net_name} --persistent
}
#删除虚拟机快照
snap_del(){
virsh list --all
read -p "输入想要删除快照的虚拟机名称:" vm_name
echo "查看当前虚拟机所有快照:"
virsh snapshot-list ${
vm_name}
read -p "输入想要删除的快照名称:" snap_name
virsh snapshot-delete ${
vm_name} --snapshotname ${
snap_name}
}
2.実行効果
1.すべての仮想マシンを表示する
2.新しい仮想マシンを作成します
3.仮想マシンをすばやく作成するためのテンプレート
4.仮想マシンのハードディスクを追加します
5.仮想マシンネットワークカードを追加します
6.仮想マシンのスナップショットを作成します
7.仮想マシンのハードウェア、スナップショットを削除します
仮想マシンのハードディスクを
削除する仮想マシンのネットワークカードを
削除する仮想マシンのスナップショットを削除する