脚本定时拷贝虚机
虚机备份有诸多方式,最直接的方式就是拷贝虚机所在的文件夹,实现完全备份。若要定期自动去实现虚机备份,可先编写一个自动备份虚机的脚本,然后将脚本加入周期性计划任务中。
1、拷贝虚机
该脚本需要注意三点,一是:虚机的名称,执行脚本时,将虚机名称作为参数传入;二是虚机所在的磁盘,脚本默认虚机所在的磁盘为“datastore1”,可根据实际情况修改SOURCE_DIR变量;三是将虚机文件拷贝到哪个位置,修改DST_DIR参数。
执行完成后会在/var/log下生成一个bakupvm.log日志,查看日志可看成备份的情况。
脚本过程:先判断虚机是否关机,若开机,则先关机,然后再拷贝虚机文件到指定位置,将拷贝任务放到后台,使用while循环时刻监控拷贝命令是否完成。
#!/bin/sh
VM_NAME=$1
LOG_PATH="/var/log/bakupvm.log"
echo > $LOG_PATH
if [ ! -n "$1" ]
then
echo "$1 is not exist!" >> $LOG_PATH
exit 1
fi
SOURCE_DIR="/vmfs/volumes/datastore1/$VM_NAME/"
DST_DIR="/vmfs/volumes/datastore1/vmbakup_dir"
if [ ! -d $SOURCE_DIR ]
then
echo "SOURCE DIR is not exist! " >> $LOG_PATH
exit 1
fi
if [ ! -d $DST_DIR ]
then
mkdir $DST_DIR
fi
echo "stop vm" >> $LOG_PATH
vim-cmd vmsvc/getallvms | grep $VM_NAME
if [ $? -ne 0 ]
then
echo "$VM_NAME is not exist!" >> $LOG_PATH
exit 1
else
echo "$VM_NAME is exist " >> $LOG_PATH
VM_ID=`vim-cmd vmsvc/getallvms | grep -w $VM_NAME | awk '{print $1}'`
echo $VM_ID >> $LOG_PATH
fi
vim-cmd vmsvc/power.getstate $VM_ID | grep "Powered on"
if [ $? -eq 0 ]
then
echo "$VM_NAME will shutdown " >> $LOG_PATH
vim-cmd vmsvc/power.off $VM_ID
sleep 10
echo "$VM_NAME shutdown ok! " >> $LOG_PATH
fi
echo "back up $VM_NAME all file,will take 2 - 4 hours! "
CP_NUM_OLD=`ps | grep -w cp | wc -l`
nohup cp -rf $SOURCE_DIR/* $DST_DIR/ &
echo "start backup......" >> $LOG_PATH
while :
do
sleep 10
CP_NUM_NEW=`ps | grep -w cp | wc -l`
if [ $CP_NUM_NEW -eq $CP_NUM_OLD ]
then
echo "cp ok!" >> $LOG_PATH
echo "start vm" >> $LOG_PATH
vim-cmd vmsvc/power.on $VM_ID
sleep 10
echo "OK!" >> $LOG_PATH
exit 0
else
echo "cp......" >> $LOG_PATH
fi
#CP_PID=`ps | grep -w cp | awk '{print $1}'`
done
2、将脚本加入周期性计划任务
vmware下设置周期性计划任务的文件在 /var/spool/cron/crontabs/root文件下。完全遵循crontab的写法:“分 时 日 月 周 命令”,强制保存。
新增计划任务的作用是:每分钟往/test.txt文件追加“1”。

若拷贝虚机的任务是每个月的周日凌晨备份,可以这样写(假设脚本路径是“/var/bakvm.sh”): 0 0 * /3 7 /var/bakvm.sh
重启crond:
cat /var/run/crond.pid #查看crond的pid kill $(cat /var/run/crond.pid) #杀了crond进程的pid号 /usr/lib/vmware/busybox/bin/busybox crond #启动crond cat /var/run/crond.pid #检查crond是否启动成功
查看新增的周期性计划任务结果:

【注】以上仅仅适用于服务器不重启的情况下,若esxi服务器重启,以上新增的周期性计划任务将会失效。此时还需要进行以下操作:
编辑/etc/rc.local文件,追加3行:
/bin/kill $(cat /var/run/crond.pid) /bin/echo '* * * * * echo "1" >> /test.txt ' >> /var/spool/cron/crontabs/root /bin/busybox crond
运行auto-backup.sh脚本去备份/etc/rc.local文件,放在重启服务器重置/etc/rc.local文件。
文件位于:


浙公网安备 33010602011771号