# 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の設定。 ![IMG_0081](https://hackmd.io/_uploads/Hy8pxUga6.jpg) 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 ``` という便利なのがあります。 初めは気が狂いそうになりますがそのうち慣れます。