網管人雜誌
本文刊載於 網管人雜誌第 86 期 - 2013 年 3 月 1 日出刊,NetAdmin 網管人雜誌 為一本介紹 Trend Learning 趨勢觀念、Solution Learning 解決方案、Technology Learning 技術應用的雜誌,下列筆記為本站投稿網管人雜誌獲得刊登的文章,網管人雜誌於每月份 1 日出刊您可於各大書店中看到它或透過下列圖示連結至博客來網路書店訂閱它。文章目錄
1、前言2、實作環境
3、排程自動化備份 VM 虛擬主機
4、自訂還原設定檔
5、還原 VM 虛擬主機
6、手動還原 VM 虛擬主機(Add to Inventory)
7、結語
1、前言
在上一期文章當中我們實作並說明透過 William Lam 所撰寫的 ghettoVCB.sh 備份腳本,以類似早期 VMware VCB 機制將運作於 ESX(i)虛擬化平台上的 VM 虛擬主機進行完整備份作業,並且線上運作的服務在備份期間也不會中斷。
在本期文章當中首先我們將介紹如何設定 ESXi 虛擬化平台上的排程功能,使得能夠在指定的離峰時間時自動執行 ghettoVCB.sh 備份腳本,以達成全自動化的 VM 虛擬主機備份作業。此外,當 VM 虛擬主機發生災難事件導致停止服務時,我們又該如何在最短的時間之內進行災難回復作業,使得 VM 虛擬主機能夠更快的重新上線服務。
2、實作環境
- 虛擬化技術平台: VMware vSphere ESXi 5.1.0(838463)
- 連線管理軟體: VMware vSphere Client(860230)
- 備份腳本: ghettoVCB.sh
- 還原腳本: ghettoVCB-restore.sh
- SSH Client: putty.exe
3、排程自動化備份 VM 虛擬主機
先前的實作中我們以 SSH Client 遠端連線的方式手動連線至 ESXi 虛擬化平台上,接著切換路徑到 ghettoVCB.sh備份腳本的儲存路徑手動執行備份作業。
通常備份作業對於 ESXi 虛擬化平台的硬體資源(CPU / Memory / Disk IO)來說多多少少都有所損耗,此外如果備份後的檔案是要存放於 NFS 或 iSCSI Storage 時,還需要透過網路卡來傳輸備份資料,因此也會影響到實體交換器的效能以及增加網路上的封包數量及碰撞頻率。
因此備份作業一般應該要安排在 ESXi 虛擬化平台負載較低的離峰時間,例如 每天的凌晨時分或者是週末假日時間才對,難道還要系統管理人員在這種時間才手動 SSH 遠端登入後執行備份作業嗎? 當然不是 !! 不過因為 ESXi 虛擬化平台並沒有 COS(Service Console),因此在排程的設定上與 Linux based 上的 Crontab 有些許不同,並且 ESXi 虛擬化平台上的排程執行服務雖然為「crond」,但是您會發現在 ESXi 虛擬化平台的執行序 Process 中並無法看到它,因為從 ESXi 5.0 版本開始 crond 已經整合到 busybox 之中,成為一個「連結檔案」並指向至 busybox 檔案(/bin/crond -> /usr/lib/vmware/busybox/bin/busybox)。
請修改管理者帳號 root 的排程檔案「/var/spool/cron/crontabs/root」內容來達成排程設定,排程中共有五個時間欄位分別為「分、時、日、月、週」並接上要執行的指令,下列為時間欄位的意義說明:
- 分(Minute): 代表 每小時 中第幾分鐘要執行指令,可用數值為 0 ~ 59
- 時(Hour): 代表 每天 中第幾小時要執行指令,可用數值為 0 ~ 23
- 日(Day): 代表 每月 中第幾天要執行指令,可用數值為 1 ~ 31
- 月(Month): 代表 每年 中第幾個月要執行指令,可用數值為 1 ~ 21
- 週(Week): 代表 每週 中星期幾要執行指令,可用數值為 0 ~ 7(0、7 都表示為星期日)
我們先將備份腳本執行檔 ghettoVCB.sh,以及備份設定檔 mybackup.conf複製存放於 /tmp 資料夾下 (路徑較短考量),接著修改排程設定檔「/var/spool/cron/crontabs/root」內容指定「每天凌晨 4 點」時,執行備份腳本以執行 VM 虛擬主機的備份作業,並且將備份過程寫入至 /tmp/mybackup.log 日誌檔案當中。
# cat /tmp/mybackup.conf //查看備份設定檔內容
VM_BACKUP_VOLUME=/vmfs/volumes/LocalHDD/BackupVMs
DISK_BACKUP_FORMAT=thin
VM_BACKUP_ROTATION_COUNT=5
# grep mybackup.conf /var/spool/cron/crontabs/root //查看排程設定檔內容
0 20 * * * /tmp/ghettoVCB.sh -a -g /tmp/mybackup.conf > /tmp/mybackup.log
您可能會覺得奇怪為何排程設定明明為「0 20 * * *」,照道理來說應該是每天「晚上 8 點」才對怎麼會是每天的凌晨 4 點? 是這樣的,雖然在 vSphere Client 管理介面當中,我們可以指定 ESXi Host 主機時間,但是事實上若您採用 SSH Client 工具遠端登入 ESXi 虛擬化平台後使用指令「date」查看系統時間時,您將會發現 ESXi Host 時區為 「UTC」 也就是格林威治標準時區,而非台灣時區的「UTC + 8」,並且在 ESXi 虛擬化平台中是無法改變時區設定的(詳細原因請參考 VMware KB 1436),因此設定排程時記得要估算加上 8 小時的時間才是台灣的當地時間。
圖 1、vSphere Client 看到的系統時間與 SSH 登入查看的系統時間不同時區
排程設定完成後,必須要重新啟動 crond(busybox)執行序才能讓剛才的排程設定套用生效,首先請查詢 crond 的 PID(Process ID)號碼,如果您的 ESXi 平台版本為 5.0 您可以直接使用指令「busybox crond」來重新啟動排程服務,但若是 ESXi 平台為最新版本 5.1 的話則會得到「-sh: busybox: not found」的錯誤訊息,因為在 ESXi 5.1 版本中已經沒有預設的 /bin/busybox,您必須要鍵入另一個完整路徑 /usr/lib/vmware/busybox/bin/busybox 來啟動排程服務才行,當排程服務啟動完成之後再次查看新的執行序 PID 以判斷是否真的重新啟動成功。
# cat /var/run/crond.pid //查看目前 crond 的 PID
2456 //目前 PID 為 2456
# /bin/kill $(cat /var/run/crond.pid) //刪除 crond Process ID
# /usr/lib/vmware/busybox/bin/busybox crond //重新啟動 crond
# cat /var/run/crond.pid //再次查看 crond 的 PID
66783 //目前 PID 為 66783
# ps |grep busybox //查看此 busybox 的 PID 及執行序
66783 66783 busybox /usr/lib/vmware/busybox/bin/busybox
接著只要排程時間到之後便會開始自動執行備份作業,由於我們有設定將排程執行記錄寫入至「/tmp/mybackup.log」日誌檔中,也可以查看日誌內容確認備份動作是否真的執行,以及是否有寫入至備份設定檔中的指定資料夾內,以下為查看排程備份的日誌檔 /tmp/ mybackup.log 內容:
# cat /tmp/mybackup.log //查看備份記錄檔內容
Logging output to "/tmp/ghettoVCB-2012-11-25_20-00-01.log" ...
2012-11-25 20:00:02 -- info: ===== ghettoVCB LOG START =====
2012-11-25 20:00:02 -- info: CONFIG - /tmp/mybackup.conf //備份設定檔名稱
2012-11-25 20:00:02 -- info: CONFIG - VERSION = 2011_11_19_1
2012-11-25 20:00:02 -- info: CONFIG - GHETTOVCB_PID = 69459 //備份執行 Process ID
2012-11-25 20:00:02 -- info: CONFIG - VM_BACKUP_VOLUME = /vmfs/volumes/LocalHDD/BackupVMs
2012-11-25 20:00:02 -- info: CONFIG - VM_BACKUP_ROTATION_COUNT = 5
…略…
2012-11-25 20:00:02 -- info:
2012-11-25 20:00:13 -- info: Initiate backup for CentOS63
2012-11-25 20:00:13 -- info: Creating Snapshot "ghettoVCB-snapshot-2012-11-25" for CentOS63
Destination disk format: VMFS thin-provisioned
Cloning disk '/vmfs/volumes/LocalHDD/CentOS63/CentOS63.vmdk'...
Clone: 100% done.
2012-11-25 20:06:05 -- info: Removing snapshot from CentOS63 ...
2012-11-25 20:06:05 -- info: Backup Duration: 5.87 Minutes //備份時間
2012-11-25 20:06:05 -- info: Successfully completed backup for CentOS63! //備份成功
2012-11-25 20:06:10 -- info: ###### Final status: All VMs backed up OK! ######
2012-11-25 20:06:10 -- info: ===== ghettoVCB LOG END =====
確定排程設定執行成功後,為了使 ESXi 平台主機因更新安全性或者硬體維護必須關機或重新啟動後,排程設定仍然有效因此必須將設定寫入「/etc/rc.local」檔案內才行,請將剛才執行的動作寫入至 /etc/rc.local 檔案中結尾處即可。
# tail -n 3 /etc/rc.local //查看此檔案中最後三行內容
/bin/kill $(cat /var/run/crond.pid)
echo "0 20 * * * /tmp/ghettoVCB.sh -a -g /tmp/mybackup.conf > /tmp/mybackup.log" >> /var/spool/cron/crontabs/root
/usr/lib/vmware/busybox/bin/busybox crond
4、自訂還原設定檔
接著我們來模擬 VM 虛擬主機發生系統損壞的情況,請登入目前正常運作的 VM 虛擬主機(CentOS63)當中,並且刪除 GRUB Boot Loader 開機設定檔 「/boot/grub/grub.conf」後重新開機,來模擬 CentOS 主機發生災難無法開機的情況。
圖 2、模擬 CentOS 作業系統損壞無法順利開機
由於該台 VM 虛擬主機已經無法正常運作,因此可以將此台 VM 虛擬主機進行強制關機(Power Off)之後,我們可以在 vSphere Client 點選該台 VM 虛擬主機,後選擇「Delete from Disk」項目表示將此台 VM 虛擬主機從虛擬化平台管理介面中刪除,並且連同存放於 ESXi 虛擬化平台中儲存資源的相關檔案也一併刪除。
圖 3、刪除無法運作的 VM 虛擬主機
與備份腳本相同的概念,我們可以複製還原 VM 虛擬主機的範本設定檔「ghettoVCB-restore_vm_restore_configuration_template」後,自行設定我們需要還原的設定檔內容,此還原設定檔可以分為三個段落相關還原參數及說明如下:
- DIRECTORY: 存放 VM 虛擬主機備份檔案的路徑。
- DATASTORE_TO_RESTORE_TO: 指定還原至 ESXi Host 的儲存資源 Datastore 路徑。
- DISK_FORMAT_TO_RESTORE: 指定還原 VM 虛擬主機時的虛擬硬碟格式,一共支援四種不同的格式。
- zeroedthick: 1,還原為不需要 Zero Out 初始化的 Lazy Zeroed Thick 虛擬硬碟格式。
- 2gbsparse: 2,還原為 2GB Sparse 虛擬硬碟格式,但是您必須要先手動載入 multiextent module 才行,否則將會發生 The system cannot find the file specified 的錯誤訊息。
- thin: 3,還原為硬碟空間動態成長的 Thin Provisioning 虛擬硬碟格式。
- eagerzeroedthick: 4,還原為需要 Zero Out 初始化並且適用於 Fault Tolerance 進階技術的 Eager Zerod Thick虛擬硬碟格式。
了解還原設定檔的內容設定之後,以下是我們此次實作的還原設定檔內容,將 VM 虛擬主機(CentOS63)的備份檔案,還原到 ESXi 虛擬化平台中本機硬碟的 Datastore「/vmfs/volumes/LocalHDD/」內,並且採用空間動態成長的 Thin Provisioning 虛擬硬碟格式,最後請注意每個段落之間要用「分號(;)」隔開並且前後使用「雙引號」進行包覆的動作。
# cd /vmfs/volumes/LocalHDD/BackupVMs/ //切換至備份設定檔存放路徑
# cat myrestore.conf //查看備份設定檔內容
"/vmfs/volumes/LocalHDD/BackupVMs/CentOS63/CentOS63-2012-11-25_12-50-01;/vmfs/volumes/LocalHDD/;3"
5、還原 VM 虛擬主機
在開始執行還原作業以前,由於我們此次實作採用的是最新版本的 VMware vSphere ESXi 5.1 虛擬化平台,而自動化還原腳本 ghettoVCB-restore.sh 因為內容中有判斷虛擬化平台版本的機制,但是因為腳本作者還來不及更新版本判斷機制內容,因此我們可以手動修改內容加上判斷機制,否則屆時當您在執行還原腳本時將會發生「You're not running ESX(i)3.5, 4.x, 5.x!」的錯誤訊息,並且還原作業會中斷執行,請修改還原腳本 ghettoVCB-restore.sh 中第 87 行處加上 ESXi 5.1 版本的判斷機制 「|| [[ "${ESX_VERSION}" == "5.1.0" ]]」內容即可。修改前
if [[ "${ESX_VERSION}" == "5.0.0" ]]; then
修改後
if [[ "${ESX_VERSION}" == "5.0.0" ]] || [[ "${ESX_VERSION}" == "5.1.0" ]]; then
此外由於最新版本的 VMware vSphere ESXi 5.1 虛擬化平台當中,已經將內建指令「/bin/whoami」移除掉,而自動化還原腳本 ghettoVCB-restore.sh 因為內容中有判斷執行者身份的驗證機制 (安全性考量),因此我們也要修改這個部份後才能順利執行還原作業,否則將會發生「ERROR: This script needs to be executed by "root"!」的錯誤訊息,請修改還原腳本 ghettoVCB-restore.sh 中第 389行處加上身份判斷機制,將原本的「`whoami`」置換成「`who | awk '{print $1}'`」內容即可。
修改前
if [ ! "`whoami`" == "root" ]; then
修改後
if [ ! "`who | awk '{print $1}'`" == "root" ]; then
接著便可以使用還原腳本執行檔「ghettoVCB-restore.sh」配合還原設定檔來進行備份作業,下列為搭配還原腳本執行檔使用的參數說明:
- -c: 指定還原設定檔,將會還原設定檔中所有條列的 VM 虛擬主機。
- -l: 指定日誌檔,手動指定備份日誌檔建立路徑。
- -d: 除錯及模擬運行模式,配合二個參數值 dryrun / debug 使用。
了解還原腳本執行檔搭配參數後我們便可以執行還原作業,請先切換至存放還原腳本執行檔及還原設定檔的路徑 「/vmfs/volumes/LocalHDD/BackupVMs」,接著配合參數「-c」讀取自訂的備份設定檔 「myrestore.conf」,以下為備份作業執行過程:
# cd /vmfs/volumes/LocalHDD/BackupVMs/ //切換至還原腳本及設定檔路徑
# ./ghettoVCB-restore.sh -c myrestore.conf //執行 VM 虛擬主機還原作業
##### Restoring VM: CentOS63 #####
Start time: Sun Nov 25 13:52:39 UTC 2012
Restoring VM from: "/vmfs/volumes/LocalHDD/BackupVMs/CentOS63/CentOS63-2012-11-25_12-50-01"
Restoring VM to Datastore: "/vmfs/volumes/LocalHDD/" using Disk Format: "thin"
Creating VM directory: "/vmfs/volumes/LocalHDD//CentOS63-2012-11-25_12-50-01" ...
Copying "CentOS63.vmx" file ...
Restoring VM's VMDK(s)...
Updating VMDK entry in "CentOS63.vmx" file ...
Destination disk format: VMFS thin-provisioned
Cloning disk '/vmfs/volumes/LocalHDD/BackupVMs/CentOS63/CentOS63-2012-11-25_12-50-01/CentOS63.vmdk'...
Clone: 100% done.
Registering CentOS63 ...
End time: Sun Nov 25 13:58:37 UTC 2012
##### Completed restore for CentOS63! ##### //還原作業成功
Start time: Sun Nov 25 13:52:39 UTC 2012
End time: Sun Nov 25 13:58:37 UTC 2012
Duration : 5.97 Minutes //還原作業花費時間
------------------------------------------------------------------
完成還原作業之後,還原腳本還會自動幫您註冊該台 VM 虛擬主機(Register virtual machine)到 ESXi 虛擬化平台的 Inventory 當中,當您嘗試將該 VM 虛擬主機進行開機時(Power On),您會發現運作程序進度卡在「95 %」不動,當您開啟虛擬主機 Console 畫面時會看虛擬主機訊息視窗,要您選擇三個項目「Cancel、I moved it、I copied it」其中一個才能繼續開機程序,而這三個項目之間到底有什麼差異。
在談這個問題以前必須要先了解什麼是 UUID(Universally Unique IDentifier),它是每台 VM 虛擬主機都會有的一個唯一 128 bit Integer,並且儲存在 VM 虛擬主機設定檔 .vmx 當中的 uuid.bios 及 uuid.location 欄位中。
當您選擇了「I moved it」項目來啟動 VM 虛擬主機時,其 uuid.bios 欄位中的 UUID 值不會改變,但是 uuid.location 欄位中的 UUID 值將會改變。若是您選擇了「I copied it」項目來啟動 VM 虛擬主機時,則 uuid.bios 及 uuid.location 欄位中的 UUID 值都會改變。
簡單來說如果您希望還原後的 VM 虛擬主機保持「原來的 MAC Address」的話,請您選擇 I moved it 項目來啟動 VM 虛擬主機,若選擇了 I copied it 項目則還原後的 VM 虛擬主機其 MAC Address 將會改變,此舉有可能會造成 VM 虛擬主機雖然啟動成功,但是因為網路政策的關系導致無法順利服務(詳細資訊請參考 VMware KB 1541)。
圖 4、嘗試 Power On 虛擬主機時進度卡在 95 % 不動
決定好是否更改 VM 虛擬主機的 UUID 的選項之後,便可以順利將 VM 虛擬主機進行啟動,並且繼續原本的線上服務。
圖 5、VM 虛擬主機復原完成並且繼續原本的線上服務
6、手動還原 VM 虛擬主機(Add to Inventory)
如果您覺得上述所說明的還原腳本執行檔 ghettoVCB-restore.sh 前置作業太過麻煩,因為必須要修改還原腳本的 ESXi 版本判斷以及身份驗證等內容才得以運作,您其實可以自行手動加入的方式來執行還原作業,您可以 SSH 遠端登入 ESXi 虛擬化平台執行檔案複製作業,或者使用 vSphere Client 所提供的 Datastore Browser 功能,將先前所備份的 VM 虛擬主機檔案複製到 ESXi Datastore 儲存資源當中。# mkdir /vmfs/volumes/LocalHDD/CentOS63 //切換至 Datastore 建立資料夾
# cd /vmfs/volumes/LocalHDD/BackupVMs/CentOS63/CentOS63-2012-11-25_12-50-01 //切換至備份路徑
# cp * /vmfs/volumes/LocalHDD/CentOS63/ //複製備份檔案至還原資料夾
圖 6、使用 vSphere Client 所提供的 Datastore Browser 功能執行檔案複製作業
當 VM 虛擬主機備份檔案複製作業完成後,請開啟 ESXi 虛擬化平台上的 Datastore Browser,切換到 「CentOS63」 資料夾內點選虛擬主機設定檔案「CentOS63.vmx」後,按下滑鼠右鍵選擇「Add to Inventory」,也就是以手動的方式將該 VM 虛擬主機增加至 ESXi 虛擬化平台管理介面中,與此同時將出現新增虛擬主機精靈。
圖 7、準備新增 VM 虛擬主機至 ESXi 虛擬化平台 Inventory 當中
(1) Name: 虛擬主機名稱
將此虛擬主機新增至 ESXi 虛擬化平台上所顯示的名稱,若此名稱與先前備份時「不同」,則屆時此台 VM 虛擬主機的 「MAC Address」 將會改變,若名稱相同則 MAC Address 維持不變,為了使 VM 虛擬主機還原後能快速上線服務,避免還要等待網路交換器更新 MAC Address Table 或套用網路政策…等動作,因此保持原來 VM 虛擬主機名稱「CentOS63」,確定後按下「Next」進入下個新增程序。
圖 8、決定 VM 虛擬主機名稱
(2) Resource Pool: 運算資源池
因為我們此次實作的 ESXi 虛擬化平台環境中,只有單台 ESXi 主機可供選擇,因此請選擇 esxi51.weithenn.org 主機後,按下「Next」進入下個新增程序。
圖 9、選擇 VM 虛擬主機要運行在哪台 ESXi 主機上
(3) Ready to Complete: 新增完成
確定無誤後按下「Finish」即開始進行將虛擬主機註冊(Register)至 ESXi 虛擬化平台上。當 vSphere Client 中的「Recent Tasks」區塊中的狀態列「Status」,顯示為完成時「Completed」表示虛擬主機註冊作業完成,此時便可將虛擬主機開機並測試是否運作正常。
圖 10、註冊 VM 虛擬主機至 ESXi 虛擬化平台上
7、結語
在目前商用市場上雖然已經有各種不同針對 VMware vSphere 虛擬化平台的備份軟體問市,然而對於 IT 預算本來就不高的中小企業或學校單位來說,仍然需要一筆可觀的費用,因為各種備份軟體計價方式大不相同,有的採用實體主機 CPU Socket 數量計價,有的則以 VM 虛擬主機數量計價。筆者透過這二篇文章實作及說明由 William Lam 所撰寫的自動化 備份/還原 腳本,您可以輕鬆達成線上備份運作中的 VM 虛擬主機且服務不中斷,以及當 VM 虛擬主機發生故障損壞情況時,您可以在最短時間之內快速復原後讓 VM 虛擬主機重新上線服務,更重要的是這樣的備份還原解決方案即使您使用的是免費版本的 VMware vSphere Hypervisor 也完全可以運作。