﻿# 如何手動還原 Hyper-V 的 VM 與 Snapshots 到另一台主機

今天公司有台 Hyper-V 主機無預警的掛了，就這個剛好公司開發用的資料庫正好安裝在那壹台，為了讓大家能夠繼續工作，必須儘速將 VM 移至另一台 Hyper-V 伺服器，但是 VM 的設定都沒有匯出，所以無法完整的匯入另一台 Hyper-V，因為原本的 VM 建立了許多快照(Snapshots)，所以光是將 VHD 檔複製過去是沒用的，這跟 Hyper-V 的 Snapshots 的運作機制有關。

首先，我嘗試了好幾個小時把 VHD 檔複製到另一台 Hyper-V 伺服器，並手動新增虛擬機器上去，這才發現所有資料庫是三個月前的版本，這怎麼能接受，所以花了好些時間研究到底要如何才能復原虛擬機制到最新版，有時後人太鐵齒就會浪費許多寶貴的時間，我也不例外，嘗試了好久之後才願意認真去學 Hyper-V 的 Snapshots 運作機制，這才發現一個非常寶貴的知識：Hyper-V 的 Snapshots 的運作完全跟**差異磁碟**的運作機制一模一樣！

假設我們的虛擬機器有一顆虛擬硬碟(VHD)，當你建立了第一個快照後，這個快照就會自動變成一顆差異磁碟，並且副檔名為 \*.avhd，事實上 \*.avhd 就是 VHD 格式的硬碟。而且原本的 \*.vhd 硬碟就會變成這顆 \*.avhd 快照磁碟的父磁碟(parent disk)。

瞭解差異磁碟原理的人就知道，當你產生差異磁碟並使用過後，父磁碟是不能被變更的，只要一變動父磁碟的內容，所有繼承於這顆父磁碟的差異磁碟將完全失效！

目前為止，我並不知道如何完整復原 Snapshots 的狀態回 Hyper-V，但是我學會了如何手動將虛擬機器的虛擬硬碟回復到最新的一份快照 (或任何一份快照的版本)，以下是我的還原計畫與策略：

**環境說明**

-   壹台虛擬機器（需重建）
-   壹個原始的虛擬硬碟 (\*.vhd)
-   已有兩個快照集 (Snapshots)

**還原目標**

-   復原虛擬硬碟至最近、最新的版本

**還原策略 (1)：透過合併磁碟功能將多個磁碟合併成壹個唯一磁碟 (較耗時的方法)**

1\. 先選取最新的快照磁碟檔 (\*.avhd)，並透過 **編輯磁碟** 工具進行**合併磁碟**動作，合併至**父磁碟**

修改原本 \*.avhd 的副檔名為 \*.vhd

[![修改原本 \*.avhd 的副檔名為 \*.vhd](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/61ce3b6a3c5865f08b03-image_thumb.png "修改原本 *.avhd 的副檔名為 *.vhd")](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/5582056ba17e63332db4-image.png)

從 Hyper-V 管理員點選 \[編輯磁碟\] / \[Edit Disk\] 動作

![從 Hyper-V 管理員點選 \[編輯磁碟\] / \[Edit Disk\] 動作](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/f88c61de809b8ee0442e-image.png "從 Hyper-V 管理員點選 [編輯磁碟] / [Edit Disk] 動作")

選取剛剛更名的快照磁碟

![選取剛剛更名的快照磁碟](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/bd711f8218547c1e0260-image.png "選取剛剛更名的快照磁碟")

選擇 \[Merge\] 選項

![選擇 Merge 選項](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/ed69020ff16289414d1f-image.png "選擇 Merge 選項")

合併變更至父磁碟

![合併變更至父磁碟](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/45061b04e049644ae00f-image.png "合併變更至父磁碟")

2\. 再選取剛剛被合併的父磁碟 (\*.avhd)，並透過**編輯磁碟**工具進行**合併磁碟**動作再合併至它的**父磁碟**，此時這個快照磁碟的父磁碟就是當初建立虛擬機器原本的虛擬磁碟

3\. 重新建立新的虛擬機器，並指派最後被合併的那個虛擬磁碟，大功告成！

**還原策略 (2)：保留所有快照磁碟，並將磁碟重新連接並直接掛載上線  (較快速的方法)**

1\. 將原本置於 Snapshots 目錄的快照磁碟複製到 Virtual Hard Disks 目錄下，讓這些快照磁碟跟虛擬機器原本的虛擬磁碟放在一起。

2\. 將所有快照磁碟的副檔名從 \*.avhd 修改成 \*.vhd

3\. 利用 **審查磁碟 (Inspect Disk)** 工具將這些快照磁碟重新連接

從 Hyper-V 管理員點選 \[審查磁碟\] / \[Inspect Disk\] 動作

![從 Hyper-V 管理員點選 \[審查磁碟\] / \[Inspect Disk\] 動作](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/9575fb1706288e3803b1-image.png "從 Hyper-V 管理員點選 [審查磁碟] / [Inspect Disk] 動作")

  先選取最新的快照磁碟，此時由於差異磁碟檔名已經變更，所以必須重新設定連接父磁碟

 ![先選取最新的快照磁碟，此時由於差異磁碟檔名已經變更，所以必須重新設定連接父磁碟](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/011a0e17d72115fb0c48-image.png "先選取最新的快照磁碟，此時由於差異磁碟檔名已經變更，所以必須重新設定連接父磁碟")

選擇 \[Reconnect\] 選項

![選擇 \[Reconnect\] 選項](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/7b3720b150866235beac-image.png "選擇 [Reconnect] 選項")

選擇父磁碟檔案

![選擇父磁碟檔案](https://stwillblogassets.blob.core.windows.net/files/images/external/stwillblogassets.blob.core.windows.net/ddf47c3b4e544c7f3992-image.png "選擇父磁碟檔案")

4\. 重新建立新的虛擬機器，並指派最後被合併的那個虛擬磁碟，大功告成！

**備註事項**

-   重新啟動虛擬機器後由於主機、執行環境不太一樣，所以必須重新設定網路卡
-   設定完網卡後不一定會立即生校，建議先停用網卡再重新啟用即可

**後記**

我不可能什麼都會，遇到沒碰過的問題時也會慌，亂查資料、亂 try 方法，這些都是在不得以的情況下所產生的自然反應，人家說：「問對問題，問題就已經被解決了一半」。真的是這樣，像我一開始想儘速還原 Hyper-V 中的虛擬機器時不清楚 Snapshots 的運作原理，所以我連問題在哪裡都不知道，開心還原後還以為已經還原成功，結果是還原到三個月前的版本。

之後再網路上亂查查到的解決方案都是 **還原策略 (1)** 的解法，當我知道 Snapshots 的運作原理之後才恍然大悟，進而想出更快速的 **還原策略 (2)** 解法，所以只要熟悉原理就能掌握問題，進而快速解決問題。

我覺得不管是誰寫文章，每一篇文章背後都一定都累積了不少時間與~~怨念~~汗水才整理出這些資訊，今天這一篇耗了我一整天，心情也實在 down 到谷底，再加上最近遇到一些狗屁倒灶的事一堆，實在有點吃不消。

雖然很不想碰到這種突如其來的災難弄得我疲憊不堪，但該來的躲不掉，我們只能積極面對，否則問題永遠存在。像我之前曾在[噗浪](http://www.plurk.com/willh/invite)上講過一句話：「你永遠不知道接手一個爛案子可以學到多少開發經驗！唯有正向思考才能讓你進步，抱怨只會讓自己越來越消極～」，這些都是一樣的道理。

最後，我 Hyper-V 上的虛擬機器終於全部救回來了，明天大夥終於可以正常工作了，算是不幸中的大幸啦，我可以安穩的去睡覺了。^\_^

**相關連結**

-   [Howto recover snapshots](http://blogs.msdn.com/robertvi/archive/2008/08/26/howto-recover-snapshots.aspx)
-   [How to manually merge Hyper-V snapshots into a single VHD](http://itproctology.blogspot.com/2008/06/how-to-manually-merge-hyper-v-snapshots.html)
-   [Hyper-V Snapshots, more about how they work](http://itproctology.blogspot.com/2008/05/hyper-v-snapshots-more-about-how-they.html)
-   [Snapshotting in Hyper-V does not equal VMware checkpointing.](http://itproctology.blogspot.com/2008/03/snapshottingnot-your-checkpointing.html)
-   [Managing Hyper-V snapshots - the basics](http://itproctology.blogspot.com/2008/07/managing-hyper-v-snapshots-basics.html)
