2021/03/01

メモ:Hyper-V VM と Windows Container に対する PowerShell Direct のお話

PowerShell Remotingと同様のことを、Hyper-V ホストと Windows ゲストの仮想マシン間、コンテナー ホストと Windows コンテナー間でできるようにしたものが、Windows Server 2016 以降の PowerShell Direct。Enter-PSSession と Invoke-Command に -VMName や -ContainerId に接続先を指定すると使える。

例えば、Hyper-V の場合、仮想マシンのゲスト OS のコンソールにサインインしなくても、いろいろ情報を取ってこれて便利かも。1 つ目のコマンドは Get-ComputerInfo を実行したもの。2 つ目のコマンドはレジストリから詳細なビルド番号を取得する以下のコマンドライン。

 (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion").CurrentBuild + "." + (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion").UBR

 

Hyper-V で PowerShell Direct を可能にしているのが、ゲスト コンポーネントの Hyper-V PowerShell Direct Service(vmicvmsession)。

ゲスト側でvmicvmsession サービスを停止すると接続できなくなる。(停止状態の場合、無効になってない限り、オンデマンドで開始してくれるはず)

Linux のゲスト コンポーネントにはこのデーモンないので Linux ゲストに PowerShell 7 とか入れても PowerShell Direct は使えない。→ Hyper-V 統合サービス | Microsoft Docs

Windows コンテナーはどうかというと、Enter-PSSession は docker attach、Invoke-Command は docker exec みたいに使えるわけなんだけど(コンテナー側に Windows PowerShell が必要なので、現在のnanoserver:1709 以降には使えない)、

Hyper-V PowerShell Direct Service(vmicvmsession)が停止状態でも使えるから、別の実装になってるみたい。Hyper-V 分離モードでも同じ。この機能、使えても使えなくても、docker コマンドでそれ以上のことをできるので、困るわけではない。

LCOW で動く Linux コンテナーに PowerShell 7 を入れてもだめだったのは確認済み。→ メモ:PowerShell Remoting from Windows to Linux (Container) 

なお、Windows PowerShell の Invoke-Command のローカルヘルプには -VMName と -ContainterId が抜けてるけど、以下のオンラインヘルプにはちゃんと書いてる。-ContainerID に指定できるのは docker ps の短縮 ID ではなく、docker ps --no-trunc のフル ID なことに注意。

Enter-PSSession (Microsoft.PowerShell.Core) - PowerShell | Microsoft Docs
Invoke-Command (Microsoft.PowerShell.Core) - PowerShell | Microsoft Docs

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。