通過Hyper-V批量快速複製實驗虛擬機器的實踐思路

來源:互聯網
上載者:User

    很久沒有更新部落格了,當然一部分原因源於休假後帶來懶惰的慣性,更主要的原因是由於工作需要,最近一段一直在閉關設計和研究新一期活動的內容和方式並完成了其中一些關鍵區段的指令碼;這其中一個很重要的部分就是架構和設計虛擬實驗室的前後台工作。    今天,通過這個部落格分享一個針對我們的虛擬實驗室中必須攻克和解決的一個技術難題及如何設計並解決的,希望對你也有所啟發。     具體的項目設計相對比較複雜,其中的技術部分涉及了虛擬網路隔離設計、儲存系統、並發遠端連線案頭、自動化部署,前後台等諸多部分,這裡僅就儲存一個子單元中的一個環節展開)      我們的實驗考慮到需要通過自動化批量部署方式將初始化的實驗環境部署到後端若干套Hyper-V的伺服器虛擬化平台,這裡以一個培訓完整的實驗環境源VHD加上差異盤快照avhd需要300G計算;單就一套完全自包含的環境進行匯入匯出是很簡單的,通過Powershell的匯出和匯入CMDLETS就可以輕鬆的解決,不過試想一下,像我們的實驗平台單就一個自包含的實驗環境就有300GB之巨,如果在伺服器端跑10個左右的這樣的環境,其初期部署規模就會上升到接近3TB,顯然這種方式空間佔用和部署時的匯入速度都會變得不太能接受的。      有沒有什麼更好的方法呢?    在前期我就考慮到,是不是可以採用差異磁碟減少空間的投入和部署的時間,但是新的問題接踵而來,如果採用差異磁碟的是需要重新建立虛擬機器的,這樣對於每套獨立的環境就需要在後期指令碼中恢複其中的配置,這個複雜度就很高了。     最終,經過思考和測試,找到了一個解決方案,其大致思路是這樣的:     我將上述一個實驗的環境修改為5個完整的源全量虛擬磁碟vhd分別對應5個快照磁碟avhd或差異磁碟,為什麼是這樣?在看完了這個實踐過程,相信你就清楚了:)   貌似如果需要製作10套環境按照這種做法不但不會節省什麼空間,反而顯得畫蛇添足而且空間還多了這顯然得不償失,不過這時候就要發揮OS內建的MKlink的作用了,而且速度會非常有優勢,怎麼做呢?其實說來簡單,全量磁碟和差異磁碟時有父層級關聯關係的,下面拿個測試環境看看:     從介面就可以看出來對包含快照的環境其實是一樣的)   650) this.width=650;" title="image" style="border-left- 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://www.bkjia.com/uploads/allimg/131227/19114a1b-0.png" width="510" height="373" data-pinit="registered" />   通過Powershell,也可以看到:  650) this.width=650;" title="image" style="border-left- 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://www.bkjia.com/uploads/allimg/131227/1911493613-1.png" width="664" height="444" data-pinit="registered" />    如果匯出配置了差異磁碟的虛擬機器會是神馬情況呢?我們測試一下看看:      目測一下都匯出哪些東東?Hyper-V虛擬機器的匯出了3個目錄,一個快照目錄,一個磁碟目錄還有一個是虛擬機器組態檔目錄的XML用於匯入。     650) this.width=650;" title="image" style="border-left- 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://www.bkjia.com/uploads/allimg/131227/1911495262-2.png" width="713" height="524" data-pinit="registered" />    磁碟目錄中包含了全量的父磁碟win2008r2-30G.vhd以及差異磁碟cdltmg.vhd,對於我們要做的就是想個辦法繞開拷貝10次父磁碟,記住“重角雖多一麟足矣“!”戲份“開始了:)    我們要做的就是把這個父磁碟單獨放置到一個目錄中,例如將父磁碟單獨移動到父目錄下的Parent目錄, 這樣在匯出目錄的虛擬磁碟目錄下僅保留了差異磁碟部分; 那麼要產生10套同樣的實驗虛擬機器環境?呵呵,拷貝10次Export目錄就好了!拷貝時間空間都得到了保障(因為我們僅僅拷貝差異磁碟就可以了);當然還有個2個前提條件是不得不說的:       1. 因為差異磁碟系統在啟動時都需要讀母盤,因此並發讀的壓力在磁碟系統是很大的,所以即便可以複製的虛擬機器越多越節省空間的,我們也不能無限制的複製,我的環境因為採用SSD做CacheCade,因此做了10個差異磁碟的環境。    2. 在我的環境中用於拷貝的虛擬環境可以是相同的主機名稱,IP地址等),因為處於實驗目的我只需部署同樣環境給做實驗的使用者就可以了,再匯入虛擬機器的時候我會在原地匯入並且制定每個虛擬機器一個自己獨立的Private虛擬交換就可以,但實際環境如果做類似操作,好需要設計如何將拷貝出的虛擬機器環境匯入需要重新設定主機名稱和IP地址等因素。   好了,現在看看我的測試的基礎用例,後期的指令碼都是基於這個實驗作為藍本開發的。    1.首先拷貝父磁碟到Export目錄中一個獨立的目錄    650) this.width=650;" title="image" style="border-left- 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://www.bkjia.com/uploads/allimg/131227/19114a4C-3.png" width="712" height="152" data-pinit="registered" />   2. 拷貝不包含父磁碟的匯出檔案一份到新的目錄,例如從export中的cdltmg拷貝到cdltmg1    650) this.width=650;" title="image" style="border-left- 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://img1.51cto.com/attachment/201304/11/3377405_1365647990lC77.png" width="725" height="205" data-pinit="registered" />    接下來有兩種分支實現方式:     a) 對拷貝後的目錄製作父磁碟製作符號連結,這裡需要用到一個系統內建的MKlink的工具:    MKlink是微軟系統中內建的符號連結工具,Windows Server 2008/2008R2/2012, Windows Vista/Windows 7/Windows 8系統中都可以提供,請參考http://technet.microsoft.com/en-us/library/cc753194(v=ws.10).aspx    我們需要在拷貝出來的目錄的虛擬機器磁碟位置建立源父磁碟的符號連結並指向父目錄下的Parent目錄中的全量父盤 650) this.width=650;" title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; padding-right: 0px" border="0" alt="image" src="http://img1.51cto.com/attachment/201304/11/3377405_1365647993lQCP.png" height="638" data-pinit="registered" />   在GUI介面中,也可以看到該符號連結檔案,注意觀察一下它的大小你就知道為什麼我們要這麼搞了:) 650) this.width=650;" title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; padding-right: 0px" border="0" alt="image" src="http://www.bkjia.com/uploads/allimg/131227/1911495345-6.png" height="482" data-pinit="registered" />    b) 利用Hyper-V修複磁碟工具方式或者WMIWMI的方式是我們後期通過指令碼或C#解決的這裡暫不討論) 

  • 在Hyper-V的管理介面中選擇檢查磁碟 650) this.width=650;" title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; padding-right: 0px" border="0" alt="image" src="http://www.bkjia.com/uploads/allimg/131227/1911491008-7.png" height="272" data-pinit="registered" />
  •  指定拷貝的匯出目錄中的差異虛擬磁碟   
650) this.width=650;" title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; padding-right: 0px" border="0" alt="image" src="http://www.bkjia.com/uploads/allimg/131227/1911494229-8.png" height="475" data-pinit="registered" />
  •  系統提示該差異磁碟的父磁碟串連丟失,當然因為我們統一將父磁碟放到了Parent目錄,因此我們需要點擊重新串連    
   650) this.width=650;" title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; padding-right: 0px" border="0" alt="image" src="http://www.bkjia.com/uploads/allimg/131227/1911495963-9.png" height="437" data-pinit="registered" />
  •  指定Parent目錄中的父磁碟,並選擇重新串連及完成串連後的效果   
650) this.width=650;" title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; padding-right: 0px" border="0" alt="image" src="http://www.bkjia.com/uploads/allimg/131227/1911493494-10.png" height="410" data-pinit="registered" />650) this.width=650;" title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; padding-right: 0px" border="0" alt="image" src="http://www.bkjia.com/uploads/allimg/131227/1911496242-11.png" height="406" data-pinit="registered" />   好了,完成了分支步驟中的任意一個,接下來還有個難題,這些被複製的虛擬機器都有一個統一的虛擬機器Global ID,因此這將會造成為了匯入批量拷貝的虛擬機器被Hyper-V認為是同一個虛擬機器而拒絕匯入的錯誤!  650) this.width=650;" title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; padding-right: 0px" border="0" alt="image" src="http://www.bkjia.com/uploads/allimg/131227/1911494918-12.png" height="424" data-pinit="registered" />    因此,又一個小Trick必須登場了,我們都知道這個虛擬機器的UUID及虛擬機器名稱都儲存在了匯出時產生在Virtual Machine的XML檔案中,因此我們需要分析這個檔案格式並作出差異化的改變就可以完成匯入了,再實際項目中採用了指令碼完成了對XML檔案的Parse和修改,這裡給出一個樣本,只需要修改這三個位置就可以啦!分別是:  Configuration->Properties->global_id (修改虛擬機器唯一ID)  Configuration->Properties->name (修改匯入虛擬機器的名稱)    Settings->Global->logical_id (修改虛擬機器唯一ID)     650) this.width=650;" title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; padding-right: 0px" border="0" alt="image" src="http://www.bkjia.com/uploads/allimg/131227/1911493127-13.png" height="448" data-pinit="registered" />  4. OK,都修改完了,最後一公裡的工作就是匯入虛擬機器了。看看是否符合預期?這一步我偷了點懶,沒有把整個匯入處理程序, 匯入方式大致說明一下, 只需要選擇在原地匯入並註冊新的虛擬機器ID就可以了,匯入簡直就是瞬間完成的!(為什麼速度這麼快,並且不需要選擇複製虛擬機器並選擇註冊新的虛擬機器ID呢?聰明的你一一定知道答案了)    現在看下面的,一個通過快速複製方式產生的虛擬機器已經成功部署上了:-)如果需要批量部署如法炮製上述方式就可以了。其實上述方法還有個變種,那就是根據需要直接產生差異磁碟,除了結合上述修改過的虛擬機器環境,還需要修改每個虛擬機器環境的每個磁碟重新指定為產生的差異磁碟,然後一併複製後匯入即可。這種方式對於沒有差異磁碟的基礎環境是必不可少的!)  650) this.width=650;" title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; padding-right: 0px" border="0" alt="image" src="http://www.bkjia.com/uploads/allimg/131227/1911492114-14.png" height="208" data-pinit="registered" />
寫在最後  其實費勁周折完成的這件事情僅僅是針對我具體搭建的一個具有特殊性的快速部署實驗環境用例所做的設計,在真實的項目裡面考慮還是通過一個由sysprep的系統VM作為源點,利用很成熟的System Center技術構建服務範本並定製化完成; 但不得不說的現階段是針對有些特殊的環境需求,有時候變通一些的做法也同樣可以起到事半功倍的效果!這裡並沒有給出我們最後具體實現的指令碼, 其實我感覺在其中遇到的問題和解決的思路好像更有意義一些, 呵呵!
HTH, Hope This Help :-)

本文出自 “雲中漫步的老貓” 部落格,請務必保留此出處http://3387405.blog.51cto.com/3377405/1175886

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.