vhd をドライブとしてマウントするには?


私、職種としてはデベロッパーエバンジェリストのはずなのですが、なぜか普段の業務では ASP.NET よりも Windows Server、IIS の話をすることが多いです。(というかほとんどそればかり話しています。)

そんなわけで、私の二台あるノート PC の一台には Windows Server 2008 (64bit) がインストールしてあり、その Hyper-V 上ではいくつかの OS が動作するようになっています。

この Hyper-V は、仮想化された OS でも物理マシンにインストールされているのとほとんど変わらないパフォーマンスで動作するので非常に重宝していますが、少々不便を感じていることがありました。

それは、あたりまえのことなのですが、仮想マシンが動作していないと、仮想マシンにディスクにアクセスできないということです。

ちょっとしたファイルをコピーする場合でも、いちいち仮想マシンを起動する必要があり、また、他の仮想マシンが動作していると物理的なリソースの関係で起動できないこともありました。

そんなときにちょうど "vhd もドライブとしてマウントできる" ツールを発見。

Gizumo Dive
http://arainia.com/software/gizmo/overview.php?nID=4

早速 Web サイトにアクセスしてみると、64 bit OS にも対応しているということで期待してインストールしてみましたが、私の Windows Server 2008 R2 (64 bit) 環境ではドライバがンストールされず動作しませんでした。

しかし人間というものは不思議なもので、期待したことが出来ないとなると"なんとかしてやろう"、という気になるもので、MSDN ライブラリの中から API を探し出してツールを作成してみました、

作成したと言っても前出ツールのような独自のドライバーを持った高等なものではなくて、Hyper-V のサービスが持っている Virtualization WMI Class の Msvm_ImageManagementService を利用したものですが...(^^;

参考にしたのは以下のサンプルコードです。

Mount Method of the Msvm_ImageManagementService Class
http://msdn.microsoft.com/en-us/library/cc136811(VS.85).aspx

Unmount Method of the Msvm_ImageManagementService Class
http://msdn.microsoft.com/en-us/library/cc136982(VS.85).aspx

この Msvm_ImageManagementService クラス、vhd のマウント、アンマウント以外でも vhd の情報を取得したり、vhd を作成したりと、いろいろと機能があるようですので、興味のある方は使ってみてください。

さて、ツールを作り終えた直後、同僚の奥主さんにツールのことを話したら「え? Windows 7 も Windows Server 2008 R2 も標準で vhd をマウントできるんだけど」とのこと。。

そう、なんと次のバージョンの Windows からは標準で vhd をマウントできるようになっていたのでした...Orz

・・・・。

世の中はどんどん便利になっていきますね。

趣味のプログラムなんて、もはや入る隙間もありませんね。

せっかくなので、作ったコードをアップしましたので、興味のある方は Msvm_ImageManagementService API の検証用にでも使ってみてください。

自分用ツールなのでコードにコメントもあまりなく、コード自体も汚いですがごカンベンを...(^^;)

ツールの機能としては、Hyper-V が動作している Windows Server 2008 (※) 環境では MS VM マネージメントサービスを使用して vhd ファイルをドライブとしてマウントします。
※Windows Server 2008 ではマウントされるだけでドライブレターが割り振られない場合があるので、[ディスクの管理] でドライブレターを割り当ててください。(R2 では自動で割り振られます)

また最新の Virtual Server がインストールされている環境では、Virtual Server がインストールするコマンドラインツール vhdmount.exe を使用して、さも自分がやったように vhd ファイルをマウントします。

なお、Windows Server 2008、R2、Windows Vista 環境で実行する際は、[管理者として実行(A)] で実行してください。ただこれに関しては以下のメソッドを追加することで解決できる気がします。

WindowsPrincipal.IsInRole メソッド
http://msdn.microsoft.com/ja-jp/library/wak3kd03(VS.85).aspx

サーバー関連の API は、サンプルも結構公開されているようなので、いろいろ自ツールを作成してみると面白いと思いますよ。

では。

Real Time Analytics

Clicky

Skip to main content