LinuxでWake-on-LANのOS設定を有効化する

概要

Ubuntu / CentOS を対象に、OS側のWake-on-LAN設定を有効化します。この記事で対象とするバージョンは次の通りです。

  • Ubuntu 20.04 / 18.04
  • CentOS 7 / 8

OSによって設定方法が異なるので、以下ではそれぞれ分けて記載します。なお、BIOS/UEFIでの設定は各PC/サーバで別途設定が必要です。

Wake-on-LANについて

Wake-on-LANは、PCがシャットダウン状態にあってもネットワーク上のパケットを待ち受けておき、特定のUDPパケットを受けたときにPCを起動する仕組みです。利用するにはBIOSの設定とOSの設定の両方が必要です。このパケットは通常、255.255.255.255に向けてUDPでブロードキャストされ、ポート番号は7番や9番が使われるようです。パケットの中身は、FF:FF:FF:FF:FF:FF に続けて対象のMACアドレスが16回繰り返される、 6 + 6*16 = 102 バイトのデータです。マジックパケットと呼ばれます。記事の最後にマジックパケットを生成してブロードキャストするPythonスクリプトのサンプルを置いておきます。

Ubuntu 20.04 / 18.04

まずは ethtool コマンドでWoL有効状態を確認します。

sudo ethtool enp1s0f0 | grep Wake-on
	Supports Wake-on: pumbg
	Wake-on: g

ここで、 Wake-on: g となっていれば、既にWoL設定が有効化されています。そうでなければ、次のコマンドで有効化できます。ただし、再起動すると設定が揮発します。

sudo ethtool -s enp1s0f0 wol g

設定を恒久化するには、 /etc/netplan/*.yml を編集します。インストール直後の状態でファイルが存在するはずなので、既存の設定ファイルを編集しましょう。

# This is the network config written by 'subiquity'
network:
  ethernets:
    enp1s0f0:
      match:
        macaddress: 6c:4b:90:ef:d1:f4
      dhcp4: true
      wakeonlan: true
  version: 2

対象のインタフェース名に match / macaddress を追加し、 wakeonlan に true を設定します。macaddressの指定がないと動作しません。有効化するには、再起動するか、netplanの内容を手動で反映します。

sudo netplan apply

ethtoolで対象インタフェースを確認し、出力結果で Wake-on: g となっていれば成功です。

CentOS 7 / 8

Ubuntuと同様に ethtool コマンドで状態を確認します。既にWoLが有効化されていなければ、 /etc/sysconfig/network-scripts/ifcfg-* の最終行に ETHTOOL_OPTS の行を追記します。

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=enp1s0f0
UUID=6bf3182d-e6fb-40b8-8bd7-c86158654ceb
DEVICE=enp1s0f0
ONBOOT=yes
ETHTOOL_OPTS="wol g"

編集が完了したら、下記コマンドで設定を反映しましょう。

# for CentOS 7.x
sudo systemctl restart network
# for CentOS 8.x
sudo systemctl restart NetworkManager

設定が反映されているかどうかは、 ethtool コマンドで確認してください。

Wake-on-LAN起動テスト

Webに落ちているWoLプログラムを拾ってきて試すと良い。下記は、上述した構造のデータをUDPでブロードキャストするプログラムのサンプル。7行目のMACアドレスを変更すれば動く。マジックパケット送出元は無線LAN接続でも良いが、通常は同一LANに接続されている必要があることに注意(ルータを挟むとブロードキャストが転送されないため)。

#!/usr/bin/env python3

import binascii
import socket

# Wake-on-LANで起動したいPCのMACアドレス
mac = '6c:4b:90:ef:d1:f4'

# UDPでブロードキャストするためのソケットを用意する
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)

# FF:FF:FF:FF:FF:FFが1回、MACアドレスが16回続くペイロードを作る
payload = b'\xff' * 6 + binascii.unhexlify(mac.replace(':', '')) * 16

# ブロードキャストする
s.sendto(payload, ('255.255.255.255', 9))

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA