Windows TIPS
[System Environment]
TIPS   Windows TIPS TOPへ
Windows TIPS全リストへ
内容別分類一覧へ

差分仮想ディスクをコマンドラインから作成する

解説をスキップして操作方法を読む

デジタルアドバンテージ 打越 浩幸
2010/02/12
対象OS
Windows 7
Windows Server 2008 R2
Virtual PCやVirtual Server、Hyper-Vでは、書込み禁止の仮想ディスクをマウントしようとすると、警告を出したり、エラーになったりする。
いったん差分ディスクを作成すれば、オリジナルの仮想ディスクは書込み禁止にしておいても問題ない。
diskpartコマンドを利用すれば、差分仮想ディスクを簡単に作成できる。

解説

連載 仮想PCで学ぶ「体当たり」Windowsシステム管理

 Virtual PCやVirtual Server、Hyper-Vなどで利用するOSのマスタ・イメージ・ファイルを作成した場合、間違って書き込んでしまわないように、読み出しのみの属性を付けて保存しておきたいことがある。だがHyper-Vの場合、書込み禁止の仮想ディスクを仮想マシンにマウントしようとすると、次の画面のようなエラーが表示され、マウントできない(つまり設定を完了できない)。

仮想ディスク・ファイルに書き込みができない場合のエラー
これはWindows Server 2008 R2のHyper-V 2.0上の仮想マシンで、書込み禁止に設定した仮想ディスク・ファイルをマウントしようとした場合の例。仮想ディスクに対して書き込みの権限が許可されていないと、このようなエラーになり、マウントできない。Virtual PCやVirtual Serverの場合は、警告メッセージが表示されるものの、マウントすることは可能。ただしそのまま仮想マシンを起動すると、結局書込み禁止でエラーになるので、復元ディスクなどを使って、書き込まないようにして利用する。
読み取り専用ファイル(R属性の付いたファイル。Attribコマンドやファイルのプロパティ画面などで設定可能)の場合にはこのようなエラーが表示される。[プロパティ]の[セキュリティ]−[詳細設定]で、書き込み禁止属性を追加した場合も同様のエラーになる。

TIPS「Hyper-Vのスナップショットを復元ディスクとして使う」
TIPS「仮想マシンにおける差分ディスクと復元ディスクの違い」
仮想ディスクの操作(連載 仮想PCで学ぶ)

 復元ディスクやスナップショット機能を使う場合、マスタとなる仮想ファイルに書き込む必要はないので、読み出しのみのファイルでも問題はなさそうだが(実際、復元ディスクやスナップショットでは、マスタの仮想ディスク・ファイルへの書き込みは発生しない)、このように設定画面でエラーとなってしまい、設定を完了することができない。

 なおVirtual PCやVirtual Serverの場合は、警告メッセージは表示されるものの、マウントすることは可能である。なので、読み出しのみの仮想ディスク・ファイルをマウント後、復元ディスクを有効にしておけば、仮想マシンを起動して利用できる。

差分ディスクを自動的に作成させる

 このような問題を避けつつ、マスタとなる仮想ディスク・ファイルを読み出しのみの属性を付けて保護する簡単な方法として、差分ディスクを作成して利用するという方法がある。マスタの仮想ファイルを保護したまま、差分ディスクを通常の読み書き可能なファイルとして作成しておけば、Hyper-Vでも問題なく利用できるようになる。差分ディスクなので、再生成させれば元の環境に戻すのも容易である。中間的なファイルを作成、維持管理するという手間は増えるが、最初にまとめて作成しておくだけなので、そう大きな手間ではない。とはいえ、GUIの管理ツール([コンピューターの管理]−[ディスクの管理]ツール)を使って1ファイルずつ処理するのは面倒である。すでに仮想ファイルがいくつもある場合は、コマンドなどを使って自動化できると便利だ。

 Windows 7/Windows Server 2008 R2では、diskpartコマンドを使って、コマンドラインから仮想ディスク・ファイルを作成/操作できるようになった。本TIPSでは、これを使って、差分仮想ディスクを素早く作成する方法を紹介する。

操作方法

 仮想ディスクをコマンド・プロンプトから自動作成するには、diskpartコマンドを利用する。diskpartコマンドを使って差分ディスクを作成する方法はTIPS「仮想ディスクをコマンドラインから作成・管理する」で紹介しているが、次のようなコマンドを実行するだけである(管理者として実行したコマンド・プロンプト上でdiskpartを起動し、実行する)。

create vdisk file=<作成する仮想ディスク・ファイルの絶対パス名> parent=<親ファイルの絶対パス名>

 diskpartコマンドを起動後、作成する仮想ファイル名と親のファイル名を指定して、「create vdisk」コマンドを実行すればよい。ファイル名は必ず絶対パス名にすること、空白や特殊文字が含まれる場合はダブルクオート記号で囲むこと、が注意点である。作成される仮想ファイルのサイズは親ファイルのものが継承されるので、指定する必要はない。また差分ファイルの内部には親ファイル名が絶対パス名で記述されているので、一度作成したら、以後は親ファイルを移動してはいけない。

 実行すると次のようになる。

DISKPART> create vdisk file="c:\vhdfile\newxp.vhd" parent="c:\vhdfile\org\vpc jpn windows xp pro sp3.vhd" …差分ファイルの作成

  100% 完了しました

DiskPart により、仮想ディスク ファイルが正常に作成されました。

forコマンドで多数のファイルを自動処理する

 対象となるファイルが複数ある場合は、「create vdisk 〜」というコマンド列をforコマンドなどで自動作成し、それをdiskpartコマンドに渡して実行するとよいだろう。例えば、c:\vhdfile\orgフォルダにマスタとなる仮想ディスク・ファイル(読み出しのみの属性付き)が複数あり、c:\vhdfileフォルダに差分ファイル作成したいとする。この場合はc:\vhdfile\orgフォルダでforコマンドを実行してファイル名を取り出し、echoと組み合わせてコマンド文字列を合成すればよいだろう。

※forでdiskpartコマンドを合成する
c:\>cd c:\VHDFILE\ORG

c:\VHDFILE\ORG>for %i in (*.vhd) do echo create vdisk file="C:\VHDFILE\%i" parent="C:\VHDFILE\ORG\%i" >> diskpartcmd.txt

c:\VHDFILE\ORG>echo create vdisk file="C:\VHDFILE\VPC JPN Windows XP Pro SP0.vhd" parent="C:\VHDFILE\ORG\VPC JPN Windows XP Pro SP
0.vhd"  1>>diskpartcmd.txt
…(以下省略)…

 出力されたコマンド文字列をdiskpartコマンドに与えて実行させれば、簡単に差分ディスクを作成できる。スクリプトとして実行させるなら「diskpart /s <スクリプト・ファイル名>」とすればよいし、そのまま直接diskpartコマンドのプロンプトへ流し込んでも(貼り付けても)よい

c:\VHDFILE\ORG>type diskpartcmd.txt …作成したコマンド文字列
create vdisk file="C:\VHDFILE\VPC JPN Windows XP Pro SP0.vhd" parent="C:\VHDFILE\ORG\VPC JPN Windows XP Pro SP0.vhd"
create vdisk file="C:\VHDFILE\VPC JPN Windows XP Pro SP1.vhd" parent="C:\VHDFILE\ORG\VPC JPN Windows XP Pro SP1.vhd"
create vdisk file="C:\VHDFILE\VPC JPN Windows XP Pro SP2.vhd" parent="C:\VHDFILE\ORG\VPC JPN Windows XP Pro SP2.vhd"
create vdisk file="C:\VHDFILE\VPC JPN Windows XP Pro SP3.vhd" parent="C:\VHDFILE\ORG\VPC JPN Windows XP Pro SP3.vhd"

c:\VHDFILE\ORG>diskpart /s diskpartcmd.txt …スクリプトとして実行させる

Microsoft DiskPart バージョン 6.1.7600
Copyright (C) 1999-2008 Microsoft Corporation.
コンピューター: WIN7X86PC-CKDIE

  100% 完了しました

DiskPart により、仮想ディスク ファイルが正常に作成されました。

  100% 完了しました
…(中略)…
c:\VHDFILE\ORG>dir .. …作成結果の確認
 ドライブ C のボリューム ラベルは WINDOWS7X86 です
 ボリューム シリアル番号は 01FB-53D9 です

 c:\VHDFILE のディレクトリ

2010/02/10  11:04    <DIR>          .
2010/02/10  11:04    <DIR>          ..
2010/02/10  11:03    <DIR>          ORG
2010/02/10  11:04           100,864 VPC JPN Windows XP Pro SP0.vhd
2010/02/10  11:04           100,864 VPC JPN Windows XP Pro SP1.vhd
2010/02/10  11:04           100,864 VPC JPN Windows XP Pro SP2.vhd
2010/02/10  11:04           133,632 VPC JPN Windows XP Pro SP3.vhd
               4 個のファイル             436,224 バイト
               3 個のディレクトリ  89,144,684,544 バイトの空き領域

 作成された差分ディスクには読み出しのみの属性を付けず、そのまま利用すればよい。End of Article

「Windows TIPS」


Windows Server Insider フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Windows Server Insider 記事ランキング

本日 月間