Windows EC2 にインストールされているドライバーについて

しばたです。

EC2においてAWSが提供するWindows Serverは初期状態で準仮想化ドライバーなどの特殊なドライバーがインストールされています。
本記事ではこのドライバーについてざっくり触れていきます。

EC2にインストールされているドライバーの種類

AWSが提供するWindows Serverのイメージ(Managed AMI)はAWSで利用可能にするために素のWindows Serverにいくつかの初期設定が施されており、その内容は以下のドキュメントに記載されています。

初期設定の際に次項で説明するデバイスドライバーがインストールされています。

準仮想化ドライバー(PVドライバー)

EC2インスタンスの性能向上を目的として準仮想化ドライバー(PVドライバー)がインストールされています。

PVドライバーは歴史的経緯により複数種類ありますが2019年現在においてはAWS PVドライバーだけ注目しておけば問題ないでしょう。

RedHat PVドライバー、Citrix PVドライバー

私はあまり過去の経緯を把握できていないのですが、以前のWindowsインスタンスにおいてはRedHat PVドライバーからCitrix PVドライバー、そしてAWS PVドライバーにドライバーが変更された経緯があった様です。
今現在これらのドライバーを選択することは無いでしょうが、古くからあるインスタンスを更新する場合は気を付けてください。

AWS PVドライバー

現在標準でインストールされているPVドライバーで、その実体としては以下に示す複数のシステムドライバーの集合体となっています。

  • xenbus : AWS PV Bus
  • xeniface : AWS Interface
  • xennet : AWS PV Netrowk Device
  • xenvbd : AWS PV Storage Host Adapter
  • xenvif : AWS PV Network Class

(個々のドライバーに対する詳細はドキュメント化されてない様です)

このためインストールされているAWS VPドライバーのバージョンは特定のレジストリキー(HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services)から取得する必要があります。
PowerShellコンソールからだと以下の様にしてバージョンを取得できます。

# AwS PVドライバーのバージョンを取得
Get-ItemProperty HKLM:\SOFTWARE\Amazon\PVDriver | Select-Object Version

また、個別のドライバーのバージョンは以下の様にして取得できます。

# Windows Server 2016 以降
Get-CimInstance -ClassName Win32_SystemDriver |
    Where-Object { $_.Name -in ('xenbus', 'xeniface', 'xennet', 'xenvbd', 'xenvif')} | 
    Select-Object Name, Caption, @{Name='Version'; Expression={(Get-Item $_.PathName).VersionInfo.FileVersionRaw.ToString()}}

# Windows Server 2012 R2以前
function GetFileVersionString ([IO.FileInfo]$FileInfo) {
    $ver = $FileInfo.VersionInfo
    return ("{0}.{1}.{2}.{3}" -f $ver.FileMajorPart, $ver.FileMinorPart , $ver.FileBuildPart , $ver.FilePrivatePart )
}
Get-WmiObject -ClassName Win32_SystemDriver |
    Where-Object { $_.Name -in ('xenbus', 'xeniface', 'xennet', 'xenvbd', 'xenvif')} | 
    Select-Object Name, Caption, @{Name='Version'; Expression={GetFileVersionString (Get-Item $_.PathName)}}

AWS NVMeドライバー (awsnvme)

ドキュメントにある様にNitro世代のWindowsインスタンスはストレージにアクセスするのにNVMeドライバーを使用します。

EBS ボリュームおよびインスタンスストアボリュームは、Nitro ベースのインスタンスで NVMe ブロックデバイスとして公開されます。NVMe ブロックデバイスを使用するには、AWS NVMe ドライバがインストールされている必要があります。
最新の Windows Server 2008 R2 以降用の AWS Windows AMI には、必要な AWS NVMe ドライバが含まれています。

AWS NVMeドライバーのバージョンは以下のコマンドで取得できます。

# Windows Server 2016 以降
Get-CimInstance -ClassName Win32_SystemDriver |
    Where-Object { $_.Name -eq 'awsnvme'} | 
    Select-Object Name, Caption, @{Name='Version'; Expression={(Get-Item $_.PathName).VersionInfo.FileVersionRaw.ToString()}}

# Windows Server 2012 R2以前
function GetFileVersionString ([IO.FileInfo]$FileInfo) {
    $ver = $FileInfo.VersionInfo
    return ("{0}.{1}.{2}.{3}" -f $ver.FileMajorPart, $ver.FileMinorPart , $ver.FileBuildPart , $ver.FilePrivatePart )
}
Get-WmiObject -ClassName Win32_SystemDriver |
    Where-Object { $_.Name -eq 'awsnvme'} | 
    Select-Object Name, Caption, @{Name='Version'; Expression={GetFileVersionString (Get-Item $_.PathName)}}

AWS ENAドライバー (ena)

Elastic Network Adapter (ENA)を利用してネットワーク通信するためのネットワークドライバーです。
拡張ネットワーキングの機能を利用する際はこのドライバーがインストールされている必要があります。

AWS ENAドライバーのバージョンは以下のコマンドで取得できます。

# Windows Server 2016 以降
Get-CimInstance -ClassName Win32_SystemDriver |
    Where-Object { $_.Name -eq 'ena'} | 
    Select-Object Name, Caption, @{Name='Version'; Expression={(Get-Item $_.PathName).VersionInfo.FileVersionRaw.ToString()}}

# Windows Server 2012 R2以前
function GetFileVersionString ([IO.FileInfo]$FileInfo) {
    $ver = $FileInfo.VersionInfo
    return ("{0}.{1}.{2}.{3}" -f $ver.FileMajorPart, $ver.FileMinorPart , $ver.FileBuildPart , $ver.FilePrivatePart )
}
Get-WmiObject -ClassName Win32_SystemDriver |
    Where-Object { $_.Name -eq 'ena'} | 
    Select-Object Name, Caption, @{Name='Version'; Expression={GetFileVersionString (Get-Item $_.PathName)}}

AWS SR-IOVドライバー (vxn)

特定のインスタンスタイプのEC2ではSR-IOVを使用した高性能なネットワーク通信を行うことが可能です。

ただドキュメントを読む限りではSR-IOVの機能自体はENAでも使えますし、AWSのドキュメントに記載されているSR-IOVドライバーはIntel 82599 Virtual Function (VF) インターフェイス向けのドライバーを指している様です。

ENAおよびVFインターフェースが利用可能なインスタンスタイプについては以下のドキュメントをご覧ください。

AWS SR-IOVドライバーのバージョンは以下のコマンドで取得できます。

# Windows Server 2016 以降
Get-CimInstance -ClassName Win32_SystemDriver |
    Where-Object { $_.Name -eq 'vxn'} | 
    Select-Object Name, Caption, @{Name='Version'; Expression={(Get-Item $_.PathName).VersionInfo.FileVersionRaw.ToString()}}

# Windows Server 2012 R2以前
function GetFileVersionString ([IO.FileInfo]$FileInfo) {
    $ver = $FileInfo.VersionInfo
    return ("{0}.{1}.{2}.{3}" -f $ver.FileMajorPart, $ver.FileMinorPart , $ver.FileBuildPart , $ver.FilePrivatePart )
}
Get-WmiObject -ClassName Win32_SystemDriver |
    Where-Object { $_.Name -eq 'vxn'} | 
    Select-Object Name, Caption, @{Name='Version'; Expression={GetFileVersionString (Get-Item $_.PathName)}}

EC2WinUtil ドライバー (ec2winutildriver)

ドキュメントには

トラブルシューティング用

とだけ記載されているドライバーです。
具体的に何をしてくれのかは不明ですがおそらくAWSサポート用なのでしょう。

EC2WinUtilドライバーのバージョンは以下のコマンドで取得できます。

# Windows Server 2016 以降
Get-CimInstance -ClassName Win32_SystemDriver |
    Where-Object { $_.Name -eq 'ec2winutildriver'} | 
    Select-Object Name, Caption, @{Name='Version'; Expression={(Get-Item $_.PathName).VersionInfo.FileVersionRaw.ToString()}}

# Windows Server 2012 R2以前
function GetFileVersionString ([IO.FileInfo]$FileInfo) {
    $ver = $FileInfo.VersionInfo
    return ("{0}.{1}.{2}.{3}" -f $ver.FileMajorPart, $ver.FileMinorPart , $ver.FileBuildPart , $ver.FilePrivatePart )
}
Get-WmiObject -ClassName Win32_SystemDriver |
    Where-Object { $_.Name -eq 'ec2winutildriver'} | 
    Select-Object Name, Caption, @{Name='Version'; Expression={GetFileVersionString (Get-Item $_.PathName)}}

EC2にインストールされているドライバーの一覧

OSによって初期インストールされているドライバーは異なり、最初に触れたマネージド AWS Windows AMIによると2019年8月現在は以下の様になっています。

ドライバー Windows Server 2008 Windows Server 2008 R2 Windows Server 2012 Windows Server 2012 R2 Windows Server 2016 Windows Server 2019
RedHat PVドライバー - - - - - -
Citrix PVドライバー - - - - -
AWS PVドライバー -
AWS NVMeドライバー -
AWS ENAドライバー -
AWS SR-IOVドライバー - - -
EC2WinUtil ドライバー -

(SACのWindows Serverは除外)

各種ドライバーのアップグレード

最後に各種ドライバーのアップデート方法について触れておきます。
公式な手順としては以下のドキュメントにまとめられています。

正直非常にわかりにくいです...
ですが、EC2WinUtilドライバー以外はAWS Systems MangerのAWS-ConfigureAWSPackageドキュメントを使いアップグレードすることができますので極力このドキュメントを使う様にすると良いでしょう。

AWS-ConfigureAWSPackageによるドライバーのアップグレード

AWS-ConfigureAWSPackageは以下の引数を取りますが、Name引数に各ドライバーの名称を指定するとドライバーを更新することができます。

  • Action : Install
  • Name : (下表参照)
  • Version : (Optinal) 必要がある場合ドライバーのバージョンを指定
ドライバー Name引数に指定する値
AWS PVドライバー AWSPVDriver
AWS NVMeドライバー AWSNVMe
AWS ENAドライバー AwsEnaNetworkDriver
AWS SR-IOVドライバー IntelSriovDriver

細かい説明は端折りますが例えばAWS PVドライバーを更新する場合は以下の様な指定となります。

実行結果はこんな感じです。

今回は選択したインスタンスが新しいため同じバージョンの再インストールをしてしまっていますが雰囲気は掴めるかと思います。