シェルスクリプト-KVM仮想マシンのモジュラーインストールと管理



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.仮想マシンのハードウェア、スナップショットを削除します

仮想マシンのハードディスクを
ここに画像の説明を挿入
削除する仮想マシンのネットワークカードを
ここに画像の説明を挿入
削除する仮想マシンのスナップショットを削除する
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/AnNan1997/article/details/115304552