treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

WindowsServer 2008 R2のHyper-Vではまる

Windows2008R2のHyper-V(俗にいう2.0)ではまってしまいましたのでご報告します。

きっかけは、Hyper-Vからエクスポートした内容をインポートするときにエラーが発生したところから始まります。。
-------------------------
[Window Title]
Hyper-V マネージャー
[Main Instruction]
仮想マシンのインポート中にサーバー エラーが発生しました。
[Content]
仮想マシンをインポートできませんでした。
インポート ファイル形式エラーです:

D:\FUKUGEN\HVexp\SVR001\Virtual Machines\843027AB-741D-3BEE-8254-BD55B2EE522E.exp。
[閉じる(C)]
-------------------------
こんな感じでエラーが発生しました。
ほかでも、
-------------------------
[Window Title]
Hyper-V マネージャー
[Main Instruction]
仮想マシンのインポート中にサーバー エラーが発生しました。
[Content]
仮想マシンをインポートできませんでした。
インポート ファイル形式エラーです:

D:\FUKUGEN\HVexp\SVR001\Virtual Machines\843027AB-741D-3BEE-8254-BD55B2EE522E.exp。
[閉じる(C)]
----------------------------------------------
[Window Title]
Hyper-V マネージャー
[Main Instruction]
仮想マシンのインポート中にサーバー エラーが発生しました。
[Content]
仮想マシンをインポートできませんでした。
インポート ファイル形式エラーです:

D:\HVexp\SVR008\Virtual Machines\7542FE91-841C-5D39-B19D-75F81E943AA1.exp。
[閉じる(C)]
-------------------------
こんな感じでエラーが発生しインポートで失敗してしまいます。
しかし、これはゲスト依存のようで、中にはインポートできるゲストもあり、インポートできないゲストもいくつかあるという状況です。

なぜ大量にHyper-Vのゲストをインポートしなければならなくなったかといえば、
発端は、RAID5構成のサーバHDDが故障×2台同時で1台がパリティエラーを出してしまったことからはじまり、ホットスペアを用意していたにもかかわらず、RAID再構成となってしまいました。
(この辺りの話はまた別の機会に)
そこでRAID再構成したあとで、WindowsServer2008 R2を再インストール、Hyper-Vサービスをインストール後にエクスポートしておいたゲストインスタンスをインポートして環境の復旧を図る途中の出来事です。
ただ、再インストール後に、WindowsUpdate実行で適用中にエラー出てしまってWU更新の検出⇒適用⇒再起動⇒WU更新の検出⇒適用⇒再起動、となんどやっても重要な更新が次々出てくる無限ループのようなWU地獄。
ようやくWUが完了したところで、サーバーマネージャで役割と機能のスナップインが「エラー」とだけでてて真っ白

f:id:treedown:20150907021016p:plain

詳細を見ると「サーバー マネージャーの更新中に予期しないエラーが発生しました:」で始まるウィンドウが表示される状況です。

f:id:treedown:20150907021147p:plain
で、ですね。
このエラー解消するために、2012年12月現在で2012年11月リリースのKB↓
Windows Server 2008 R2 x64 Edition 用システム更新準備ツール(KB947821)
http://www.microsoft.com/downloads/details.aspx?FamilyID=c4b0f52c-d0e4-4c18-aa4b-93a477456336&displayLang=ja
これを適用する必要があるようなのです。
しかも適用時間が長い長い、、、(1時間くらいだったか)

ここまでで、ようやくプラットフォームとしてのホストOSが出来上がったやれやれだぜ…と思ってHyper-V関連の作業をしているところで、冒頭のエラーが発生してなんじゃこりゃ状態になっているのです。

結論からいうと、原因は「Hyper-Vのバージョン違い」でした。
Windows Server 2008 R2」は"Hyper-V2.0"と認識していましたが、R2のHyper-Vと「Windows Server 2008 R2 ServicePack1適用後」のHyper-Vは完全に別バージョンとして扱われるようなのです。
このため、ServicePack1を適用した場合、もし適用前にゲストOSをエクスポートでバックアップしていたものをリストアしようとしたら冒頭のエラーでインポートできないゲストが存在する、というのが真相だと考えられます。
それはバージョンがそもそも違う、という表現がいささか正しいのかどうか怪しくなってきました。その理由は調べると"Hyper-V2.0"というバージョンの表記方法自体がMicrosoft公式として存在しないという情報もあってもう頭の中がとっ散らかってきます。
見た瞬間目を疑いました。そうなると、

  • 最初のバージョン=Hyper-V1.0(2008無印)
  • 現行のバージョン=Hyper-V3.0(WS2012)

という表現方法も誤っていることになります。
そもそも誰なんだ?紛らわしい表現方法をし始めたのは、と言いたくなるような話です。

正確な情報としては、Hyper-Vのバージョンというのは、
無印2008⇒2008SP2⇒2008R2⇒2008R2SP1⇒2012(とWin8)の5種類(※加えて本記事の現在ではWin8.1&2012R2を加えた6種類)のバージョンが存在するということになり、バージョン間で相互にゲストをインポート/エクスポートするときにはバージョン間移動になる、
ということを認識しておく必要があります。

冒頭のエラーの遠因にあるのは、そこに至るまでに実行したWindows Updateが調子が悪いことによって、何回か実行したWindows UpdateにてServicePack1があったorなかったというところが意識できてなく、同じ手順で構成したと思っていたWindows2008が同じ状態になっていなかった、ということが根本の原因のようです。
そのSP1の存在によってバージョンが違っていた。

でもエクスポートがうまくいったゲストOSもあるのです。
この違いは何なのか、と、調べていくと、成功したゲストの.EXPファイルと失敗するゲストの.EXPファイルに違いがあることに気付きました。
これを読んでる人はもうご存知ですが、Hyper-Vの構成ファイルはだいたいXMLなのでメモ帳で見てdiffれる(※)のです。
(※diffる=差分で違いを抽出できるという意)

.EXPファイルをdiffってみると、
<Version></Version>
とかいうセクションが

  •  成功した方の表記:<Version>Not.RTM</Version>
  •  失敗した方の表記:<Version>2.0</Version>

となっているのです。
これ、あれです。Hyper-Vのバージョンてことですよね。(Hyper-V2.0は公式のバージョン表記ではないはずなのですが、.expファイルではVersionというセクション内で2.0という数字を使っている、というこの矛盾…。)
いま現在システム上ではNot.RTMがうまくいくということは、これは俗にいう1.0互換状態(たぶん)だという仮説が成り立ちます。
そして失敗するほうは2.0って記述なので、以前(再インストール前)のシステムで生成したゲストは2.0ネイティブじゃないとインポートできないという仮説が湧いてきます。

そこで、頑張ってSP1を別のコンピュータからDLして、SP1適用。
寒いサーバ室内で凍死寸前で待つ…適用終了。
(※この時シャットダウンしないという別の問題が発生しました。
シャットダウン中に処理が進まなくなった場合にもPsExec - treedown’s Report」)

適用完了後、ワクワクしながらインポートします。

…。

あっさり終了。エラー/警告なしのおまけつきです。ヤッター。

ということで、問題となっていたエラーの部分は解消できました。

ただ疑問として残ったのは、この記事にあるようなバージョン間のゲスト互換性についての内容は常識なのかどうか?というところです。インターネット上のサイトを探しても全然情報が見つからなかったので。     

追記:
当時はインターネット上のサイトを検索しても情報がなかったのですが、この事象を体験後の3年経った現在であればもっと詳しくて上質な情報もありそうです。