前回は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っぽい「理屈」をつけたファンタジーのシリーズで、影響をうけた作品も少なくない。