好的,本篇的實作花了小弟一些時間去執行,因為多數的網路文章都不正確或是少東少西的,讓小弟真的很頭疼。
ghettoVCB 是由一位 William 所寫的 script,在他的站台有許多 VMware 的 script 應用,非常厲害
在一開始先說明一下本篇使用 ghettoVCB 的應用功能
1. 定期排程備份指定的虛擬機
2. 必須要可以 mount NFS (Host 本身硬碟不夠用的時候 NFS 非常好用,又可以解決 I/O 效能)
3. 執行完成必須通知系統管理員
setp.1 下載 ghettoVCB zip 檔案,版本已支援最新 ESXi 5.5
※以下請使用 SSH 遠端登入操作。請參考 開啟 SSH service
setp.2 把 ghettoVCB.zip 丟到 ESXi Host 解壓縮到以下路徑
shell# cd /vmfs/volumes/datastore1/ shell# unzip ghettoVCB-master.zip Archive: ghettoVCB-master.zip 1d4a13df7b3b26d2534d6fce1c9265afdfbbbd58 creating: ghettoVCB-master/ inflating: ghettoVCB-master/README inflating: ghettoVCB-master/ghettoVCB-restore.sh inflating: ghettoVCB-master/ghettoVCB-restore_vm_restore_configuration_template inflating: ghettoVCB-master/ghettoVCB-vm_backup_configuration_template inflating: ghettoVCB-master/ghettoVCB.conf inflating: ghettoVCB-master/ghettoVCB.sh
※僅有在 datastore1 下的資料在重開 ESXi 後不會被清除資料。
setp.3 調整 ghettoVCB.sh,此步驟為自行斟酌,因小弟的習慣所以有修正 script。
更改 log 路徑
搜尋 LOG_OUT 找到以下
並修改成
LOG_OUTPUT="/vmfs/volumes/datastore1/BackupScript/log/BackupLog-$(date +%F%H%M).log"
拿掉 NFS_VM_BACKUP_DIR 設定
因不希望掛載 NFS 後又多一層目錄,所以拿掉所有 NFS_VM_BACKUP_DIR 變數
搜尋 ${NFS_VM_BACKUP_DIR},並拿掉所有有關 ${NFS_VM_BACKUP_DIR} 的變數。 設定完後備份出來的路徑就像以下 /vmfs/volumes/NFS/NFS_VM_BACKUP_DIR/VMBackupDIR 變更為 /vmfs/volumes/NFS/VMBackupDIR
setp.4 設定 ghettoVCB.conf 檔,僅需將要設定的部分拉出來即可,其他在 ghettoVCB.sh 內已有預設值。
VM_BACKUP_VOLUME=/vmfs/volumes/NFSBackup/ \\ 備份虛擬機的路徑 DISK_BACKUP_FORMAT=thin \\ 備份虛擬機格式,建議採預設。 VM_BACKUP_ROTATION_COUNT=2 \\ 備份份數 ENABLE_COMPRESSION=0 \\ 是否壓縮,因備份時間已經花費大量時間,再進行壓縮恐執行不完。 ENABLE_NON_PERSISTENT_NFS=1 \\ 開啟 NFS mount UNMOUNT_NFS=1 \\ 是否執行完就 unmount。 1啟動 , 0關閉 NFS_SERVER=192.168.1.10 \\ NFS server NFS_VERSION=nfs \\ NFS版本,nfs / nfs4 NFS_MOUNT=/volume/esxi5 \\ NFS host 掛載目錄 NFS_LOCAL_NAME=NFSBackup \\ ESXi 掛載名稱 EMAIL_LOG=1 \\ 開啟 maillog 寄送通知 EMAIL_SERVER=192.168.10.99 \\ mail server EMAIL_SERVER_PORT=25 \\ SMTP port EMAIL_DELAY_INTERVAL=1 \\ 是否延遲寄信 EMAIL_TO=shazi7804@gmail.com \\ 收件者 EMAIL_FROM=esxibackup@shazi.twbbs.org \\ 寄件者 sender
其餘設定大多用不到,若有需要了解可參考 ghettoVCB Documentation
setp.5 建立要備份的 VM 清單 (如果要全備份可以用 ghettoVCB.sh -a 參數略過此步驟)
shell# echo "VM1-guest-win2k8" >> listvm
※在此步驟後已可以測試是否可以正常備份 vm
shell# ghettoVCB.sh -f listvm -g ghettoVCB.conf -d debug .. .. .. ###### Final status: All VMs backed up OK! ######
setp.6 此步驟以下開始要建立排程 / 開機 script ,因為 ESXi 再重新啟動後會清除多數的設定檔,包括 root(crontab)、rc.local、service …
設定排程 以及 建立 crondtab.sh
讓 ESXi 按照排程時間執行備份,在 ESXi 執行 crond 的是 /var/spool/cron/crontabs/root 這隻檔案
#排程 shell# cp /var/spool/cron/crontabs/root /vmfs/volumes/datastore1/BackupScript/crond/ shell# vi /vmfs/volumes/datastore1/BackupScript/crond/root #min hour day mon dow command 1 1 * * * /sbin/tmpwatch.py 1 * * * * /sbin/auto-backup.sh 0 * * * * /usr/lib/vmware/vmksummary/log-heartbeat.py */5 * * * * /sbin/hostd-probe 0 0 * * 0 /vmfs/volumes/datastore1/BackupScript/ghettoVCB.sh -f /vmfs/volumes/datastore1/BackupScript/conf/listvm -g /vmfs/volumes/datastore1/conf/ghettoVCB.conf -d debug shell# cp /vmfs/volumes/datastore1/BackupScript/crond/root /var/spool/cron/crontabs/ #建立 crondtab.sh shell# vi /vmfs/volumes/datastore1/BackupScript/crondtab.sh #!/bin/sh #Add BackupVMs crond by week /bin/kill $(cat /var/run/crond.pid) cp /vmfs/volumes/datastore1/BackupScript/crond/root /var/spool/cron/crontabs/ /usr/lib/vmware/busybox/bin/busybox crond
設定防火牆開放 25 port outbound 以及 建立 firewall.sh
#設定防火牆開放 SMTP 25 port shell# vi /vmfs/volumes/datastore1/BackupScript/crond/smtp.xml <ConfigRoot> <service id='0033'> <id>SMTP client</id> <rule id='0000'> <direction>outbound</direction> <protocol>tcp</protocol> <porttype>dst</porttype> <port>25</port> </rule> <enabled>true</enabled> <required>true</required> </service> </ConfigRoot> shell# cp /vmfs/volumes/datastore1/BackupScript/crond/smtp.xml /etc/vmware/firewall/ shell# esxcli network firewall refresh ※這邊可以看 ESXi 的 firewall outbound 25port 已經通了。 建立 firewall.sh #!/bin/sh #Add SMTP OutBound 25port #Firwall rules cp /vmfs/volumes/datastore1/BackupScript/crond/smtp.xml /etc/vmware/firewall/ esxcli network firewall refresh
將 crondtab.sh 和 firewall.sh 加入開機設定檔 /etc/rc.local.d/local.sh
shell# vi /etc/rc.local.d/local.sh #!/bin/sh #backup crond cp /vmfs/volumes/datastore1/BackupScript/crond/root /var/spool/cron/crontabs/ #firewall SMTP cp /vmfs/volumes/datastore1/BackupScript/crond/smtp.xml /etc/vmware/firewall/ #sync UTC+8 time by Taipei 請參考ESXi時區設定 cp /vmfs/volumes/datastore1/BackupScript/crond/localtime /etc/
最後重開機後確認 crondtab.sh / firewall.sh 是否有正確執行,排程備份也如期執行。
※請注意是local.sh 而不是 rc.local,rc.local 在重開機之後依然會清除。
※ root、local.sh 若是直接編輯他都會沒有權限,即使你是 root,必須將檔案 cp 出來再改權限為 755 後再覆蓋回原設定檔。
ghettoVCB.sh
Usage: ./ghettoVCB.sh -f [VM_BACKUP_UP_LIST] -c [VM_CONFIG_DIR] -l [LOG_FILE] -d [DEBUG_LEVEL] -g [GLOBAL_CONF] -e [VM_EXCLUSION_LIST]
OPTIONS:
-a Backup all VMs on host (備份主機上所有的虛擬機)
-f List of VMs to backup (針對List名單內的虛擬機備份)
-c VM configuration directory for VM backups (VM 配置目錄for VM備份)
-g Path to global ghettoVCB configuration file (引用 conf 設定檔)
-l File to output logging (將LOG記錄寫到指定檔案內)
-d Debug level [info|debug|dryrun] (default: info) (Debug測試,不會產生備份)
ghettoVCB 執行 debug:
Q1: Snapshot found for 「host」, backup will not take place
Ans: 最常發生在頻繁測試備份的過程中發生,若是執行到一半中斷了 snapshot 就會 lock 無法刪除,下次要進行備份時就會出現此錯誤,請手動刪除 snapshot。
Q2: 執行 ghettoVCB 在 mount NFS 時出現錯誤
============ ghettoVCB LOG START ============== (vim.fault.AlreadyExists) { dynamicType = <unset>, faultCause = (vmodl.MethodFault) null, name = "/vmfs/volumes/18b63ad6-3fecha5a", msg = "The specified key, name, or identifier already exists.", } Datastore not found. Datastore not found. Datastore not found.
Ans:
狀況1, NFS 已經 mount,unmount 後再執行就可以。
狀況2, 沒有 mount NFS 也出現此錯誤,此為頻繁 mount / unmount 系統錯亂,執行 vSphere client > configuration > storage > Refresh。
參考資料: