• The Magic Packet Goes Away

前回はWindowsマシンをスリープさせる話だったが、多数のスリープしたPCをいちいち起こしてまわるのは結構大変だ。Windowsマシンのスリープを解除する方法はいくつかあるが、ネットワーク側から操作可能なものとしてWake On LAN(WoL)がある。WoLは、1997年にインテルとIBMが結成したAdvanced Manageability Allianceで仕様化されたもの。1997年といえば、Windows NT 4.0とWindows 95の時代。インテルのCPUは、MMX PentiumやPentium IIの頃。いまから25年も前の話である。

WoLは企業向けなどではインテルのvProにほぼ置き換えられた。そもそもvProは、2005年にWoLの後継として作られたAMT(Active Management Technology)を発展させたもの。ATM1.0は、最初に82573Eギガビットイーサーネットコントローラーに搭載された。これにはマイクロコントローラーが搭載されていて、TCP/IPでの制御が可能になった。

WoLが制定された当時は、イーサーネットチップにあまり過大な処理を行わせることはできず、WoLは、単純なハードウェアで解釈、処理が可能なプロトコルが採用された。WoLでPCを起動するために送られるパケットを「マジックパケット」という。

マジックパケットは、0xFFの6回の繰り返したあと、起動したいPCのMACアドレス(リンクレイヤーアドレス。48ビット=6バイト)を16回繰り返した内容を持つ。このパケットをローカルネットワークに対してブロードキャストする。

(リスト01)は、マジックパケットを送信するPowerShellのプログラムだ。このプログラムでは、指定されたブロードキャストアドレスに対して前記の内容をUDPパケットに入れて送信する。WoLではIPによる送信は指定されていないが、目的のPCに前記の内容を持つパケットが到達すれば、問題はない。一見、WoLは簡単そうだが、実際には、これを有効にする設定が面倒なのである。

■リスト01

# (C) 2022 Shinji Shioda # Usage:WoL␣〈MACアドレス〉␣〈ブロードキャストアドレス〉 # Ex:WoL 00-01-02-03-04-05 192.168.0.255 function global:WoL () { param([string]$MacAddress,[string]$BroadCastAddress); $MacPart=($MacAddress -isplit '[^0-9A-F]' | ForEach-Object { [System.Convert]::ToByte($_,16) }); $EndPoint=New-Object System.Net.IPEndPoint ( [system.net.IPAddress]::Parse(($BroadCastAddress)),10000); $Socket=New-Object System.Net.Sockets.Socket ( [System.Net.Sockets.AddressFamily]::InterNetwork), ([System.Net.Sockets.SocketType]::Dgram), ([System.Net.Sockets.ProtocolType]::UDP); $Socket.SetSocketOption( [System.Net.Sockets.SocketOptionLevel]::Socket, [System.Net.Sockets.SocketOptionName]::Broadcast,$true); [void] $Socket.SendTo( ([byte[]] (@(0xFF)*6))+($MacPart*16),$EndPoint); $Socket.Close(); }

WoLに対応したイーサーネットインターフェースは、ACPIのS5ステート(ソフトオフ状態)でもこのパケットを受け取り、含まれているMACアドレスが自分と一致したらPCに対して電源オン(あるいはWake)のイベントを発生させる。ただし、WoLは、ファームウェア(BIOSあるいはUEFI)に有効、無効の設定が用意されているのが普通だ。

ここまでは、1997年に仕様化されたWoL(ハードウェアによるWoL)の話だ。その後WindowsもWoLを扱うようになり、いわば「ソフトウェアによるWoL」が行われるようになった。

Windows Vistaで、電源オフボタンがスタートメニューに搭載され、PCの電源を完全に切らなくなった。Windows 8で電源オン(シャットダウンからの復帰)を高速化するため「高速スタートアップ」(ハイブリッドシャットダウン)が導入された。高速スタートアップは、ACPIのS4を利用するが、アプリケーションは終了させWindowsの実行イメージだけを保存し、メモリ保存時間や復帰時間を高速化する。このときに使われるのが「Reduced Hibernation」で、従来の実行中のメモリイメージ全部を保存する休止状態を「Full Hibernation」という。

このとき「シャットダウン」なのにWoLでイーサーネットインターフェースが電力を消費することは、ユーザーを混乱させるとして、マイクロソフトは、ハイブリッドシャットダウンではWoLを無効にした。Windows 8以降、標準状態ではWoLはスリープ(S3)からの回復だけになった。しかし、WindowsがWoLを扱うことで、USBのイーサーネットアダプターでもWoLが使えるようになった。デバイスマネージャーの「ネットワーク アダプター」で該当のイーサーネットデバイスのプロパティを開き、「電源の管理」タブが表示されれば、そのアダプターはUSB接続であってもWoLでスリープ状態から復帰できる。

現在のWindows10/11は、高速スタートアップが有効になっているためWoLで復帰できない。WoLで復帰できるようにするには高速スタートアップを禁止する(これをクラッシックシャットダウンと呼ぶ)。高速スタートアップをやめるとシャットダウンからの起動が遅くなるが、時間設定でスリープさせておけば、いちいちシャットダウンする必要はない。なお、Powercfg.exeでハイバネーションを有効(/h on)にし、タイプをFull(/h /type full)に設定すると、スリープ後、一定時間で自動的に休止状態(ハイバネーション)に入る。

高速スタートアップの禁止は、コントロールパネルで「電源オプション ⇒ 電源ボタンの操作を選択する ⇒ 現在利用可能ではない設定を変更します」をクリックしていき「高速スタートアップを有効にする」をオフにする。

今回のタイトルネタはラリー・ニーブンの“The Magic Goes Away”(邦題 魔法の国が消えていく)である。魔法の世界にSFっぽい「理屈」をつけたファンタジーのシリーズで、影響をうけた作品も少なくない。