脚本定时拷贝虚机
虚机备份有诸多方式,最直接的方式就是拷贝虚机所在的文件夹,实现完全备份。若要定期自动去实现虚机备份,可先编写一个自动备份虚机的脚本,然后将脚本加入周期性计划任务中。
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文件。
文件位于: