Try   HackMD

Wake On LAN の有効化(Ubuntu Server 22.04)

WOLの設定でハマったのでメモ。
NICもBIOSも対応したのに変だなと思ったらOSがシャットダウンする際の設定も必要でした。

Overview

Wake-on-LAN(WOL)を有効にするためには、主に次の3つのレベルでの設定が必要:

ネットワークインターフェースカード(NIC)

NICが物理的にWOLに対応している必要がある。ただ、現在のほとんどのNICはこの機能をサポートしているはず。

BIOS/UEFI:

コンピュータのBIOSまたはUEFI設定でWOLを有効にする必要あり。これにより、システムがオフの状態でもNICがネットワークトラフィックを監視し、マジックパケットを受信したときにシステムを起動できるようになる。

オペレーティングシステム(OS):

受信側のOSにおいても、WOLを有効にする設定が必要な場合がある。これは、OSがシャットダウンまたはスリープ状態に入るときにWOLを待機状態に設定する必要があるため(NICの電源管理オプションをシャットダウン前にWOL待機指示)。

BIOS

NICがサポートしているとして、BIOSの設定。

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

BIOSの起動は、PCやマザーボードの説明書で確認。
ACPI> Onboard LAN Power ON を Enableに。

その後、Save Changes and Exit で変更を保存して再起動。

OSでの設定

ここでは、Ubuntu 22.04 について。

Ubuntu 22.04 以降では、ネットワーク設定は netplan で書くのがモダンらしいので、netplan で設定を行う。
起動時にレンダラが設定を反映するため、永続化されます。

(/etc/rc.local や、/etc/network/interfaces での説明はここにはない)

netplan の yaml の基本

netplan の設定は、/etc/netplan/ ディレクトリ内にある。

デフォルトは、01-network-manager-all.yaml のようである。
だが、これを直接、編集するのは望ましくない。アプデなどで初期化され、カスタマイズが消えると面倒くさいためである。

デフォルトをバックアップした後に編集するでもよいが、netplanは yamlが複数あるばあい、ファイル名の小さな順に読み、重なる設定を上書きしていく。
なので、例えば 99-config.yaml のようにコピーしたのを編集するもよい。

すると、最後に読まれて、有効な設定が期待される。

netplan での WakeOnLAN(WOL)設定

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

で反映。

WOLが有効になったか確認

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 となる。

Windowsとかの場合

デバイスマネージャとかで該当のNICを探し、詳細設定とかの中に 有効化するオプションがあるはずです。

linuxからマジックパケットを送信する

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つの機器が起動します。

トラブルシューティング

はまったりした部分

マジックパケットの送信先は物理NICのMACアドレス

マジックパケットの送信先は物理カードのMACアドレスです。WOL起動したいマシン上でip link show <インタフェース名>で確認。
手元のマシンがARPで取得してるMACアドレスは、例えば対象機器がもつ仮想ブリッジの仮想MACアドレスかも知れません(これは電源を切ると見えなくなる)。

ルータは超えられない

イーサカード(物理層とデータリンク層)だけで通信したいので、ブロードキャストで届く範囲にある必要がある。ARPやIP(イーサより上位レイヤ)はOSが起動してないと動作しないため。

ルータ超えをするには何らかの工夫が必要(例のようにVPN経由で常時ONの管理PCから起動、WOL対応したルータやFWでの設定、中継機器・・・)。

netplanのyamlエラー

yamlはデリケートであります。インデントはスペースのみで、スペース2つ単位が標準です。タブを使ってはだめです。

構文チェッカーとして、

sudo netplan generate

があり、

コンフィグをミスっても、一定時間で元に戻る

sudo netplan try

という便利なのがあります。

初めは気が狂いそうになりますがそのうち慣れます。