網管人雜誌
本文刊載於 網管人雜誌第 77 期 - 2012 年 6 月 1 日出刊,NetAdmin 網管人雜誌 為一本介紹 Trend Learning 趨勢觀念、Solution Learning 解決方案、Technology Learning 技術應用的雜誌,下列筆記為本站投稿網管人雜誌獲得刊登的文章,網管人雜誌於每月份 1 日出刊您可於各大書店中看到它或透過下列圖示連結至博客來網路書店訂閱它。文章目錄
1、前言2、實作環境
3、SSH 遠端管理 ESX 虛擬化平台
4、查詢 VM 虛擬主機運作狀態
5、備份單台 VM 虛擬主機 (vcbMounter)
6、同時備份多台 VM 虛擬主機 (vcbSnapAll)
7、還原 VM 虛擬主機 (vcbRestore)
8、排程自動備份 VM 虛擬主機
9、結語
1、前言
在前一篇文章中雖然可以透過離線備份的方式,將 VM 虛擬主機進行匯出備份的動作,但是這樣的備份方式有二個非常大的缺點,首先是 VM 虛擬主機必須為關機狀態才能執行備份作業,另一個缺點則是若要一次備份多台虛擬主機時,無法一次全部備份而必須要單台執行,這樣的備份方式對於企業營運中不重要的服務或者是測試機還能接受,但若是對於企業營運環境必須保持服務不中斷的理念來說,此備份方式就不符合需求了。
因此本篇將實作利用 ESX 虛擬化平台中,內建的 vcbMounter 及 vcbRestore 指令,呼叫 VCB (VMware Consolidated Backup) 及快照 (Snapshot) 機制,為運作中的 VM 虛擬主機進行線上備份作業 (備份對象可以是 開機、關機、暫停 的虛擬主機!!),最後則是分享筆者所撰寫的自動排程備份 Script,以達成自動定期備份 VM 虛擬主機的目的,使得 IT 預算吃緊的中小企業管理人員,能夠享受到虛擬化技術所帶來的好處,同時又不用擔心 VM 虛擬主機備份還原的問題。
在 ESX 虛擬化平台中內建的備份機制為 VCB (新版 ESXi 虛擬化平台則為 vStorage API),它的運作方式為透過 ESX 虛擬化平台的快照機制,為 VM 虛擬主機的虛擬磁碟 (.vmdk) 製作一份快照複本,若有搭配第三方備份軟體的話則可以將複製的快照複本,掛載到一台獨立的備份代理伺服器(Backup Proxy Server)上,接著將備份檔案進行備份到儲存設備或者磁帶機中 (如圖 1 所示)。
圖1、VCB (VMware Consolidated Backup) 備份機制示意圖
當啟動 ESX 虛擬化平台的快照機制時,ESX Host 會採用 Pre-Backup Script 機制,將 VM 虛擬主機對虛擬磁碟 (.vmdk) 寫入的權限關閉,以暫停資料寫入的動作,接著進行虛擬磁碟快照機制,此時若 VM 虛擬主機需要進行資料寫入的動作時,會將快照建立期間的資料寫入至 .redo (Redo bitmap files) 暫存檔案中,等到快照檔案建立完畢後,會先將儲存於 .redo 暫存檔案中的資料內容回寫到虛擬磁碟 (.vmdk) 中,接著重新開放讓 VM 虛擬主機可以將資料寫入至虛擬磁碟 (.vmdk),最後執行 Post-Backup Script 機制使 VM 虛擬主機繼續運作 (如圖 2 所示)。
圖2、VCB 快照 (Snapshot) 機制示意圖
2、實作環境
- 虛擬化技術平台: VMware vSphere ESX 4.1.0 (Build Number 260247)
- 虛擬主機作業系統 (Guest OS): CentOS 6.2 (32bit)
- 連線管理軟體: vSphere Client 4.1.0 (Build Number 258902)
- VMware Consolidated Backup: Virtual Machine Mount Utility Version 4.0.0 (build-260247)
3、SSH 遠端管理 ESX 虛擬化平台
因為VCB備份指令 vcbMounter 及 vcbRestore,必須於 COS (Service Console) 上執行才能運作,並無法透過 vSphere Client 連線管理軟體執行,但是若在 ESX 虛擬化平台本機 Console 上敲指令的話,則又失去了管理主機的彈性,所以我們可以使用 SSH 遠端登入的方式,來進行管理 ESX 虛擬化平台,如果您使用其它管理者帳號會發現可以順利登入 ESX Host (請確認主機 SSH 服務已啟動 !!)。
但是,若使用預設的超級管理者帳號 root,那麼您將會發現無法 SSH 遠端登入 ESX 虛擬化平台,原因是 ESX 虛擬化平台為了減少被密碼暴力攻擊的風險 (主機安全性考量 !!),雖然預設情況下 SSH 服務會啟動,而 IPTables 防火牆也開放遠端連線本機 Port 22,但是並不允許 root 管理者帳號可以直接登入,因為若預設開放 root 管理者帳號可以 SSH 遠端登入,那麼當 ESX 虛擬化平台只要網路狀態連通後,那麼主機便已經暴露在被攻擊的危險當中 (因為帳號已經知道了,剩下就只是猜密碼而以)。
但是,若使用預設的超級管理者帳號 root,那麼您將會發現無法 SSH 遠端登入 ESX 虛擬化平台,原因是 ESX 虛擬化平台為了減少被密碼暴力攻擊的風險 (主機安全性考量 !!),雖然預設情況下 SSH 服務會啟動,而 IPTables 防火牆也開放遠端連線本機 Port 22,但是並不允許 root 管理者帳號可以直接登入,因為若預設開放 root 管理者帳號可以 SSH 遠端登入,那麼當 ESX 虛擬化平台只要網路狀態連通後,那麼主機便已經暴露在被攻擊的危險當中 (因為帳號已經知道了,剩下就只是猜密碼而以)。
倘若您仍然希望開啟 root 管理者帳號,能夠具有 SSH 遠端登入 ESX 虛擬化平台的權限,以便遠端執行 vcbMounter 及 vcbRestore 備份指令的話,請您先於 ESX 虛擬化平台本機上使用「Alt + F11」組合鍵,以切換到 Console 指令模式後進行本機登入的動作,接著執行如下指令先將 SSH 設定檔進行備份後,使用 sed 指令將SSH設定檔內容中,「PermitRootLogin no」參數取代為「PermitRootLogin yes」,最後再將 SSH 服務重新啟動即可套用生效,不過筆者在此仍然要強烈建議您調整主機遠端連線安全性設定,例如 僅開放某些 IP 位址能使用 SSH 遠端登入 ESX 平台,以保障您 ESX 虛擬化平台主機安全性。
# cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
# sed -i 's,PermitRootLogin no,PermitRootLogin yes,g' /etc/ssh/sshd_config
# service sshd restart
Stopping sshd: [ OK ]
Starting sshd: [ OK ]
4、查詢 VM 虛擬主機運作狀態
確認能夠 SSH 遠端管理 ESX 虛擬化平台之後,我們可以先利用「vcbVmName」指令,來查詢運作於 ESX 虛擬化平台之上的 VM 虛擬主機狀態,例如 查詢 VM 虛擬主機的 IP 位址、VM虛擬主機名稱、UUID、MoRef …等資訊,當然您也可以在 vSphere Client 操作介面中,查詢到這些 VM 虛擬主機的相關資訊 (如圖 3 所示),因為了解這些資訊之後再稍後執行備份任務操作時,您便可以利用這些查詢到的相關資訊,來指定備份某些 VM 虛擬主機,下列為相關查詢參數的意義說明:
- -h HOST: 執行此指令的 ESX 平台,可以使用Hostname 或 IP Address 或 FQDN。
- -u USERNAME: 執行此指令的使用者名稱 (請注意使用者權限),此例為 weithenn。
- -p PASSWORD: 執行此指令的使用者密碼,此例為 123456。
- -s Status: 顯示指定狀態的 VM 虛擬主機資訊。
- powerstate:on : 顯示狀態為 開機 (Power On) 的 VM 虛擬主機。
- powerstate:off : 顯示狀態為 關機 (Power Off) 的 VM 虛擬主機。
- powerstate:suspended : 顯示狀態為 暫停 (Suspend) 的 VM 虛擬主機。
- any: 顯示 ESX 平台上所有 VM 虛擬主機。
圖3、目前運作於 ESX 虛擬化平台上的 VM 虛擬主機資訊
查詢狀態為「開機(Power On)」的 VM 虛擬主機資訊
下列指令執行後可以查詢到,目前運作在ESX 虛擬化平台中 VM 虛擬主機的名稱為 DB,而 IP 位址為 10.10.25.119,以及 UUID 及 moref 等資訊。
# vcbVmName -h `hostname` -u weithenn -p 123456 -s powerstate:on
[2012-03-15 15:54:26.228 F2D9B6D0 info 'App'] Current working directory: /root
[2012-03-15 15:54:26.248 F2D9B6D0 warning 'App'] Closing Response processing in unexpected state: 3
Found VM:
moref:48
name:DB
uuid:564de954-8dfd-8335-a041-771112c7623e
ipaddr:10.10.25.119
查詢狀態為「關機(Power Off)」的 VM 虛擬主機資訊
下列指令執行後可以查詢到,目前 VM 虛擬主機在 ESX 虛擬化平台中的名稱為 Web,以及 UUID 及 moref 等資訊,並且您可以看到有個 IP address not set 訊息,其實並不是該 VM 虛擬主機沒有設定 IP 位址,而是該 VM 虛擬主機目前關機中,所以 ESX 虛擬化平台無法透過 VMware Tools 去偵測到 VM 虛擬主機的 IP 位址。
# vcbVmName -h `hostname` -u weithenn -p 123456 -s powerstate:off
[2012-03-15 15:55:29.521 F2DB46D0 info 'App'] Current working directory: /root
[2012-03-15 15:55:29.538 F2DB46D0 warning 'App'] Closing Response processing in unexpected state: 3
[2012-03-15 15:55:29.606 F2DB46D0 warning 'vcbVmName'] IP address not set.
Found VM:
moref:64
name:Web
uuid:564d1300-5359-4cbc-8443-13e4dd901e18
ipaddr:
查詢此台 ESX Host 中所有 VM 虛擬主機資訊
輸入下列指令,查尋目前此台 ESX Host 主機中,所有的 VM 虛擬主機資訊。
# vcbVmName -h `hostname` -u weithenn -p 123456 -s any
[2012-03-15 15:55:54.617 F2E216D0 info 'App'] Current working directory: /root
[2012-03-15 15:55:54.635 F2E216D0 warning 'App'] Closing Response processing in unexpected state: 3
Found VM:
moref:48
name:DB
uuid:564de954-8dfd-8335-a041-771112c7623e
ipaddr:10.10.25.119
[2012-03-15 15:55:54.712 F2E216D0 warning 'vcbVmName'] IP address not set.
Found VM:
moref:64
name:Web
uuid:564d1300-5359-4cbc-8443-13e4dd901e18
ipaddr:
5、備份單台 VM 虛擬主機 (vcbMounter)
接著我們可以利用「vcbMounter」指令,配合剛才所查詢到的相關參數,來指定備份某台 VM 虛擬主機,您可以將執行備份動作後的檔案存放到,與 ESX 虛擬化平台所能連接到的儲存設備中 (例如 FC-SAN、iSCSI、NFS、LocalHDD),本次實作為將備份後的檔案存放到 ESX 虛擬化平台本機硬碟中,下列為相關備份參數的意義說明:-a Type: 要備份 VM 虛擬主機所採用的資訊欄位。
- ipaddr: 當 VM 虛擬主機已經安裝 VMware Tools,並且為開機狀態下此參數值才會有作用 (因為必須要 ESX Host 能偵測得到)。
- name: VM 虛擬主機在 ESX Host 上的使用名稱,使用 vSphere Client 切換至 Inventory 模式即可看到。
- uuid: VM 虛擬主機在 ESX Host 上使用的 UUID,使用 vSphere Client 切換至 Virtual Machines 頁籤也可看到。
- moref: VM 虛擬主機在 ESX Host 上使用的代號,為 Managed Object References 的縮寫也是 ESX 標示 VM 的一種作法。
-r PATH: 要將 VM 虛擬主機備份到哪個儲存資源路徑中,建議使用絕對路徑進行備份作業。
在執行以前您不用事先建立存放備份檔案的空資料夾,因為在備份作業執行過程中會自動建立,若已經事先建立空資料夾的話當執行備份作業時,便會發生「Error: Mount point already exists.」的錯誤訊息,下列備份指令為將 ESX 虛擬化平台中名稱為「DB」的 VM 虛擬主機進行備份,執行此備份作業的管理帳號為「weithenn」而密碼為「123456」,並且指定將備份檔案存放至「/vmfs/volumes/LocalHDD」儲存資源中的「DB_VM_Backup」資料夾內。
# vcbMounter -h localhost -u weithenn -p 123456 -a name:DB -r /vmfs/volumes/LocalHDD/DB_VM_Backup
[2012-03-15 16:03:58.601 F2E1A6D0 info 'App'] Current working directory: /root
[2012-03-15 16:03:58.620 F2E1A6D0 warning 'App'] Closing Response processing in unexpected state: 3
Copying "[LocalHDD] DB/DB.vmx":
0%=====================50%====================100%
**************************************************
Copying "[LocalHDD] DB/DB.nvram":
0%=====================50%====================100%
**************************************************
Copying "[LocalHDD] DB/vmware.log":
0%=====================50%====================100%
**************************************************
Converting "/vmfs/volumes/LocalHDD/DB_VM_Backup/scsi0-0-0-DB.vmdk" (compact file):
0%=====================50%====================100%
**************************************************
如圖 4 所示當您執行 vcbMounter 備份指令時,您可以同步切換到 vSphere Client 操作畫面,查看 Recent Task 區塊中目前的任務狀態執行情況,您可以看到在備份任務執行時會建立 VM 虛擬主機快照 (Create virtual machine snapshot),而當備份任務結束時則會移除 VM 虛擬主機快照 (Remove snapshot)。
圖4、執行 vcbMounter 備份作業前後,將會建立及移除VM 虛擬主機快照
6、同時備份多台 VM 虛擬主機 (vcbSnapAll)
剛才我們使用「vcbMounter」指令來備份單一台VM 虛擬主機,若想要一次備份多台 VM 虛擬主機的話該如何達成? 您可以使用「vcbSnapAll」指令配合 VM 虛擬主機狀態即可,例如 使用 「powerstate:on」 狀態來一次備份,所有運作於 ESX 虛擬化平台上「開機中」的 VM 虛擬主機,或者使用「any」狀態來一次備份所有運作於 ESX 虛擬化平台上的 VM 虛擬主機。下列備份指令為將此台 ESX 虛擬化平台中,所有 VM 虛擬主機 (不管是 開機、關機、暫停 狀態) 進行備份,執行此備份作業的管理帳號為「weithenn」而密碼為「123456」,將備份檔案存放至「/vmfs/volumes/LocalHDD」儲存資源中的「All_VM_Backup」資料夾內,並且當備份作業完成後您可以至「/var/log/vmware/vcbSnapAll-6939」,查看備份記錄 (Log) 內容,由備份記錄中您可以發現其實 vcbSnapAll 指令,是組合 vcbMounter 指令來達成一次備份多台 VM 虛擬主機的任務。
# vcbSnapAll -h `hostname` -u weithenn -p 123456 -a any -r /vmfs/volumes/LocalHDD/All_VM_Backup
Backing up 2 matching VMs.
Per VM log files will be in /var/log/vmware/vcbSnapAll-6939.
Thu Mar 15 16:30:08 CST 2012: Exporting VM DB...SUCCEEDED
Thu Mar 15 16:32:33 CST 2012: Exporting VM Web...SUCCEEDED
==================================================
Backup start time: Thu Mar 15 16:30:08 CST 2012
Backup end time : Thu Mar 15 16:34:48 CST 2012
Total number of VMs processed: 2
Number of VMs backed up successfully: 2
Number of VMS failed: 0
For per-VM logs, see directory /var/log/vmware/vcbSnapAll-6939.
==================================================
# cd /var/log/vmware/vcbSnapAll-6939
# ls
DB-ok Web-ok
# cat DB-ok
[2012-03-15 16:30:08.776 F2DDF6D0 info 'App'] Current working directory: /var/log/vmware/vcbSnapAll-6262
[2012-03-15 16:30:08.794 F2DDF6D0 warning 'App'] Closing Response processing in unexpected state: 3
Copying "[LocalHDD] DB/DB.vmx":
0%=====================50%====================100%
**************************************************
Copying "[LocalHDD] DB/DB.nvram":
0%=====================50%====================100%
**************************************************
Copying "[LocalHDD] DB/vmware.log":
0%=====================50%====================100%
**************************************************
Converting "/vmfs/volumes/LocalHDD/VM2_Backup/DB/scsi0-0-0-DB.vmdk" (compact file):
0%=====================50%====================100%
**************************************************
# cat Web-ok
[2012-03-15 16:32:33.774 F2DAF6D0 info 'App'] Current working directory: /var/log/vmware/vcbSnapAll-6262
[2012-03-15 16:32:33.792 F2DAF6D0 warning 'App'] Closing Response processing in unexpected state: 3
Copying "[LocalHDD] Web/Web.vmx":
0%=====================50%====================100%
**************************************************
Converting "/vmfs/volumes/LocalHDD/VM2_Backup/Web/scsi0-0-0-Web.vmdk" (compact file):
0%=====================50%====================100%
**************************************************
同樣的如圖 5 所示當您執行 vcbSnapAll 備份指令時,可以同步切換到 vSphere Client 操作畫面,查看 Recent Task 區塊中目前的任務狀態,您同樣可以看到在備份任務執行 前/後,會看到 VM 虛擬主機快照的建立及移除等動作,證明 vcbSnapAll 備份指令其實底層運作還是交由 vcbMounter 執行實際備份任務。
圖5、vcbSnapAll 備份指令其底層運作仍交由 vcbMounter 執行
7、還原 VM 虛擬主機 (vcbRestore)
備份機制不管多麼簡單,或是備份後的檔案空間佔用極少,如果當災難發生時無法順利將備份進行還原的話,那麼一切只是白費功夫而已,接下來我們進行驗證剛才使用 vcbMounter 以及 vcbSnapAll 備份指令所備份的 VM 虛擬主機,是否真的可以正確無誤的進行還原,並且VM 虛擬主機還原後是否能順利啟動運作以上線服務。假設名稱為 DB 的 VM 虛擬主機其作業系統崩潰無法正常運作,首先請將該台 VM 虛擬主機強制關機 (Power Off) 後,使用 vSphere Client 於操作介面中刪除該台 VM 虛擬主機 (包括 Datastore 儲存資源中的資料夾,避免還原後發生資料夾名稱衝突),接著使用「vcbRestore」還原指令,將先前使用 vcbMounter 或 vcbSnapAll備份指令,所備份的 VM 虛擬主機檔案進行還原的動作。
下列還原指令為執行 VM 虛擬主機還原作業,其中管理帳號為「weithenn」而密碼為「123456」,備份檔案則是儲存於「/vmfs/volumes/LocalHDD」路徑中的「DB_VM_Backup」資料夾內。
# vcbRestore -h localhost -u weithenn -p 123456 -s /vmfs/volumes/LocalHDD/DB_VM_Backup
[2012-03-15 16:43:01.907 F2E556D0 info 'App'] Current working directory: /root
[2012-03-15 16:43:01.927 F2E556D0 warning 'App'] Closing Response processing in unexpected state: 3
Converting "/vmfs/volumes/LocalHDD/DB/DB.vmdk" (VMFS (flat)):
0%=====================50%====================100%
**************************************************
如圖 6 所示當您執行 vcbRestore 還原指令時,一樣可以切換至 vSphere Client 操作畫面,查看 Recent Task 區塊中目前的任務狀態,您可以看到當還原作業完成後會自動執行註冊 VM 虛擬主機的動作 (Register virtual machine),也就是將該台 VM 虛擬主機進行,Add to Inventory 到 ESX 虛擬化平台上的動作,最後在重新設定虛擬主機 (Reconfigure virtual machine) 的環境,接著您就可以把 VM 虛擬主機開機上線服務了!!
圖6、vcbRestore 還原指令時觀察 Recent Task 任務狀態
8、排程自動備份 VM 虛擬主機
當確認 VM 虛擬主機的備份及還原作業成功執行後,我們便可以利用 ESX 虛擬化平台中 COS 的特性 (Linux 作業系統),來撰寫自動化執行腳本 Script 並且配合系統排程作業,以達成自動化備份 VM 虛擬主機的目的,而我們日後只要定期查看備份記錄 (Log) 即可。下列為自動化執行腳本 Script 「/etc/cron.daily/backup_vm.sh」內容,請於建立後存放至 「/etc/cron.daily」 目錄內,並且設定檔案權限為 「755」屆時即可「每天」凌晨自動執行,若您希望執行的單位是「每週」,請將自動化執行腳本存放於「/etc/weekly」資料夾中,若是希望執行的單位是「每月」,請將自動化執行腳本存放於「/etc/monthly」資料夾中,至於自動化執行腳本執行的詳細時間點,請參考 /etc/crontab 檔案內容便可了解相關系統排程執行時間。
此自動化執行腳本的運作流程為「每天凌晨4 點 2 分」,自動執行 VM 虛擬主機備份作業,存放備份檔案的儲存資源為 iSCSI 儲存設備,其路徑為「/vmfs/volumes/iSCSI-Target」,當備份作業執行前會先檢查儲存資源中「資料夾數量」,也就是備份資料夾數量是否有超過「30 個」,若有的話會進行刪除 (避免儲存空間被塞爆!!),執行備份指令的管理帳號為「weithenn」而密碼為「123456」進行備份作業,當備份作業開始執行時會先建立以「當天日期命名的空資料夾」後,才接著進行備份作業並建立以 VM 虛擬主機名稱命名的資料夾,並且存放相關備份檔案。
#!/bin/sh
#$Id: backup_vm.sh, v0.1 2011/3/25 Weithenn Exp $
#Using vcbSnapAll backup VM on the ESX host
TODAY=`date +%Y%m%d`
USER="weithenn"
PASSWORD="123456"
BACKUP_FOLDER="/vmfs/volumes/iSCSI-Target"
KEEPN="30"
if [ -d ${BACKUP_FOLDER} ]; then
cd ${BACKUP_FOLDER}
N=`ls -1|grep -e '[0-9]'|wc -l`
if [ ${N} -gt ${KEEPN} ]; then
echo "Removing Stale VMs Backup..."
ls -1 | grep -e '[0-9]'|sort -nr|tail -`expr ${N} - ${KEEPN}` | xargs rm -r
echo "Finished"
fi
echo "Starting VMs Backup..."
mkdir -p ${BACKUP_FOLDER}/${TODAY}
vcbSnapAll -h `hostname` -u ${USER} -p ${PASSWORD} -a any -r
${BACKUP_FOLDER}/${TODAY}
else
echo "Backup Folder ${BACKUP_FOLDER} does not exist!!"
exit 1
fi
當然自動化執行腳本建立完成後,您可以先嘗試手動執行看看是否能順利運作完成備份任務,以下為自動化腳本手動執行時產生的相關訊息:
# /etc/cron.daily/backup_vm.sh //執行自動化備份腳本
Removing Stale VMs Backup... //清除舊的備份資料
Finished
Starting VMs Backup... //開始進行備份作業
Backing up 2 matching VMs. //總共備份二個 VM
Per VM log files will be in /var/log/vmware/vcbSnapAll-2975. //記錄檔路徑
Mon Mar 19 07:46:47 CST 2012: Exporting VM Web...SUCCEEDED //備份 VM (Web) 成功
Mon Mar 19 07:49:06 CST 2012: Exporting VM DB...SUCCEEDED //備份 VM (DB) 成功
========================================================
Backup start time: Mon Mar 19 07:46:47 CST 2012 //備份開始時間
Backup end time : Mon Mar 19 07:51:26 CST 2012 //備份結束時間
Total number of VMs processed: 2
Number of VMs backed up successfully: 2
Number of VMS failed: 0
For per-VM logs, see directory /var/log/vmware/vcbSnapAll-2975.
========================================================
9、結語
透過本文的介紹,相信讀者應該可以體會到如何利用內建的vcbMounter 及 vcbRestore指令,來輕鬆針對運作於 ESX 虛擬化平台上的 VM 虛擬主機,進行線上備份及還原等作業,最後在搭配自動化執行腳本,配合 COS 系統排程的設定達成自動化備份機制,省去了管理人員必須遠端登入手動執行備份指令的麻煩。筆者希望透過這二篇針對 ESX虛擬化平台上 VM 虛擬主機的備份方式,能夠幫助 IT 預算有限的讀者,既不需要購買昂貴的第三方套裝軟體,又可以輕鬆達成線上備份 VM 虛擬主機的目的。