아래 스크립트는 여러개의 VM을 KVM Host의 쉘에서 Clone 하기 위한 스크립이다.
사전에 kvm 구성 및 template vm에 대한 xml 및 image(qcow2)가 준비되어 있어야 동작된다.
1. clone-vm.sh
#!/bin/bash ######## USER DEFINE DEFAULT VARIABLE ######## ORIGINALVM=template ORIGINALXMLFILE=/root/template.xml VMIMAGESAVEDIR=/home/vm-images DEFAULTMKVMS=10 ############################################## VERSION="0.1" # Default Options function defaultopt() { if [ x$ORIGINALVM == x ]; then ORIGINALVM=$ORIGINALVM fi if [ x$ORIGINALXMLFILE == x ]; then ORIGINALXMLFILE=$ORIGINALXMLFILE fi if [ x$VMIMAGESAVEDIR == x ]; then VMIMAGESAVEDIR=$VMIMAGESAVEDIR fi if [ x$DEFAULTMKVMS == x ]; then DEFAULTMKVMS=$DEFAULTMKVMS fi } defaultopt # Options Function function usage() { echo -e "\e[34m\e[1m*** The options are :\e[21\033[0m" echo "-h or --help : Help" echo "-v or --version : Show script version" echo "--source-vm : Original vm" echo "--source-xml : Source XML file" echo "--storage : Where qcow2 file will be saved" echo "--mk-vms : Number of vm to clone" echo "" echo -e "\e[34m\e[1m*** Default options are :\e[21\033[0m" echo "--source-vm : $ORIGINALVM" echo "--source-xml : $ORIGINALXMLFILE" echo "--storage : $VMIMAGESAVEDIR" echo "--mk-vms : $DEFAULTMKVMS" echo "" echo -e "\e[34m\e[1m*** Usage :\e[21\033[0m" echo "example 1 : $0" echo " => If no options are set, it is cloned as Default options" echo "" echo "example 2 : $0 --mk-vms=5" echo " => 5 vm will be cloned. Default values apply to options except the'--mk-vms' option." echo "" echo "example 3 : $0 --source-vm=template --source-xml=/mnt/rep/template.xml --storage=/mnt/rep --mk-vms=5" echo " => 5 vm will be cloned to /mnt/rep/`hostname` based template vm and /mnt/rep/tmplate.xml" echo -e "\033[0m" } while [ "$1" != "" ]; do PARAM=`echo $1 | awk -F= '{print $1}'` VALUE=`echo $1 | awk -F= '{print $2}'` case $PARAM in -h | --help) usage exit ;; -v | --version) echo "$0 Version: $VERSION" exit ;; --source-vm) ORIGINALVM=$VALUE if [ x$ORIGINALVM == x ]; then ORIGINALVM=$ORIGINALVM fi ;; --source-xml) ORIGINALXMLFILE=$VALUE if [ x$ORIGINALXMLFILE == x ]; then ORIGINALXMLFILE=$ORIGINALXMLFILE fi ;; --storage) VMIMAGESAVEDIR=$VALUE if [ x$VMIMAGESAVEDIR == x ]; then VMIMAGESAVEDIR=$VMIMAGESAVEDIR fi ;; --mk-vms) DEFAULTMKVMS=$VALUE if [ x$DEFAULTMKVMS == x ]; then DEFAULTMKVMS=$DEFAULTMKVMS fi ;; *) echo -e "\033[1;31m\e[5mError\e[25m: unknown option parameter \"$PARAM\"\033[0m" echo "" usage exit 1 ;; esac shift done if [ ! -d $VMIMAGESAVEDIR/`hostname` ]; then mkdir -p $VMIMAGESAVEDIR/`hostname` fi ENDVMSNUM=$(ls $VMIMAGESAVEDIR/`hostname`/ | grep 'vm[0-9][0-9][0-9]' | awk -F '.' '{print $1}' | tail -n1 | awk -F 'vm' '{print $2}' | sed 's/^0*//') NUM=0 for i in $(seq 1 $DEFAULTMKVMS) do let ENDVMSNUM+=1 virt-clone --original $ORIGINALVM --original-xml $ORIGINALXMLFILE --name `printf vm%03d $ENDVMSNUM` --file $VMIMAGESAVEDIR/`hostname`/`printf vm%03d $ENDVMSNUM`.qcow2 virsh start `printf vm%03d $ENDVMSNUM` sleep 1 echo "===================================================" echo "" NUM=$((NUM+1)); if [ $NUM == $DEFAULTMKVMS ]; then echo "++++++++++++++++ vm clone finished +++++++++++++++++" virsh list --all echo "++++++++++++++++++++++++++++++++++++++++++++++++++++" fi done
2. operate-vm.sh
#!/bin/bash VERSION="0.1" # Options Function function usage() { echo -e "\e[34m\e[1m*** The options are :\e[21\033[0m" echo "-h or --help : Help" echo "-v or --version : Show script version" echo "--action : start / shutdown / destroy / undefine" echo "" echo -e "\e[34m\e[1m*** Usage :\e[21\033[0m" echo "example 1 : $0 --action=shutdown 1 10" echo " => vm001 ~ vm010 will be shutdown." echo "" echo "example 2 : $0 --action=start 3" echo " => vm003 will be started." echo "" echo "example 3 : $0 --action=destroy 11 13" echo " => vm011 ~ vm013 will be shutdown(power off)." echo "" echo "example 4 : $0 --action=undefine 10 20" echo " => vm010 ~ vm020 will be remove(delete vm's image data)." echo -e "\033[0m" } START=$2 END=$3 if [ x$3 == x ]; then END=$START fi while [ "$1" != "" ]; do PARAM=`echo $1 | awk -F= '{print $1}'` VALUE=`echo $1 | awk -F= '{print $2}' | awk -F ' ' '{print $1}'` case $PARAM in -h | --help) usage exit ;; -v | --version) echo "$0 Version: $VERSION" exit ;; --action) ACTION=$VALUE if [ x$ACTION == x ]; then ACTION=$ACTION fi ;; esac shift done if [ "$ACTION" = "start" ] || [ "$ACTION" = "shutdown" ] || [ "$ACTION" = "destroy" ] || [ "$ACTION" = "undefine" ]; then if [ -z $START ]; then echo "You must enter VM Number value." echo "Refer to below help, please." echo "" usage exit elif [ $END -lt $START ]; then echo "You must enter $END value less than $START value." echo "Refer to below help, please." echo "" usage exit else if [ $ACTION = "undefine" ]; then while true; do read -p "Do you wish to undefine these vm? (*WARN: It will be removed vm's image data. OK?)" yn case $yn in [Yy]* ) for i in $(seq -f "%03g" $START $END) ; do virsh destroy vm$i; done; for i in $(seq -f "%03g" $START $END) ; do virsh $ACTION vm$i --remove-all-storage; done ; break;; [Nn]* ) exit;; * ) echo "Please answer yes or no.";; esac done exit else for i in $(seq -f "%03g" $START $END) do virsh $ACTION vm$i done fi fi else echo "You must enter one of the three --action options. Refer to below help, please." echo "" usage echo $START $END exit fi
Clone and Operate script for VM on the KVM