自作PCサーバーの消費電力を約40W削減した話 #1 NVMe&USB-NIC対応ESXi7.0カスタムインストールISOを作成する

環境構築
スポンサーリンク
スポンサーリンク

ESXi7.0をNVMe(非Intel製)へインストール可能で、USB-NIC(ネットワークアタブター)対応のカスタムインストールISOを作成して、インストールした話

2022/08/15追記
タイトルを「自作PCサーバーのパーツ他をリプレースする」から「自作PCサーバーの消費電力を約40W削減した話」に変更しました。

はじめに

AMD環境のM/Bの多くが搭載しているRealtek製NIC(ネットワークインターフェースコントローラー、LANカードとかネットワークアタブターなどと呼ばれることも)はサポート範囲外のため、ハイパーバイザー型VM環境のESXi7.0の標準のドライバが無く、インストールやアップグレードの支障となっている。

このため、USB-NICに搭載の一部のNICはドライバが存在しているが、標準のインストール用のISOやバンドル(ZIP)ファイルには含まれておらず、そのドライバを含んだカスタムインストールISOを作ってCD/DVDや、ブート用USBメモリに書き込んでから、インストール/アップグレードが必要となる。

また、今回、NVMe-SSD(ADATA/Micron(Crucial)/Silicon Motion製)とM/B搭載のIntel製NICに対応したコミュニティドライバがあったので、これらもカスタムインストールISOに入れます。

なお、「自作PCサーバーの消費電力を約40W削減した話(2022/08/31修正)」記事の投稿順は、作業順とは違いますのでご了承ください。

前提条件

本投稿の内容は2022年7月29日時点のものです。

  • Windows PowerShellのバージョン
    Windows 10 標準のもの、最新版はクロスプラットフォーム(LinuxやMacも)対応ですがバージョンアップはしていません。
PS > $PSVersionTable

Name                           Value
----                           -----
PSVersion                      5.1.19041.1682
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.19041.1682
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
  • VMware.PowerCLIのバージョン
PS > Get-Module -Name VMware.PowerCLI -ListAvailable | select Version

Version
-------
12.7.0.20091289

PowerShellにVMware.PowerCLIをインストールする

VMware.PowerCLI(ESXi用のパッケージ)のインストールの詳細については
https://docs.vmware.com/jp/VMware-vSphere/7.0/com.vmware.esxi.install.doc/GUID-F02D0C2D-B226-4908-9E5C-2E783D41FE2D.html
を参照ください。

Windows PowerShellで、次を実行します。
実行時、リポジトリに関して問い合わせを受けますので、信頼する場合は「y」で応答します。

PS > Install-Module VMware.PowerCLI -Scope CurrentUser

信頼されていないリポジトリ
信頼されていないリポジトリからモジュールをインストールしようとしています。このリポジトリを信頼する場合は、Set-PSReposit
ory コマンドレットを実行して、リポジトリの InstallationPolicy の値を変更してください。'PSGallery'
からモジュールをインストールしますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): y

続いて、発行者が一致しない旨表示される場合があります。

PackageManagement\Install-Package : バージョン '12.7.0.20067606' を使用した新しいモジュール 'VMware.VimAutomation.Sdk'
の Authenticode 発行者 'CN=DigiCert Trusted Root G4, OU=www.digicert.com, O=DigiCert Inc, C=US' は、以前にバージョン '6
.5.0.4624452' でインストールされていたモジュール 'VMware.VimAutomation.Sdk' の Authenticode 発行者 'CN=VeriSign Class 3
 Public Primary Certification Authority - G5, OU="(c) 2006 VeriSign, Inc. - For authorized use only", OU=VeriSign Trust
 Network, O="VeriSign, Inc.", C=US' と一致しません。このままインストールや更新を実行する場合は、-SkipPublisherCheck パ
ラメーターを使用してください。
発生場所 C:\Program Files\WindowsPowerShell\Modules\PowerShellGet\1.0.0.1\PSModule.psm1:1809 文字:21
+ ...          $null = PackageManagement\Install-Package @PSBoundParameters
+                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (Microsoft.Power....InstallPackage:InstallPackage) [Install-Package]、E
    xception
    + FullyQualifiedErrorId : AuthenticodeIssuerMismatch,Validate-ModuleAuthenticodeSignature,Microsoft.PowerShell.Pac
   kageManagement.Cmdlets.InstallPackage

この場合は、指示のように「-SkipPublisherCheck」を付けて再実行ます。

PS > Install-Module VMware.PowerCLI -Scope CurrentUser -SkipPublisherCheck

信頼されていないリポジトリ
信頼されていないリポジトリからモジュールをインストールしようとしています。このリポジトリを信頼する場合は、Set-PSReposit
ory コマンドレットを実行して、リポジトリの InstallationPolicy の値を変更してください。'PSGallery'
からモジュールをインストールしますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): y

インストール後、次でバージョンが確認できます。

PS > Get-Module -Name VMware.PowerCLI -ListAvailable | select Version

Version
-------
12.7.0.20091289

NVMe/NIC/USB-NICドライバ入りのカスタムインストールISOを作成する

PowerShellを実行してカスタムインストールISOを作成する

NVMe/NIC/USB-NICドライバ入りのカスタムインストールISOを作成するPowerShellスクリプト

指定バージョンに対するESXiとドライバを自動的にダウンロードして、ISOファイルを作成するスクリプトを次に示します。

スクリプトに記述のバージョン指定は、2020年 2022年7月29日時点で最新のものにしてあります。

$baseESXiVer = "7"
$usbFling = "ESXi703-VMKUSB-NIC-FLING-55634242-component-19849370.zip"
$nicFling = "Net-Community-Driver_1.2.7.0-1vmw.700.1.0.15843807_19480755.zip"
$nvmeFling = "nvme-community-driver_1.0.1.0-3vmw.700.1.0.15843807-component-18902434.zip"

Add-EsxSoftwareDepot https://hostupdate.vmware.com/software/VUM/PRODUCTION/main/vmw-depot-index.xml
$imageProfile = (Get-EsxImageProfile -Name "ESXi-$baseESXiVer*-standard*" | Sort-Object -Property 'Name' -Descending | Select-Object -First 1).Name
if (!(Test-Path "$($imageProfile).zip")){Export-ESXImageProfile -ImageProfile $imageProfile -ExportToBundle -filepath "$($imageProfile).zip"}
Get-EsxSoftwareDepot | Remove-EsxSoftwareDepot

if (!(Test-Path $usbFling)){Invoke-WebRequest -Method "GET" https://download3.vmware.com/software/vmw-tools/USBNND/$($usbFling) -OutFile $($usbFling)}
if (!(Test-Path $nicFling)){Invoke-WebRequest -Method "GET" https://download3.vmware.com/software/vmw-tools/community-network-driver/$($nicFling) -OutFile $($nicFling)}
if (!(Test-Path $nvmeFling)){Invoke-WebRequest -Method "GET" https://download3.vmware.com/software/vmw-tools/community-nvme-driver/$($nvmeFling) -OutFile $($nvmeFling)}

Add-EsxSoftwareDepot "$($imageProfile).zip"
Add-EsxSoftwareDepot $usbFling
Add-EsxSoftwareDepot $nicFling
Add-EsxSoftwareDepot $nvmeFling

$newProfile = New-EsxImageProfile -CloneProfile $imageProfile -name $($imageProfile.Replace("standard", "addnic")) -Vendor "Custom Lab"

Add-EsxSoftwarePackage -ImageProfile $newProfile -SoftwarePackage "vmkusb-nic-fling" -Force
Add-EsxSoftwarePackage -ImageProfile $newProfile -SoftwarePackage "net-community" -Force
Add-EsxSoftwarePackage -ImageProfile $newProfile -SoftwarePackage "nvme-community" -Force

$isoFile = "$($imageProfile.Replace("standard", "addnic")).iso"
Export-ESXImageProfile -ImageProfile $newProfile -ExportToIso -filepath $isoFile -Force
if (!(Test-Path $isoFile)){
    $bundleFile = "$($imageProfile.Replace("standard", "addnic")).zip"
    Export-ESXImageProfile -ImageProfile $newProfile -ExportToBundle -filepath $bundleFile -Force
    Get-EsxSoftwareDepot | Remove-EsxSoftwareDepot
    Add-EsxSoftwareDepot $bundleFile
    Export-ESXImageProfile -ImageProfile $newProfile -ExportToIso -filepath $isoFile -Force
}
Get-EsxSoftwareDepot | Remove-EsxSoftwareDepot

なお、本スクリプトは、https://www.reddit.com/r/vmware/comments/symsc3/updating_to_70u3c_with_usb_nic_fling/ に出てくるスクリプトをベースに一部変更しています。

途中、ISOファイルの作成のコマンド Export-ESXImageProfile -ImageProfile $newProfile -ExportToIso -filepath $isoFile -Force を実行すると次のエラーが出る場合があります。

Export-ESXImageProfile : Error retrieving file for VIB 'VMW_bootbank_vmkusb-nic-fling_1.10-1vmw.703.0.50.55634242': ("<
zipfile.ZipExtFile name='vib20/vmkusb-nic-fling/VMW_bootbank_vmkusb-nic-fling_1.10-1vmw.703.0.50.55634242.vib' mode='r'
 compress_type=deflate>", "Error opening file object for VIB 'VMW_bootbank_vmkusb-nic-fling_1.10-1vmw.703.0.50.55634242
': Expected value '[]' for attribute 'swplatforms', but found value '[<vmware.esximage.Vib.SoftwarePlatform object at 0
x0000020FF9804DC8>]'.").
発生場所 行:1 文字:1
+ Export-ESXImageProfile -ImageProfile $newProfile -ExportToIso -filepa ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Export-EsxImageProfile], SoapException
    + FullyQualifiedErrorId : System.Web.Services.Protocols.SoapException,VMware.ImageBuilder.Commands.ExportProfile

このように、「Error retrieving file」=「ファイルの取得に失敗した」のエラーが出た場合は、続くif文で、バンドル(ZIP)ファイルを作成してから、このバンドルファイルを元にISOファイルを作成します。

バンドル(ZIP)ファイルの作成時にこのエラーは出ないので、ISOファイル作成時のエラーはPowerShellを最新版にしてないためかもしれませんが、目的のISOファイルは作成できましたので、原因は調査していません。

また、2022年7月29日現在、上記のスクリプトを実行すると、ESXi-7.0U3sf-20036586-addnic.iso が作成されます。
ESXi-7.0U3f-20036589-addnic.iso を作成したい場合は、$imageProfileの行を次のようにしてください。

$imageProfile = "ESXi-7.0U3f-20036589-standard"

ESXi-7.0U3f-20036589-standardとESXi-7.0U3sf-20036586-standardについては VMware ESXi 7.0 Update 3f Release Notes を参照ください。

各ドライバの詳細

各ドライバは、VMware公式が、非公式なドライバを集めたサイト https://flings.vmware.com/ から最新のバージョンや対応状況などを確認できます。

カスタムインストールISOの注意

セキュアブートの設定

UEFI(BIOS)の設定で、後述するインストール後の設定の理由により、セキュアブートの設定をDisabledにしてください。
特に、NICがUSB-NICのみしかない場合は必須です。

インストール中の注意

M/Bに搭載のNICがESXiで未対応の場合、USB-NICを接続せずにESXi7.0をインストールしようとすると次のように、「No Network Adapters」となりインストールできません。

このため、USB-NICを接続して、カスタムインストールISOからインストールを開始すると次のように先に進めるようになります

指示に従ってインストールを進めていきます。

インストール経過を動画録画していたものをコマ送りで確認しました。
UEFI(BIOS)の設定で、セキュアブートの設定をEnabledにしていると、次の画像のように、後述するインストール後の設定 の /etc/rc.local/local.sh が実行されない旨表示されてました。
ただし、カスタムインストールISO内の /etc/rc.local/local.sh は未編集なのでインストール時は実行されようがされまいが変わらないと思います。
また、表示は一瞬ですので、読み取れる人がどのぐらいいるのでしょう?

カスタムインストールISOからシステムの読み込みが終わって、さあインストールが始まるぞ!っと言うときに次のようなエラーが一瞬(これも読み取るのは難しい)でます。

「Unable to obtain a NIC MAC address for UUID generation. Will use a fake MAC. Please add/configure a supported NIC.」=「UUID生成用のNICのMACアドレスを取得できません。 偽のMACを使用します。 サポートされているNICを追加/構成してください。

その後、画面が切り替わってインストール処理が開始されますが、次の画面のように、途中で「Exception: No vmnic tagged for management was found.」が発生して停止します。

これも、後述するインストール後の設定 の /etc/rc.local/local.sh が関連しているのですが、カスタムインストールISOには組み込みが出来てないために発生するものと考えます。

このため、USB-NICを挿しているUSBのポートを変えたり、接続しているSSD/HDDなどを必要最小限にするなどで、USB-NICがLANと接続状態になるように調整してください

インストール後の設定

インストール後、ESXiを起動すると、IPv4のアドレスが、https://0.0.0.0/ になってUSB-NICのネットワーク経由でアクセスできない場合があります。
これは、USBドライバが読み込まれた後、NICを認識し、有線LANケーブルが利用できようになるまでの時間が長いためです。

この場合、まず、Network設定をリストアします。
上記画面で<F2>を押して、ID/パスワードでログインし、次の画面の「Network Restore Option」を選択します。

次に「Restore Network Setting」を選択します。

<F11>で実行します。

テキスト

自動的に生成された説明

初期画面に戻ってきたとき、IPv4がhttps://0.0.0.0/以外(図では192.168.11.138)になっていればネットワーク経由でアクセスできるようになります。

この問題を回避する方法は
https://flings.vmware.com/usb-network-native-driver-for-esxi#instructions
の「Persisting USB NIC Bindings」の項目にもありますが、/etc/rc.local.d/local.sh に処理を記述する必要があります。

/etc/rc.local.d/local.sh は既に存在しているので、#Note … ~ exit(0) の間に追加します。

#!/bin/sh ++group=host/vim/vmvisor/boot

# local configuration options

# Note: modify at your own risk!  If you do/use anything in this
# script that is not part of a stable API (relying on files to be in
# specific places, specific tools, specific output, etc) there is a
# possibility you will end up with a broken system after patching or
# upgrading.  Changes are not supported unless under direction of
# VMware support.

# Note: This script will not be run when UEFI secure boot is enabled.

vusb0_status=$(esxcli network nic get -n vusb0 | grep 'Link Status' | awk '{print $NF}')
count=0
while [[ $count -lt 20 && "${vusb0_status}" != "Up" ]]
do
    sleep 10
    count=$(( $count + 1 ))
    vusb0_status=$(esxcli network nic get -n vusb0 | grep 'Link Status' | awk '{print $NF}')
done

esxcfg-vswitch -R

exit 0

「# Note: This script will not be run when UEFI secure boot is enabled.」とあるように、UEFI(BIOS)のセキュアブートの設定がEnabledになっているとこのスクリプトは実行されません

ESXiが実際にセキュアブートしたかどうかにかかわらす、UEFI(BIOS)のセキュアブートの設定がEnabledになっていると実行されないようですので注意してください

ESXiのセキュアブート化は下記を参照ください。

私は、セキュアブートできないことより、USB-NICが自動で使える状態にならないことの方が問題なので、実際にセキュアブートの設定が完了するところまで実施できていません。

NVMe-SSDへインストール時のベンチマーク

今回、NVMe-SSDは、ADATA XPG SX8200 Pro PCIe3.0x4 1TBを利用して、ESXi-7.0U3sf-20036586-addnic.isoを新規インストールしたときのベンチマークです。

VMにWindows 10 21H2をインストールし、VMware Toolsをインストールした後に、Crystal Disk Mark 8.0.4 で計測した結果が次です。

<ご参考>
XPG SX8200 Proの最大パフォーマンス
Read 3500MB/s, Write 3000MB/s
4K random read/write IOPS : up to 390K/380K
※パフォーマンスは、SSDの容量、ホストのハードウェアとソフトウェア、 オペレーティングシステム、およびその他のシステムによって異なります。

USB-NIC経由のベンチマーク

今回、USB-NICはBUFFALO 有線LANアダプター LUA4-U3-AGTE-BK ブラック Giga USB3.0を利用しています。
他は、NVMe-SSDへインストール時のベンチマーク と同じです。

LAN環境はスイッチングハブ含め1Gbit環境になっており、それに繋がった別マシンのNASの共有フォルダーを、Crystal Disk Mark 8.0.4 の「フォルダー選択」でUNC形式のパス(\\machine\folder の形式)を指定して計測した結果が次です。

シーケンシャル(SEQ1M Q8T1)で1Gbit/s=約100MB/sの性能が出ていることが確認できます。

<ご参考>
BUFFALO LUA4-U3-AGTE-BK
USB-NIC: ASIX AX88179 USB 3.0 to Gigabit Ethernet Adapter

最後に

今回、ESXi7.0U3sfを新規インストールしましたが、これはテスト/検証用の環境であり、自作PCサーバーそのもの(ESXi6.7で稼働)ではまだ実施していません。

実際にアップグレード実施したとき、また違ったことが分かりましたら追記する予定です。

ご意見、ご要望、不具合などのご連絡

ご意見、ご要望、不具合などのご連絡は次からお願いします。

  • コメント
    本投稿へ下部の コメントを書き込む からご連絡ください。
    コメントは承認方式となっており、当方が承認しないと公開表示されません。
    公開表示を希望されない方はその旨コメントに記述ください。
  • Twitter
    ご連絡は @dratech2020 https://twitter.com/dratech2020 の該当ツイートに返信するか、ハッシュタグ「#プログラミングの深淵を求めて」を付けてツイートしてください。 (すぐに気が付かない場合がありますので、ご了承ください)

関連投稿(2022/08/15追記)

コメント

タイトルとURLをコピーしました