Site icon Mr. 沙先生

ESXi 5.1 / 5.5 定期排程備份線上VM;NFS、sendmail-ghettoVCB

好的,本篇的實作花了小弟一些時間去執行,因為多數的網路文章都不正確或是少東少西的,讓小弟真的很頭疼。

 

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。

 

 

 

參考資料:

William blog

ghettoVCB Documentation

Exit mobile version