WOLの設定でハマったのでメモ。
NICもBIOSも対応したのに変だなと思ったらOSがシャットダウンする際の設定も必要でした。
Wake-on-LAN(WOL)を有効にするためには、主に次の3つのレベルでの設定が必要:
ネットワークインターフェースカード(NIC)
NICが物理的にWOLに対応している必要がある。ただ、現在のほとんどのNICはこの機能をサポートしているはず。
BIOS/UEFI:
コンピュータのBIOSまたはUEFI設定でWOLを有効にする必要あり。これにより、システムがオフの状態でもNICがネットワークトラフィックを監視し、マジックパケットを受信したときにシステムを起動できるようになる。
オペレーティングシステム(OS):
受信側のOSにおいても、WOLを有効にする設定が必要な場合がある。これは、OSがシャットダウンまたはスリープ状態に入るときにWOLを待機状態に設定する必要があるため(NICの電源管理オプションをシャットダウン前にWOL待機指示)。
NICがサポートしているとして、BIOSの設定。
BIOSの起動は、PCやマザーボードの説明書で確認。
ACPI> Onboard LAN Power ON を Enableに。
その後、Save Changes and Exit で変更を保存して再起動。
ここでは、Ubuntu 22.04 について。
Ubuntu 22.04 以降では、ネットワーク設定は netplan で書くのがモダンらしいので、netplan で設定を行う。
起動時にレンダラが設定を反映するため、永続化されます。
(/etc/rc.local や、/etc/network/interfaces での説明はここにはない)
netplan の設定は、/etc/netplan/ ディレクトリ内にある。
デフォルトは、01-network-manager-all.yaml のようである。
だが、これを直接、編集するのは望ましくない。アプデなどで初期化され、カスタマイズが消えると面倒くさいためである。
デフォルトをバックアップした後に編集するでもよいが、netplanは yamlが複数あるばあい、ファイル名の小さな順に読み、重なる設定を上書きしていく。
なので、例えば 99-config.yaml のようにコピーしたのを編集するもよい。
すると、最後に読まれて、有効な設定が期待される。
network:
ethernets:
eth0:
wakeonlan: true
と、マジックパケットの受信を行うインタフェースに、wakeonlan: true を追記するだけである。
うちの例:
GNU nano 6.2 /etc/netplan/99-config.yaml
network:
version: 2
renderer: NetworkManager
ethernets:
enp1s0:
dhcp4: false
optional: true
wakeonlan: true
...(以下略)...
書き終えたら、
sudo netplan apply
で反映。
ethtool で Wake-on : g が確認できればよい。
$sudo ethtool enp1s0
Settings for enp1s0:
Supported ports: [ TP MII ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
2500baseT/Full
Supported pause frame use: Symmetric Receive-only
Supports auto-negotiation: Yes
Supported FEC modes: Not reported
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
2500baseT/Full
Advertised pause frame use: Symmetric Receive-only
Advertised auto-negotiation: Yes
Advertised FEC modes: Not reported
Link partner advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Link partner advertised pause frame use: Symmetric Receive-only
Link partner advertised auto-negotiation: Yes
Link partner advertised FEC modes: Not reported
Speed: 1000Mb/s
Duplex: Full
Auto-negotiation: on
master-slave cfg: preferred slave
master-slave status: slave
Port: Twisted Pair
PHYAD: 0
Transceiver: external
MDI-X: Unknown
Supports Wake-on: pumbg
Wake-on: g
Link detected: yes
無効だと、Wake-on: d となる。
デバイスマネージャとかで該当のNICを探し、詳細設定とかの中に 有効化するオプションがあるはずです。
WOL有効にしたインタフェースがマジックパケットを受信すると、マシンが起動します。マジックパケットは、その機能のあるルータとかネットワーク機器から送信できます。
うちにはないので、常時起動してる管理マシン(linux)をVPN経由で操作し、マジックパケットを出します。
管理マシン(linux)に、wakeonlan パッケージが導入済みとして、
wakeonlan <TARGET_MAC>
で送信されます。
ターゲットサブネットのブロードキャストを明示することもできます:
wakeonlan -i 192.168.1.255 xx:xx:xx:xx:xx:xx
シェルスクリプトにして便利にします。
GNU nano 6.2 /usr/local/bin/wake_up.sh
#!/bin/bash
# Wake-on-LANパケットを送信するシェルスクリプト
# 対象のMACアドレス
TARGET_MAC1="aa:aa:aa:aa:aa:aa"
TARGET_MAC2="bb:bb:bb:bb:bb:bb"
# wakeonlanコマンドを使用してマジックパケットを送信
wakeonlan -i 192.168.1.255 $TARGET_MAC1
wakeonlan -i 192.168.1.255 $TARGET_MAC2
上記の例だと、管理PCのターミナルから、
wake_up.sh
で、同じサブネット(192.168.1.255/24として)にある、MACアドレスが aa:aa:aa:aa:aa:aa と、bb:bb:bb:bb:bb:bb を持つ、2つの機器が起動します。
はまったりした部分
マジックパケットの送信先は物理カードのMACアドレスです。WOL起動したいマシン上でip link show <インタフェース名>
で確認。
手元のマシンがARPで取得してるMACアドレスは、例えば対象機器がもつ仮想ブリッジの仮想MACアドレスかも知れません(これは電源を切ると見えなくなる)。
イーサカード(物理層とデータリンク層)だけで通信したいので、ブロードキャストで届く範囲にある必要がある。ARPやIP(イーサより上位レイヤ)はOSが起動してないと動作しないため。
ルータ超えをするには何らかの工夫が必要(例のようにVPN経由で常時ONの管理PCから起動、WOL対応したルータやFWでの設定、中継機器・・・)。
yamlはデリケートであります。インデントはスペースのみで、スペース2つ単位が標準です。タブを使ってはだめです。
構文チェッカーとして、
sudo netplan generate
があり、
コンフィグをミスっても、一定時間で元に戻る
sudo netplan try
という便利なのがあります。
初めは気が狂いそうになりますがそのうち慣れます。