zoukankan      html  css  js  c++  java
  • 脚本定时拷贝虚机

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


    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文件。

        文件位于:

     

  • 相关阅读:
    atcoder #082 E 暴力 计算几何
    LightOJ 1364 树形DP
    gym100712 ACM Amman Collegiate Programming Contest
    CF757 C hash
    CF844 C 置换 水
    CF544 C 背包 DP
    CF540 D 概率 DP
    CF540 C BFS 水
    CF540 B 贪心
    CF745 C 并查集
  • 原文地址:https://www.cnblogs.com/zqj-blog/p/10432386.html
Copyright © 2011-2022 走看看