none
「Hyper-V」コマンド操作でisoイメージをマウント RRS feed

  • 質問

  • 「Hyper-V」にてコマンド操作でisoイメージファイルを仮想端末に接続する方法はありますでしょうか。

    「PowerShell Management Library for Hyper-V」などでできるのかといろいろ試しましたが、良い方法がみつかりません。

     

    やりたいことは、複数の端末にisoイメージをマウントを手動ではなく自動化したい。

     

    よろしくおねがいします。

    2010年4月28日 7:52

回答

  • こんにちは。

    RemoveVirtualSystemResourcesのサンプルはここにあります。

    http://blogs.msdn.com/virtual_pc_guy/default.aspx

    サンプルからisoのアンマウント部分だけを抜き出して実行したところ、isoをアンマウントできました。
    確認した環境は、Windows Server 2008 R2 Enterprise English です。

    - 確認環境
    Host OS のコンピュータ名 : VMHost
    Guest OS のコンピュータ名 : VM-1
    Guest OS には、E:\ISO\test.iso をマウント中です。( 下記Powershellの$existingRASD.Connectionにisoのパスが読み込まれます)

     

    ----PowerShellの実行コマンド-----

    PS C:\> $HyperVServer = 'VMHost'

    PS C:\> $VMName ='VM-1'

    PS C:\> $VMMS = gwmi -namespace root\virtualization Msvm_VirtualSystemManagementService -computername $HyperVServer

    PS C:\> $VM = gwmi MSVM_ComputerSystem -filter "ElementName='$VMName'" -namespace "root\virtualization" -computername $HyperVServer

    PS C:\> $SystemSettingData = $VM.getRelated("Msvm_VirtualSystemSettingData") | where {$_.SettingType-eq 3}

    PS C:\> $DVDDrive = $SystemSettingData.getRelated("Msvm_ResourceAllocationSettingData") | where{$_.ResourceType -eq 16} | select -first 1

    PS C:\> $existingRASD = $SystemSettingData.getRelated("Msvm_ResourceAllocationSettingData") | where {$_.Parent -eq $DVDDrive.__Path}

    PS C:\> $existingRASD.Connection
    E:\ISO\test.iso

    PS C:\> $result1 = $VMMS.RemoveVirtualSystemResources($VM, @($existingRASD))

    • 回答としてマーク kuukun 2010年5月6日 8:52
    2010年5月6日 3:25

すべての返信

  • ちょうどHyper-Vに対してのプログラムからのアプローチをあれこれやっていたので、HDDの接続の応用でやってみました。

    http://codename2010.blog11.fc2.com/blog-entry-134.html

    Hyper-Vに対するディスクへのアプローチは一番複雑な手順を踏むことになっていますのでコードがかなり長くなってしまいました。

    手順としては
    ・設定を行う仮想マシンの取得
    ・IDEコントローラーの取得
    ・DVDドライブの作成
    ・ISOイメージのマウント
    と、いった感じです。

    細かい説明を省いているのでご質問などは何なりと。

     


    WIN1
    2010年4月29日 9:44
    モデレータ
  • 回答ありがとうございます。

    PowerShellを使用した方法でできました。

    お手数を掛けますが、ちなみにマウントしたイメージファイルを自動でアンマウントするにはどうすればよいのでしょうか。

    2010年4月30日 0:58
  • こんにちは。

    AddVirtualSystemResourcesでイメージファイルをマウント可能なようですので、RemoveVirtualSystemResourcesでアンマウントになると思います。

    http://msdn.microsoft.com/en-us/library/cc160711(v=VS.85).aspx

    2010年4月30日 11:54
  • ModifyVirtualSystemResources で別のisoイメージにマウントしなおすことはできたのですが、isoを外そうとしてみましたが、"Connection"プロパティーの部分を"Nothing"にしたとしても、解除できませんでした。

    次に、RemoveVirtualSystemResources でisoの接続自体を削除しようといろいろ試してみたのですが、うまくいきません。
    RemoveVirtualSystemResources は有用なサンプルもないようですし、isoのみならず、HDDなども同様にうまくいかないので根本的な問題があるかもしれません。

     


    WIN1
    2010年5月4日 1:47
    モデレータ
  • こんにちは。

    RemoveVirtualSystemResourcesのサンプルはここにあります。

    http://blogs.msdn.com/virtual_pc_guy/default.aspx

    サンプルからisoのアンマウント部分だけを抜き出して実行したところ、isoをアンマウントできました。
    確認した環境は、Windows Server 2008 R2 Enterprise English です。

    - 確認環境
    Host OS のコンピュータ名 : VMHost
    Guest OS のコンピュータ名 : VM-1
    Guest OS には、E:\ISO\test.iso をマウント中です。( 下記Powershellの$existingRASD.Connectionにisoのパスが読み込まれます)

     

    ----PowerShellの実行コマンド-----

    PS C:\> $HyperVServer = 'VMHost'

    PS C:\> $VMName ='VM-1'

    PS C:\> $VMMS = gwmi -namespace root\virtualization Msvm_VirtualSystemManagementService -computername $HyperVServer

    PS C:\> $VM = gwmi MSVM_ComputerSystem -filter "ElementName='$VMName'" -namespace "root\virtualization" -computername $HyperVServer

    PS C:\> $SystemSettingData = $VM.getRelated("Msvm_VirtualSystemSettingData") | where {$_.SettingType-eq 3}

    PS C:\> $DVDDrive = $SystemSettingData.getRelated("Msvm_ResourceAllocationSettingData") | where{$_.ResourceType -eq 16} | select -first 1

    PS C:\> $existingRASD = $SystemSettingData.getRelated("Msvm_ResourceAllocationSettingData") | where {$_.Parent -eq $DVDDrive.__Path}

    PS C:\> $existingRASD.Connection
    E:\ISO\test.iso

    PS C:\> $result1 = $VMMS.RemoveVirtualSystemResources($VM, @($existingRASD))

    • 回答としてマーク kuukun 2010年5月6日 8:52
    2010年5月6日 3:25

  • こんにちは..
    既にサンプルが掲示されていますが..

    RemoveVirtualSystemResources
    AddVirtualSystemResources
    は、 スナップショットでいう  "現在" (R1では今すぐ実行) に対してしか実行できません。

    Msvm_VirtualSystemSettingData は スナップショットの数(+現在) の数だけあるので、
    $_.SettingType-eq 3  のように、"現在" を特定した上で、
    それに対して、 RemoveVirtualSystemResources, AddVirtualSystemResources する必要があります。

    スナップショットを作成していない場合でも、"現在" は必ず存在しますので、 SettingType == 3 で絞り込むのは万能の方法です。

    2010年5月6日 8:39
  • ご回答ありがとうございます。

    問題なくできました。

    2010年5月6日 8:53
  • RemoveVirtualSystemResources はPowerShell では問題ないのですが、VBなどで呼び出すとエラーになってしまうようです。
    ネットをあさってみましたが、有用なサンプルも見つけられませんでした。

    サポートの見解としては RunspaceInvoke クラス を使用してPowerShellのコマンドをVBから直接呼び出せばよいとのことです。


    WIN1
    2010年5月12日 6:49
    モデレータ
  • RemoveVirtualSystemResources のPowerShell以外での呼び出しがなんとかできました。

    http://codename2010.blog11.fc2.com/blog-entry-138.html

    でも、PowerShellのほうが何かと面倒な手続きが簡略化されているので気軽に使うにはよいのかなと。


    WIN1
    2010年5月13日 3:47
    モデレータ
  • こんにちは。

    試しにVBSを作成してみました。
    以下をコピーし、拡張子をvbsにして実行してみて下さい。一時間ぐらいで作成したので、エラー処理などは最小限です。予期しない動作をするかもしれませんが、そこまでは確認できていません。


    構文は cscript <vbsファイル> <VM> です。

    例: Guest OS のコンピュータ名がVM-1 の場合は以下のコマンド
    cscript <vbsファイル> VM-1

    --------vbsサンプル-------------
    option explicit

    dim objWMIService
    dim managementService
    dim fileSystem
    dim strVM


    Main()

    Sub Main()
        dim computer, vm , objArgs

        set objArgs = WScript.Arguments

        if WScript.Arguments.Count = 1 then
            strVM = objArgs.Unnamed.Item(0)
        else
            WScript.Echo "usage: cscript vbs vmName"
            WScript.Quit(1)
        end if
       
        set fileSystem = Wscript.CreateObject("Scripting.FileSystemObject")
        computer = "."
        set objWMIService = GetObject("winmgmts:\\" & computer & "\root\virtualization")
        set managementService = objWMIService.ExecQuery("select * from Msvm_VirtualSystemManagementService").ItemIndex(0)
     
        set vm = GetComputerSystem(strVM)
        RemoveVirtualSystemResources(vm)

    End Sub


    Function GetComputerSystem(vmElementName)
        On Error Resume Next
        dim query
        query = Format1("select * from Msvm_ComputerSystem where ElementName = '{0}'", vmElementName)
        set GetComputerSystem = objWMIService.ExecQuery(query).ItemIndex(0)
        if (Err.Number <> 0) then
            WScript.Quit(1)
        end if

    End Function


    Function GetDvDSetting(vmSetting)

        dim query, DvDsettingsData, DvdData
        set GetDvDSetting = Nothing
        query = Format1("ASSOCIATORS OF {{0}} WHERE " &_
                        "resultClass = Msvm_ResourceAllocationSettingData " &_
                        "AssocClass = Msvm_VirtualSystemSettingDataComponent " &_
                        "ResultRole = PartComponent " &_
                        "Role = GroupComponent", vmSetting.Path_.Path)
                       
        set DvDsettingsData = objWMIService.ExecQuery(query)
       
        for each DvdData in DvDsettingsData
            If DvdData.ResourceSubType = "Microsoft Virtual CD/DVD Disk" Then
                set GetDvDSetting = DvdData 
                exit function
            end if
        next

    End Function


    Function RemoveVirtualSystemResources(computerSystem)

        dim query, virtualSystemSetting, DvDsettingData
        dim resourcesettings, objInParam, objOutParams
       
        RemoveVirtualSystemResources = false
       
        query = Format1("ASSOCIATORS OF {{0}} WHERE resultClass = Msvm_VirtualSystemsettingData", computerSystem.Path_.Path)
        set virtualSystemSetting = objWMIService.ExecQuery(query).ItemIndex(0)

        WScript.Echo "ElementName: " & virtualSystemSetting.ElementName
     
        set DvDsettingData = GetDVDSetting(virtualSystemSetting)

        if (DvDsettingData Is Nothing) then
    WScript.Echo "DVD is not mounted "
            exit function
        end if
     
        resourcesettings = Array(1)
        resourcesettings(0) = DvDsettingData.Path_.Path
       
        set objInParam = managementService.Methods_("RemoveVirtualSystemResources").InParameters.SpawnInstance_()'
        objInParam.TargetSystem = computerSystem.Path_.Path
        objInParam.ResourcesettingData = resourcesettings
      
        set objOutParams = managementService.ExecMethod_("RemoveVirtualSystemResources", objInParam)

     WScript.Echo "Unmount Success "

    End Function


    Function Format1(myString, arg0)
        Format1 = Replace(myString, "{0}", arg0)
    End Function

    2010年5月13日 6:07