Windows Server 2016 Hyper-Vでは、「PowerShell Direct」というホストとゲスト間の新しい対話機能が利用可能になる予定です。PowerShell Directとはどんな機能なのか、Windows Server Technical Preview 2で試してみました。
「PowerShell Direct」は、Windows Server 2016に搭載予定のWindows PowerShellおよびHyper-Vの新機能です。PowerShell Directを説明するためには、まずはWindows PowerShellの「PowerShell Remoting」の話から始めなければならないでしょう。
PowerShell RemotingはWindows PowerShell 2.0からサポートされた、Windows PowerShellのリモート実行機能です。PowerShell Remotingを利用すると、リモートコンピューターに「PSセッション」(Windows PowerShellの実行環境)を生成して、Windows PowerShellのコマンドラインやスクリプト、その他のWindowsコマンドをリモート実行することができます。
簡単な例で説明しましょう。例えば、以下のコマンドラインを実行すると、リモートコンピューターにPSセッションを生成して接続し、リモートコンピューターのWindows PowerShellを対話的に実行することができます(画面1)。
Enter-PSSession -ComputerName <コンピューター名> -Credential <リモート接続の資格情報>
なお、Active Directoryのドメイン環境では、資格情報の指定を省略できます。その場合は、サインイン中のユーザーの資格情報が使用されます。
また、以下のコマンドラインを実行すると、リモートコンピューターにPSセッションを生成して接続し、そのPSセッション内で「スクリプトブロック」(Windows PowerShellのコマンドラインやその他のWindowsコマンド)を実行し、その実行結果をローカルコンピューター側で取得できます。生成されたPSセッションは、スクリプトブロックの実行後に終了します。
Invoke-Command {<スクリプトブロック>} -ComputerName <コンピューター名> -Credential <リモート接続の資格情報>
次のように記述すると再利用可能なPSセッションを作成し、そのPSセッションに対して「Enter-PSSession」コマンドレットや「Invoke-Command」コマンドレットを実行できます。
$mysession = New-PSSession -ComputerName <コンピューター名> -Credential <リモート接続の資格情報>
Invoke-Command $mysession {<スクリプトブロック1>}
Invoke-Command $mysession {<スクリプトブロック2>}
Disconnect-PSSession $mysession
PowerShell Remotingには他にもさまざまな機能や使い方がありますが、PowerShell Directを説明するにはEnter-PSSessionとInvoke-Commandコマンドレットの基本的な使い方だけを知っていればいいでしょう。
なお、PowerShell Remotingを利用するには、操作される側のリモートコンピューターで「Enable-PSRemoting」コマンドレットを実行し、PowerShell Remotingの接続を受け付けるようにしておく必要があります。
また、ワークグループ構成のコンピューターへの接続やIPアドレスでの接続には、操作元のコンピューターで「WS-Management」プロトコルの「TrustedHosts」(信頼されたホスト)を構成しておく必要があります。
Windows Server Technical Preview 2のEnter-PSSessionおよびInvoke-Commandコマンドレットには、「-VMName」という新しいパラメーターが追加されました。
-VMNameはこれまでの「-ComputerName」の代わりに指定することができ、引数にはローカルのHyper-V環境で実行中の仮想マシン名を指定します(画面2)。また、-VMNameの代わりに、「-VMGuid」パラメーターに仮想マシンのGUID(Globally Unique Identifier:グローバル一意識別子)を指定することもできます。
Enter-PSSession -VMName <仮想マシン名> -Credential <リモート接続の資格情報>
Invoke-Command {<スクリプトブロック>} -VMName <コンピューター名> -Credential <仮想マシン名>
資格情報の指定は必須であり、「-Credential」パラメーターを省略した場合は追加で要求されます。現時点では、仮想マシンのゲストOSとして、Windows Server Technical Preview 2、Windows 10 Insider Previewが動作している必要があります。Windows Server Technical Preview 2のNano Serverに対しては、残念ながら使用できません。
もう一度、前出の画面2をよく見てください。実は、Enter-PSSessionやInvoke-Commandコマンドレットで仮想マシンに接続する前に、仮想マシンのゲストOSで「Disable-PSRemoting」コマンドレットを実行し、PowerShell Remotingの機能を無効にしていました。最初のInvoke-Commandコマンドレットの「Access is denied」エラーは、PowerShell Remotingが無効になっていたからです(前出画面2の赤文字部分)。
つまり、Enter-PSSessionやInvoke-Commandコマンドレットの-VMNameパラメーターを使用したリモート実行は、PowerShell Remotingの機能を利用していないのです。もっと言えば、ネットワークも使用していません。
以下の画面3は、Enter-PSSessionコマンドレットで仮想マシンに接続後、仮想マシンのネットワークアダプターを仮想スイッチから切断したところです。ネットワークから切断された状態でも、PSセッションは切断されていません。
Enter-PSSessionやInvoke-Commandコマンドレットのこの新機能について、公式なドキュメントは公開されていません。筆者はこの機能を、以下のマイクロソフトの公式ブログで知りました。
PowerShell Remoting関連のコマンドレットのヘルプ(Get-Help <コマンドレット名>)を見ると、-VMNameおよび-VMGuidパラメーターをサポートしているのは、Enter-PSSessionとInvoke-Commandコマンドレットの二つだけのようです。New-PSSessionコマンドレットでは-VMNameパラメーターは使えませんでした。
ちなみに、新しいヘルプで確認しようと「Update-Help」コマンドレットでヘルプコンテンツを更新したところ、Enter-PSSessionとInvoke-Commandコマンドレットの新しいパラメーターに関する記述がヘルプから消えてしまいました(画面4)。
古いバージョンのヘルプをダウンロードして更新しているのでしょうか。他のヘルプにも影響する可能性があるかもしれないので、Windows Server Technical Preview 2でUpdate-Helpコマンドレットを実行するのは控えた方がよいかもしれません。
当然のことですが、消えるのはヘルプ内の記述だけで、機能は消えません。ただし、正式リリースでこの機能が提供されるのかどうかは、まだ何とも言えません。
Hyper-VのホストOSとゲストOS間のネットワーク接続に依存しないコミュニケーションの手段としては、PowerShell Directの他に「KVP(Key Value Pair)データ交換サービス」と「ゲストサービス」があります。
KVPデータ交換サービスはHyper-Vの最初のバージョンから、ゲストサービスはWindows Server 2012 R2のHyper-Vから利用可能です。どちらの機能も、サポート対象の全てのWindowsおよびLinuxゲスト(一部を除く)で利用できます。
KVPデータ交換サービスは、仮想マシンのゲストレジストリのキー(HKEY_LOCAL_MACHINE¥SOFTWARE¥Microsoft¥Virtual Machine¥Guest、Auto、External)を介して、「値(Value)」と「データ(Data)」のペア(Pair)をホストOSとゲストOSで共有する機能です。
Linuxゲストの場合は、ファイル(/var/lib/hyperv/.kvp_pool_0〜3)を介してデータを共有し、「Linux統合サービス(Linux Integration Services:Linux IS)」のKVPデーモン(hv_kvp_daemon)がホストとのインターフェースになります。
KVPデータ交換サービスは、Hyper-VホストがゲストOSの統合サービスのバージョン情報やIPアドレス情報を取得するのに利用されます。KVPデータ交換サービスについて詳しく知りたい場合は、以下のドキュメントを参考にしてください。
Windows Server 2012 R2から利用可能なゲストサービスは、Hyper-VホストからゲストOSに対してファイルをコピーする機能を提供します。ゲストサービスは既定では無効になっているので、利用するためには仮想マシンの設定でサービスを有効化する必要があります。
Hyper-Vの仮想マシンとして動作するWindows Server Technical Preview 2のNano Serverは、ゲストサービスに対応しています。Linuxゲストでは、「fcopyデーモン(hv_fcopy_daemon)」が必要になります。
ゲストサービスを使用したファイルのコピーには、Windows PowerShellの「Copy-VMFile」コマンドレットを使用します(画面5、画面6)。「-FileSource」パラメーターはコピーの方向を指定するもののように見えますが、現状、「Host」以外の引数は存在しません。つまり、ファイルコピーはホストOSからゲストOSへの一方向のみで可能です。
Copy-VMFile -Name <仮想マシン名> -SourcePath <ホスト側のファイルパス> -DestinationPath <ゲスト側のファイルパス> -FileSource Host
ゲストサービスとCopy-VMFileコマンドレットを使用すると、ゲストOS側の資格情報の入力を求められることなく、ホストOSからゲストOSに対してファイルをコピーすることができてしまいます。セキュリティ的にどうかとも思うのですが、「C:¥Windows」のパスや「/etc/hosts」など、重要なシステムファイルを上書きしようとしてもエラーになりました。この機能が悪用されないように、一応、最低限の考慮はなされているようです。
岩手県花巻市在住。Microsoft MVP:Hyper-V(Oct 2008 - Sep 2015)。SIer、IT出版社、中堅企業のシステム管理者を経て、フリーのテクニカルライターに。マイクロソフト製品、テクノロジを中心に、IT雑誌、Webサイトへの記事の寄稿、ドキュメント作成、事例取材などを手がける。個人ブログは『山市良のえぬなんとかわーるど』。
Copyright © ITmedia, Inc. All Rights Reserved.