天天看點

通過Hyper-V批量快速複制實驗虛拟機的實踐思路

    很久沒有更新部落格了,當然一部分原因源于休假後帶來懶惰的慣性,更主要的原因是由于工作需要,最近一段一直在閉關設計和研究新一期活動的内容和方式并完成了其中一些關鍵部分的腳本;這其中一個很重要的部分就是架構和設計虛拟實驗室的前背景工作。 

  今天,通過這個部落格分享一個針對我們的虛拟實驗室中必須攻克和解決的一個技術難題及如何設計并解決的,希望對你也有所啟發。  

  (具體的項目設計相對比較複雜,其中的技術部分涉及了虛拟網絡隔離設計、存儲系統、并發遠端連接配接桌面、自動化部署,前背景等諸多部分,這裡僅就存儲一個子單元中的一個環節展開)  

   我們的實驗考慮到需要通過自動化批量部署方式将初始化的實驗環境部署到後端若幹套Hyper-V的伺服器虛拟化平台,這裡以一個教育訓練完整的實驗環境源VHD加上差異盤快照avhd需要300G計算;單就一套完全自包含的環境進行導入導出是很簡單的,通過Powershell的導出和導入CMDLETS就可以輕松的解決,不過試想一下,像我們的實驗平台單就一個自包含的實驗環境就有300GB之巨,如果在伺服器端跑10個左右的這樣的環境,其初期部署規模就會上升到接近3TB,顯然這種方式空間占用和部署時的導入速度都會變得不太能接受的。  

   有沒有什麼更好的方法呢? 

   在前期我就考慮到,是不是可以采用差異磁盤減少空間的投入和部署的時間,但是新的問題接踵而來,如果采用差異磁盤的是需要重新建立虛拟機的,這樣對于每套獨立的環境就需要在後期腳本中恢複其中的配置,這個複雜度就很高了。  

  最終,經過思考和測試,找到了一個解決方案,其大緻思路是這樣的:  

  我将上述一個實驗的環境修改為5個完整的源全量虛拟磁盤vhd分别對應5個快照磁盤avhd或差異磁盤,為什麼是這樣?在看完了這個實踐過程,相信你就清楚了:)

  貌似如果需要制作10套環境按照這種做法不但不會節省什麼空間,反而顯得畫蛇添足而且空間還多了這顯然得不償失,不過這時候就要發揮OS自帶的MKlink的作用了,而且速度會非常有優勢,怎麼做呢?其實說來簡單,全量磁盤和差異磁盤時有父級别關聯關系的,下面拿個測試環境看看:  

  通過Powershell,也可以看到:

   如果導出配置了差異磁盤的虛拟機會是神馬情況呢?我們測試一下看看:  

   目測一下都導出哪些東東?Hyper-V虛拟機的導出了3個目錄,一個快照目錄,一個磁盤目錄還有一個是虛拟機配置檔案目錄的XML用于導入。    

<a href="http://3387405.blog.51cto.com/attachment/201304/11/3377405_13656479868w2m.png"></a>

    磁盤目錄中包含了全量的父磁盤win2008r2-30G.vhd以及差異磁盤cdltmg.vhd,對于我們要做的就是想個辦法繞開拷貝10次父磁盤,記住“重角雖多一麟足矣“!”戲份“開始了:) 

  我們要做的就是把這個父磁盤單獨放置到一個目錄中,例如将父磁盤單獨移動到父目錄下的Parent目錄, 這樣在導出目錄的虛拟磁盤目錄下僅保留了差異磁盤部分; 那麼要生成10套同樣的實驗虛拟機環境?呵呵,拷貝10次Export目錄就好了!拷貝時間空間都得到了保障(因為我們僅僅拷貝差異磁盤就可以了);當然還有個2個前提條件是不得不說的:   

   1. 因為差異磁盤系統在啟動時都需要讀母盤,是以并發讀的壓力在磁盤系統是很大的,是以即便可以複制的虛拟機越多越節省空間,我們也不能無限制的複制,我的環境因為采用SSD做CacheCade,是以做了10個差異磁盤的環境。 

  2. 在我的環境中用于拷貝的虛拟環境可以是相同的(主機名,IP位址等),因為處于實驗目的我隻需部署同樣環境給做實驗的使用者就可以了,再導入虛拟機的時候我會在原地導入并且制定每個虛拟機一個自己獨立的Private虛拟交換就可以,但實際環境如果做類似操作,好需要設計如何将拷貝出的虛拟機環境導入需要重新配置主機名和IP位址等因素。 

 好了,現在看看我的測試的基礎用例,後期的腳本都是基于這個實驗作為藍本開發的。 

    接下來有兩種分支實作方式:

    a) 對拷貝後的目錄制作父磁盤制作符号連結,這裡需要用到一個系統自帶的MKlink的工具:

    我們需要在拷貝出來的目錄的虛拟機磁盤位置建立源父磁盤的符号連結并指向父目錄下的Parent目錄中的全量父盤

<a href="http://3387405.blog.51cto.com/attachment/201304/11/3377405_1365647991zdY3.png"></a>

  在GUI界面中,也可以看到該符号連結檔案,注意觀察一下它的大小你就知道為什麼我們要這麼搞了:)

<a href="http://3387405.blog.51cto.com/attachment/201304/11/3377405_1365647994k1fM.png"></a>

    b) 利用Hyper-V修複磁盤工具方式或者WMI(WMI的方式是我們後期通過腳本或C#解決的這裡暫不讨論) 

 指定拷貝的導出目錄中的差異虛拟磁盤   

<a href="http://3387405.blog.51cto.com/attachment/201304/11/3377405_1365647997IDwg.png"></a>

 系統提示該差異磁盤的父磁盤連接配接丢失,當然因為我們統一将父磁盤放到了Parent目錄,是以我們需要點選重新連接配接    

 指定Parent目錄中的父磁盤,并選擇重新連接配接及完成連接配接後的效果   

<a href="http://3387405.blog.51cto.com/attachment/201304/11/3377405_1365648001y9nI.png"></a>

<a href="http://3387405.blog.51cto.com/attachment/201304/11/3377405_1365648006lGfI.png"></a>

   好了,完成了分支步驟中的任意一個,接下來還有個難題,這些被複制的虛拟機都有一個統一的虛拟機Global ID,是以這将會造成為了導入批量拷貝的虛拟機被Hyper-V認為是同一個虛拟機而拒絕導入的錯誤! 

<a href="http://3387405.blog.51cto.com/attachment/201304/11/3377405_1365648008Vi2e.png"></a>

    是以,又一個小Trick必須登場了,我們都知道這個虛拟機的UUID及虛拟機名稱都儲存在了導出時産生在Virtual Machine的XML檔案中,是以我們需要分析這個檔案格式并作出差異化的改變就可以完成導入了,再實際項目中采用了腳本完成了對XML檔案的Parse和修改,這裡給出一個示例,隻需要修改這三個位置就可以啦!分别是: 

Configuration-&gt;Properties-&gt;global_id (修改虛拟機唯一ID) 

Configuration-&gt;Properties-&gt;name (修改導入虛拟機的名稱)   

Settings-&gt;Global-&gt;logical_id (修改虛拟機唯一ID)  

 4. OK,都修改完了,最後一公裡的工作就是導入虛拟機了。看看是否符合預期?這一步我偷了點懶,沒有把整個導入過程截圖, 導入方式大緻說明一下, 隻需要選擇在原地導入并注冊新的虛拟機ID就可以了,導入簡直就是瞬間完成的!(為什麼速度這麼快,并且不需要選擇複制虛拟機并選擇注冊新的虛拟機ID呢?聰明的你一一定知道答案了) 

  現在看下面的效果圖,一個通過快速複制方式産生的虛拟機已經成功部署上了:-)(如果需要批量部署如法炮制上述方式就可以了。其實上述方法還有個變種,那就是根據需要直接産生差異磁盤,除了結合上述修改過的虛拟機環境,還需要修改每個虛拟機環境的每個磁盤重新指定為産生的差異磁盤,然後一并複制後導入即可。這種方式對于沒有差異磁盤的基礎環境是必不可少的!) 

<a href="http://3387405.blog.51cto.com/attachment/201304/11/3377405_1365648012rU4i.png"></a>

寫在最後

  其實費勁周折完成的這件事情僅僅是針對我具體搭建的一個具有特殊性的快速部署實驗環境用例所做的設計,在真實的項目裡面考慮還是通過一個由sysprep的系統VM作為源點,利用很成熟的System Center技術建構服務模闆并定制化完成; 但不得不說的現階段是針對有些特殊的環境需求,有時候變通一些的做法也同樣可以起到事半功倍的效果!這裡并沒有給出我們最後具體實作的腳本, 其實我感覺在其中遇到的問題和解決的思路好像更有意義一些, 呵呵!

HTH, Hope This Help :-)

本文轉自 翟老貓 51CTO部落格,原文連結:http://blog.51cto.com/3387405/1175886,如需轉載請自行聯系原作者