ESXiをWake on LANで起動チャレンジした話

# 概要

物理のESXiホストをWake on LAN (以降WOL) を用いて遠隔起動をしようとチャレンジした際の内容を書いてみます。
私は数日外出する際などは自宅のESXiを落としているため、その後の起動を普段使いのPCから起動したいと考え実施しました。

最終的には100%満足いく結果ではなく、一部うまくいかなかったこともあるためその部分も書き残します。（有識者求む）


## Wake on LANとは
> Wake-on-LAN（ウェイク・オン・ラン、略称WoLあるいはWOL）は、コンピュータネットワーク（主にLAN）に繋がっているコンピュータの電源を遠隔で投入する技術あるいはその行為を指す。
wikipedia引用: https://ja.wikipedia.org/wiki/Wake-on-LAN

上記の通り遠隔でPCの電源を入れさせる技術になっています。仕組みとしては、マジックパケットと呼ばれる特殊なパケットをブロードキャストでLAN内に送信することで、それを認識して電源を入れさせています。
なお利用にあたり、ハードウェア側 (マザーボードやNIC) がWOLに対応している必要があり、BIOSで設定を有効にしてあげる必要等があります。


# 今回の環境

起動対象のESXiは以下です。（細かいスペックは省略）

- ハードウェア: AsRock DeskMeet B660
- OS: ESXi 8.0u2

https://www.asrock.com/nettop/Intel/DeskMeet%20B660%20Series/index.jp.asp


## やりたかったことと、実際に出来たこと

やりたかったことは、以下イメージのようにシャットダウン状態のESXiをWOLを用いて同一ネットワークのPCからから起動させることです。

![](https://paper-attachments.dropboxusercontent.com/s_21830CDBC80B29C7DD95909CCB4D0ADB045FDFCBF8CB0CFD90357B75B9E3E96D_1723803736612_file.png)


しかし、ESXiのOSからシャットダウンしただけではうまくいかず、物理の電源側を一度オンオフして完全に一度通電を止める必要がありました。
そのため、やりたかったことに対して、ひと手間加わってしまう形になりました。。

![](https://paper-attachments.dropboxusercontent.com/s_21830CDBC80B29C7DD95909CCB4D0ADB045FDFCBF8CB0CFD90357B75B9E3E96D_1723803822157_file.png)


原因が不明なため、今後他のハードウェアでも同一になるかは試せたらとは思っていますが、一旦上記状態まで行った内容を本記事では書いていきます。
（BIOSの設定不足なのか、ESXiの設定不足なのか、そもそも実現不可なのか。。。）


# 実施した内容
## NICの確認

まず対象のNICを確認して対象のMACアドレスや、WOLの設定が有効になっているか確認します。

ESXiにSSHで接続して、以下コマンドでNICのリストを出力します。
ここでMACアドレスが確認できるため、メモしておきます。(以下xxの箇所)

```bash
esxcli network nic list

# 出力
Name    PCI Device    Driver  Admin Status  Link Status  Speed  Duplex  MAC Address         MTU  Description
------  ------------  ------  ------------  -----------  -----  ------  -----------------  ----  -----------
vmnic0  0000:00:1f.6  ne1000  Up            Up            1000  Full    xx:xx:xx:xx:xx:xx  1500  Intel Corporation Ethernet Connection (17) I219-V
```

続いて出力されたNICを指定する形で以下コマンドで詳細を出力します。
出力内の「Supports Wakeon: true」で利用可能なNICなことと、「Wakeon: MagicPacket(tm)」でマジックパケットで反応するようになっていることが確認できます。

```bash
esxcli network nic get -n vmnic0

## 出力
   Advertised Auto Negotiation: true
   Advertised Link Modes: Auto, 10BaseT/Half, 100BaseT/Half, 10BaseT/Full, 100BaseT/Full, 1000BaseT/Full
   Auto Negotiation: true
   Backing DPUId: N/A
   Cable Type: Twisted Pair
   Current Message Level: -1
   Driver Info: 
         Bus Info: 0000:00:1f:6
         Driver: ne1000
         Firmware Version: 2.3-4
         Version: 0.9.0
   Link Detected: true
   Link Status: Up 
   Name: vmnic0
   PHYAddress: 0
   Pause Autonegotiate: false
   Pause RX: false
   Pause TX: false
   Supported Ports: TP
   Supports Auto Negotiation: true
   Supports Pause: false
   Supports Wakeon: true
   Transceiver: 
   Virtual Address: 00:50:56:51:e3:e3
   Wakeon: MagicPacket(tm)
```

以下コマンドで「Wakeon: 」の設定は一応変えられるようです。

```bash
esxcli network nic set -n vmnic0 -w <option
```

マジックパケットにする場合は、gを指定します。

- p: Wake on phy activity
- u: Wake on unicast messages
- m: Wake on multicast messages
- b: Wake on broadcast messages
- a: Wake on ARP
- g: Wake on MagicPacket(tm)
- s: Enable SecureOn(tm) password for MagicPacket(tm)

これでNIC側の準備は出来ているため、次に進みます。


## BIOS (UEFI) の設定

WOLの設定をBIOS側 (今回は厳密にはUEFI) で有効にしておく必要があります。
有効にすることで、NIC側はシャットダウン後も通電がされ、パケットの受信を行います。
なお、ここはハードウェアメーカーによって変わるため、今回は前述のハードウェアで実施しているものとなります。
※ハードウェアによって利用できない場合があるため注意

まずUEFIの画面に入り、AdvancedのACPI Configurationの設定を開きます。
PCIE Devices Power Onという設定パラメータがあるため、ここをEnabledにして終了となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406495/ec640097-d0d1-6184-3b73-c100e56f54ff.png)




上記のみで今回の記事段階で出来た範囲では完了となります。
一応それ以外の設定も試したりはしましたが、あまり影響がない感じでした。


## Wake on LANの実施

それではWake on LANを実施していきます。
今回は作業用WindowsのPowershellから投げていきます。

まず対象のESXiをシャットダウンし、電源をオンオフします。
(電源オンオフは前述の出来なかったことを参照)

Windows側で以下Powershellスクリプトを作成して保存しておきます。
1行目と2行目は環境に合わせて書き換えが必要です。

```powershell
$macAddress = "xx:xx:xx:xx:xx:xx" # 対象のMACアドレス
$broadcastAddress = "192.168.0.255" # 対象ネットワークのブロードキャストアドレス
$port = 9  # WoL用ポート

$macBytes = ($macAddress -replace "[-:]", "") -split "(.{2})" | Where-Object { $_ } | ForEach-Object {[Convert]::ToByte($_, 16)}

$magicPacket = ([byte[]]@(0xFF) * 6) + ($macBytes * 16)

$udpClient = New-Object System.Net.Sockets.UdpClient
$udpClient.Connect($broadcastAddress, $port)
$udpClient.Send($magicPacket, $magicPacket.Length)
$udpClient.Close()
```

Powershellを管理者権限で開き、上記スクリプトを実行するため、以下で一時的にポリシーを有効にします。

```powershell
Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process

実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies のヘルプ トピック (https://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y)  [A] すべて続行(A)  [N] いいえ(N)  [L] すべて無視(L)  [S] 中断(S)  [?] ヘルプ (既定値は "N"): Y
```

そうしたら、先程のスクリプトを実行して対象のESXiが起動したら完了となります。


# まとめ

今回はWake on LANを使ってESXiの起動にチャレンジしてみました。
結果として遠隔起動は出来たものの、なぜか電源を一度オンオフする必要がありました。
ESXiのシャットダウンだけだと落ちきれておらず、S4(休止状態)で止まったりしているんですかね、、、一応他ハードウェアでも試してみようとは思います。
もし有識者の方でご存知な方いらしたら、ぜひアドバイスお願いします。


## 参考にしたサイト

https://ja.wikipedia.org/wiki/Wake-on-LAN
https://blog.janjan.net/2020/02/03/wake-on-lan-send-magicpacket-from-powershell-script/