Windows Virtual PC の仮想マシンで FD を使う
前回は、Windows Virtual PC でサポートされていないゲストについて取り上げました。前回の投稿タイトルは「Windows Virtual PC で動いたゲスト、動かなかったゲスト」のほうが良かったかもしれません。
前回の動いたリストには、Windows NT や Windows 98 といったレガシーな Windows、もっと古い MS-DOS、Windows 3.1 もありました。これらのゲスト OS をインストールしたり、トラブル シューティングしたりするには、フロッピー ディスクが利用できることが不可欠です。
Virtual PC 2007 の仮想マシンには、物理フロッピー ディスク ドライブまたは仮想フロッピー ディスク ファイル (.vfd) を割り当てることができました。しかし、Windows Virtual PC の仮想マシンには、そのための UI がありません。最近の PC にはフロッピー ディスク ドライブを備えていないものが多いですが、Windows Virtual PC の仮想マシンも最近の PC らしくなったのでしょうか?
実は、Windows Virtual PC の仮想マシンにもフロッピー ディスク ドライブ (A ドライブ) は存在します。しかし、そのフロッピー ディスク ドライブに物理ドライブや仮想フロッピー ディスク ファイル (.vfd) を割り当てるための UI が存在しないのです。仮想マシンのコンソールのメニューにも、仮想マシンの設定画面にも、フロッピー ディスク ドライブに関する項目は存在しません。
仮想マシンのフロッピー ディスク ドライブがまったく使えないというわけではありません。いくつか方法があります。今回は 2 つの方法を紹介します。
Windows Virtual PC の仮想マシンの設定は、Virtual PC 2007 と同様に、仮想マシン構成ファイル (.vmc) に保存されます。仮想マシン構成ファイル (.vmc)は、既定で、%LOCALAPPDATA%\Microsoft\Windows Virtual PC\仮想マシン \仮想マシン名.vmc という名前で保存されています。
この仮想マシン構成ファイル (仮想マシン名.vmc) を直接編集することにより、物理ドライブや仮想フロッピー ディスク ファイル (.vfd) を仮想マシンに接続できます。
<floppy id=”0″> の <pathname> にある <absolute type=”string” /> の行を次のように変更することで、物理ドライブまたは仮想フロッピー ディスク ファイル (.vfd) を接続できます。
<absolute type=”string”>物理ドライブ名 (A など) または仮想フロッピー ディスク ファイル(.vfd) の絶対パス</absolute>
この方法にはいくつか問題があります。仮想マシン構成ファイル (.vmc) は、仮想マシン実行中はロックされているため、内容の変更は、仮想マシンが停止または休止状態でなければできません。物理ドライブを使用するように設定した場合、仮想マシン実行中は物理ドライブが仮想マシンによってロックされ、ホストからアクセスできなくなります。仮想フロッピー ディスク ファイル (.vfd) を指定した場合は、仮想マシン実行中にファイルを入れ替えることができません。
もう 1 つの方法は、Windows Virtual PC の COM API を利用するものです。Windows Virtual PC COM API の詳細は、次の URL で公開されています。
Windows Virtual PC COM Interface
http://go.microsoft.com/fwlink/?LinkId=155852
COM API は、Virtual PC 2007 以前から提供されているもので、フロッピー ディスク周りには変更がありません。COM API に Windows Script Host (WSH) のスクリプトからアクセスすることで、実行中の仮想マシンのフロッピー ディスク ドライブの割り当てを制御できます。
attachfd.vbs ・・・ 指定した仮想マシン (既定は Windows XP Mode) に物理ドライブ (既定はA) を接続します。
dettachfd.vbs ・・・ 指定した仮想マシン (既定は Windows XP Mode) の物理ドライブの接続を解除し、ホストに制御を戻します。
mountvfd.vbs ・・・ 指定した仮想マシン (既定は Windows XP Mode) に仮想フロッピー ディスク ファイル (既定は ドキュメント フォルダー内の myfd.vfd) を接続します。
umountvfd.vbs ・・・ 指定した仮想マシン (既定は Windows XP Mode) の仮想フロッピー ディスク ファイルの接続を解除します。
createvfd.vbs ・・・ 指定したパスに 1.44 MB の仮想フロッピー ディスク ファイル (既定は ドキュメント フォルダー内の myfd.vfd) を作成します。
いずれのスクリプトも、実行すると、必要に応じて対象の仮想マシンやドライブ文字、ファイルのパスを問い合わせます。[キャンセル]をクリックした場合は、何もしません。なお、ファイルやドライブの存在確認はコードに含めていないので注意してください。
— attachfd.vbs —
targetVM = InputBox (“仮想マシン名を入力してください。”,”物理ドライブの接続”,”Windows XP Mode”)
If targetVM = “” then
WScript.Quit
End If
targetFD = InputBox (“フロッピー ディスクのドライブ文字を入力してください。”,”物理ドライブの接続”,”A”)
If targetFD = “” then
WScript.Quit
End If
Set objVPC = CreateObject(“VirtualPC.Application”)
Set objVM = objVPC.FindVirtualMachine(targetVM)
Set colFloppyDrives = objVM.FloppyDrives
For Each objDrive in colFloppyDrives
retVal = objDrive.AttachHostDrive(targetFD)
Next
— dettachfd.vbs —
targetVM = InputBox (“仮想マシン名を入力してください。”,”物理ドライブの切断”,”Windows XP Mode”)
If targetVM = “” then
WScript.Quit
End If
Set objVPC = CreateObject(“VirtualPC.Application”)
Set objVM = objVPC.FindVirtualMachine(targetVM)
Set colFloppyDrives = objVM.FloppyDrives
For Each objDrive in colFloppyDrives
retVal = objDrive.ReleaseHostDrive()
Next
— mountvfd.vbs —
targetVM = InputBox (“仮想マシン名を入力してください。”,”仮想フロッピー ディスク ファイルの接続”,”Windows XP Mode”)
If targetVM = “” then
WScript.Quit
End If
Set objWShell = CreateObject(“WScript.Shell”)
Set objEnv = objWShell.Environment(“Process”)
targetFD = InputBox (“仮想フロッピー ディスク ファイル (.vfd) のパスを入力してください。”,”仮想フロッピー ディスク ファイルの接続”, objEnv(“HOMEDRIVE”) & objEnv(“HOMEPATH”) & “\Documents\myfd.vfd”)
If targetFD = “” then
WScript.Quit
End If
Set objVPC = CreateObject(“VirtualPC.Application”)
Set objVM = objVPC.FindVirtualMachine(targetVM)
Set colFloppyDrives = objVM.FloppyDrives
For Each objDrive in colFloppyDrives
retVal = objDrive.AttachImage(targetFD)
Next
— umountvfd.vbs —
targetVM = InputBox (“仮想マシン名を入力してください。”,”仮想フロッピー ディスク ファイルの切断”,”Windows XP Mode”)
If targetVM = “” then
WScript.Quit
End If
Set objVPC = CreateObject(“VirtualPC.Application”)
Set objVM = objVPC.FindVirtualMachine(targetVM)
Set colFloppyDrives = objVM.FloppyDrives
For Each objDrive in colFloppyDrives
retVal = objDrive.ReleaseImage()
Next
— createvfd.vbs —
Set objWShell = CreateObject(“WScript.Shell”)
Set objEnv = objWShell.Environment(“Process”)
targetFD = InputBox (“仮想フロッピー ディスク ファイル (.vfd) のパスを入力してください。”,”仮想フロッピー ディスク ファイルの新規作成”, objEnv(“HOMEDRIVE”) & objEnv(“HOMEPATH”) & “\Documents\myfd.vfd”)
If targetFD = “” then
WScript.Quit
End If
Set objVPC = CreateObject(“VirtualPC.Application”)
ret = objVPC.CreateFloppyDiskImage(targetFD,2)