#!/usr/bin/bash
# 从指定虚拟机复制一台相同的虚拟机
# usage: copyvm.sh oldvm newvm
# 复制的镜像文件在源镜像文件的相同路径下
if [ $UID -ne 0 ]
then
echo "You are not root, can not execute this script"
exit 1
fi
if [ $# -ne 2 ]
then
echo "Usage Error! Usage: copyvm.sh oldvm newvm"
exit 1
fi
OLDVM=$1
NEWVM=$2
FLAG=0
ALLVM=$(virsh list --all | sed -n '3,$p' | awk '{print $2}')
for vm in ${ALLVM}
do
if [[ "${OLDVM}" == "$vm" ]]
then
FLAG=1
break
fi
done
if [ ${FLAG} -eq 0 ]
then
echo "source vm ${OLDVM} does not exist!"
exit 1
fi
FLAG=1
for vm in ${ALLVM}
do
if [[ "${NEWVM}" == "$vm" ]]
then
FLAG=0
break
fi
done
if [ ${FLAG} -eq 0 ]
then
echo "dest vm ${NEWVM} already exits"
exit 1
fi
virsh dumpxml ${OLDVM} > ${NEWVM}.xml
if [ $? -ne 0 ]
then
echo "can not dump the xml file"
exit 1
fi
if [ ! -e ${NEWVM}.xml ]
then
echo "can not find the new configuration file"
exit 1
fi
sed -ri "s@<name>.*</name>@<name>${NEWVM}</name>@" ${NEWVM}.xml
sed -ri '/<uuid>/d' ${NEWVM}.xml
sed -ri '/<mac add/d' ${NEWVM}.xml
EXT=$(sed -rn '/<driver name/p' ${NEWVM}.xml | awk '{print $3}'| sed -rn "s@type='(.*)'.*@\1@p")
DISKPATH=$(sed -rn '/<source file/p' ${NEWVM}.xml | awk -F= '{print $2}'| sed -rn "s@'(.*)'/>@\1@p")
if [ ! -e ${FILEPATH} ]
then
echo "The old vm disk file does not exist"
exit 1
fi
DISKDIR=$(dirname ${DISKPATH})
echo "OLDDISK:${DISKPATH}"
echo "NEWDISK:${DISKDIR}/${NEWVM}.${EXT}"
cp ${DISKPATH} ${DISKDIR}/${NEWVM}.${EXT}
if [ $? -ne 0 ]
then
echo "copy the old vm disk file failed"
exit 1
fi
sed -ri "s@(.*<source file=').*('/>)@\1${DISKDIR}/${NEWVM}.${EXT}\2@" ${NEWVM}.xml
# echo "${NEWVM}.xml"
virsh define ${NEWVM}.xml &>/dev/null
if [ $? -eq 0 ]
then
echo "create new virt machine : ${NEWVM} FROM ${OLDVM} successflly!"
else
echo "create new virt machine : ${NEWVM} failed"
fi
rm -rf ${NEWVM}.xml
bash练习5 (复制虚拟机)
于 2021-12-29 10:35:09 首次发布
该脚本是一个用于在Linux环境中复制虚拟机的bash shell脚本。它首先检查是否以root权限运行,并确保提供了正确的参数。然后,脚本会验证源虚拟机是否存在,目标虚拟机是否已存在。接着,它将源虚拟机的配置文件复制并修改为新的虚拟机名称,删除UUID和MAC地址信息,并创建一个新的磁盘文件。如果所有步骤都成功,它将定义新的虚拟机并报告复制成功。
摘要由CSDN通过智能技术生成