「Wake-on-LAN」の版間の差分

提供: ArchWiki
ナビゲーションに移動 検索に移動
(→‎Battery draining problem: 削除した記事から復活)
 
(5人の利用者による、間の15版が非表示)
5行目: 5行目:
 
== ハードウェア設定 ==
 
== ハードウェア設定 ==
   
Wake-on-LAN を使うにはコンピュータのマザーボードや [[wikipedia:NIC|NIC]] が Wake-on-LAN をサポートしている必要があります。無線カードは Wake-on-LAN をサポートしていないため、ルーターや他のコンピュータに物理的に (ケーブルで) 接続しなくてはなりません。
+
Wake-on-LAN を使うにはコンピュータのマザーボードや [[wikipedia:ja:ネットワークカード|NIC]] が Wake-on-LAN をサポートしている必要があります。無線カードは Wake-on-LAN をサポートしていないため、ルーターや他のコンピュータに物理的に (ケーブルで) 接続しなくてはなりません。
   
 
また、Wake-on-LAN 機能は PC の BIOS で有効にする必要があります。マザーボードのメーカーによって Wake-on-LAN 機能には様々な名前がつけられています。"PCI Power up" や "Allow PCI wake up event"、あるいは "Boot from PCI/PCI-E" というような単語を追って下さい。
 
また、Wake-on-LAN 機能は PC の BIOS で有効にする必要があります。マザーボードのメーカーによって Wake-on-LAN 機能には様々な名前がつけられています。"PCI Power up" や "Allow PCI wake up event"、あるいは "Boot from PCI/PCI-E" というような単語を追って下さい。
   
一部のマザーボードには厄介なバグが存在し、特定の状況下でシャットダウンの代わり起動を引き起こすことがあります ([https://bbs.archlinux.org/viewtopic.php?id=173648 このスレッド] などを参照)このバグが発現しないように、マシンで以下の設定を行うことを推奨します:
+
一部のマザーボードには厄介なバグが存在し、BIOS WoL が有効にされている限り[[#シャットダウンコンピュータが起動する|シャットダウン後すぐに(またはランダムに)コンピュータが起動する]]という問題を引き起こすことがあります。
# USB の設定に関する "xHCI" を全て無効化する。
 
# EuP 2013 がオプションとして存在する場合に無効化する。
 
# (任意) キーボードによる WOL を有効化する。
 
   
  +
== ソフトウェア設定 ==
{{Note|There are mixed opinions as to the value of #3 above and it may be motherboard dependent.}}
 
   
  +
=== Enable WoL on the network adapter ===
== ソフトウェア設定 ==
 
   
 
ハードウェアによっては、ネットワークドライバーによって WOL がデフォルトでオフになっていることがあります。WOL の状態を確認したり、設定を変更するために、{{Pkg|ethtool}} をインストールして下さい。
 
ハードウェアによっては、ネットワークドライバーによって WOL がデフォルトでオフになっていることがあります。WOL の状態を確認したり、設定を変更するために、{{Pkg|ethtool}} をインストールして下さい。
23行目: 20行目:
   
 
{{hc|<nowiki># ethtool net0 | grep Wake-on</nowiki>|<nowiki>
 
{{hc|<nowiki># ethtool net0 | grep Wake-on</nowiki>|<nowiki>
Supports Wake-on: pumbag
+
Supports Wake-on: pumbag
Wake-on: d
+
Wake-on: d
 
</nowiki>}}
 
</nowiki>}}
   
35行目: 32行目:
 
上記のコマンドは再起動してしまうと効果を失ってしまうため、何らかの方法で自動的に実行されるようにする必要があります。以下のサブセクションに一般的な方法を載せています。
 
上記のコマンドは再起動してしまうと効果を失ってしまうため、何らかの方法で自動的に実行されるようにする必要があります。以下のサブセクションに一般的な方法を載せています。
   
=== netctl を使う ===
+
=== Make it persistent ===
   
  +
==== systemd.link を使う ====
netctl を使う場合、以下の設定を netctl のプロファイルに追加することで永続化させることができます:
 
   
  +
systemd を使うことでリンクレベルの設定ができます。実際の設定は systemd に組み込まれている {{ic|net_setup_link}} udev によって行われます。ネットワークリンクファイルに {{ic|WakeOnLan}} オプションを追加してください:
{{hc|/etc/netctl/''profile''|2=
 
ExecUpPost='/usr/bin/ethtool -s net0 wol g'
 
}}
 
   
  +
{{hc|/etc/systemd/network/50-wired.link|2=
=== systemd を使う ===
 
 
[[systemd-networkd]] を使ってマシンのネットワークを設定している場合、{{ic|systemd.link}} の設定を使うことで簡単に Wake-On-Lan を有効にできます。{{ic|WakeOnLan}} オプションをネットワークの link ファイルに追加してください:
 
 
{{hc|/etc/systemd/network/wired.link|2=
 
 
[Link]
 
[Link]
 
WakeOnLan=magic
 
WakeOnLan=magic
  +
...
 
}}
 
}}
   
  +
{{Note|上記の設定はリンクレベルにしか適用されません。[[NetworkManager]] や [[systemd-networkd]] などネットワーク層のデーモンとは無関係です。}}
詳しくは {{ic|man systemd.link}} を参照。
 
  +
  +
詳しくは [[systemd-networkd#link ファイル]]や {{ic|man systemd.link}} を参照。
   
=== スタンドアロンの systemd サービスを使う ===
+
==== systemd サービスを使う ====
   
 
上述の {{ic|systemd.link}} オプションと同じ効果がありますが、スタンドアロンの systemd サービスを使っています。
 
上述の {{ic|systemd.link}} オプションと同じ効果がありますが、スタンドアロンの systemd サービスを使っています。
72行目: 66行目:
 
}}
 
}}
   
もしくは {{AUR|wol-systemd}}{{Broken package link|{{aur-mirror|wol-systemd}}}} パッケージをインストールして下さい。
+
もしくは {{AUR|wol-systemd}} パッケージをインストールして下さい。
   
{{ic|wol@''interface''.service}} を[[起動]]することで新しいサービスを有効にして下さい。
+
その後 {{ic|wol@''interface''.service}} を[[起動]]することで新しいサービスを有効にして下さい。
   
=== udev を使う ===
+
==== udev を使う ====
   
udev を使うことでデバイスが認識されたときにコマンドを実行することができます。以下 {{ic|/etc/udev/rules.d/50-wol.rules}} に記述してください (N は使用するインターフェの番号置き換えて下さい):
+
[[udev]] を使うことでデバイスが認識されたときにコマンドを実行することができます。以下のルールは {{ic|enp*}} にマッチする全ての[[ネットワークインターフェ]]で WOL を有効します:
   
  +
{{hc|/etc/udev/rules.d/99-wol.rules|<nowiki>
ACTION=="add", SUBSYSTEM=="net", KERNEL=="netN", RUN+="/usr/bin/ethtool -s %k wol g"
 
  +
ACTION=="add", SUBSYSTEM=="net", NAME=="enp*", RUN+="/usr/bin/ethtool -s $name wol g"
  +
</nowiki>}}
  +
  +
{{ic|$name}} はマッチしたデバイスの {{ic|NAME}} 変数の値に置き換えられます。
   
  +
{{Note|設定ファイルの名前は重要です。systemd v197 から[[ネットワーク設定#デバイス名|固定的なデバイス名]]が導入されたことで、特定のネットワークインターフェイスにマッチするルールは {{ic|80-net-name-slot.rules}} よりもアルファベット順で後に来るようにして、デバイスに名前が割り当てられた後に適用する必要があります。}}
上記の udev ルールによって、netN デバイスが認識されるとすぐに {{ic|/usr/bin/ethtool -s netN wol g}} が実行されます。全てのデバイスで Wake-on-LAN を有効化したいときは、N を '*' に置き換えます:
 
   
  +
{{Warning|[[udev]] はデバイスが認識されたときにマッチを行います。実行されるのは (ルートディレクトリに制御が移る前の) [[initramfs]] あるいはメイン環境のどちらかになります。順番は必ずしもいつも同じとは限りません。initramfs に必要な udev ルール ({{ic|/etc/udev/rules.d}}) と補助バイナリ ({{ic|/usr/bin/ethtool}}) が含まれていることを確認してください。}}
ACTION=="add", SUBSYSTEM=="net", KERNEL=="net*", RUN+="/usr/bin/ethtool -s %k wol g"
 
   
=== cron を使う ===
+
==== cron を使う ====
   
 
crontab で "@reboot" を使うことでコンピュータを起動するたびにコマンドを実行させることができます。まず、[[Cron#インストール|cron]] をインストールして、それから root ユーザーの [[cron#基本的なコマンド|crontab]] を編集して以下の行を記述して下さい:
 
crontab で "@reboot" を使うことでコンピュータを起動するたびにコマンドを実行させることができます。まず、[[Cron#インストール|cron]] をインストールして、それから root ユーザーの [[cron#基本的なコマンド|crontab]] を編集して以下の行を記述して下さい:
   
 
@reboot /usr/bin/ethtool -s [net-device] wol g
 
@reboot /usr/bin/ethtool -s [net-device] wol g
  +
  +
==== NetworkManager ====
  +
  +
バージョン 1.0.6 から NetworkManager には Wake-on-LAN の制御が追加されました [https://www.phoronix.com/scan.php?page=news_item&px=NetworkManager-WoL-Control]。nmcli を使ってマジックパケットで Wake-on-LAN を有効にできます。
  +
  +
まず、有線接続の名前を検索してください:
  +
  +
{{hc|# nmcli con show|2=
  +
NAME UUID TYPE DEVICE
  +
wired1 612e300a-c047-4adb-91e2-12ea7bfe214e 802-3-ethernet enp0s25
  +
}}
  +
  +
Wake-on-LAN の現在の設定は以下のようにして確認できます:
  +
  +
{{hc|# nmcli c show "wired1" <nowiki>|</nowiki> grep 802-3-ethernet.wake-on-lan|2=
  +
802-3-ethernet.wake-on-lan: default
  +
802-3-ethernet.wake-on-lan-password: --
  +
}}
  +
  +
マジックパケットを使って Wake-on-LAN を有効にするには:
  +
  +
# nmcli c modify "wired1" 802-3-ethernet.wake-on-lan magic
  +
  +
設定したら再起動してください。設定を有効にするには再起動が2回必要な場合があります。
  +
  +
バージョン 1.2.0 から {{Pkg|nm-connection-editor}} を使ってグラフィカルに Wake-on-LAN の設定を変えることも可能です。
  +
  +
=== Enable WoL in TLP ===
  +
  +
When using [[TLP]] for suspend/hibernate, the {{ic|WOL_DISABLE}} setting should be set to {{ic|N}} in {{ic|/etc/tlp.conf}} to allow resuming the computer with WoL.
   
 
== 電源の投入 ==
 
== 電源の投入 ==
129行目: 157行目:
 
$ wol -i ''target_IP'' ''target_MAC_address''
 
$ wol -i ''target_IP'' ''target_MAC_address''
   
  +
=== インターネットを経由する ===
{{Tip|If you intend to continue using Wake-on-LAN, it is recommended to assign a static IP address to the target computer.}}
 
   
  +
送信元と送信先のコンピュータが NAT ルーターで区切られている場合、別の解決方法が考えられます。
=== ポートフォワーディングを使う ===
 
   
  +
* ルータが ''WoL'' をサポートしている場合、ローカルネットワーク内でパケットを適切にブロードキャストしてくれることが期待できる。
送信元と送信先のコンピュータがルーターで区切られている場合、[[wikipedia:Port forwarding|ポートフォワーディング]]によって Wake-on-LAN を使うことができます。特定のポートを使用する全ての信号を送信先の PC の内部 IP に転送するようにルーターが設定されている必要があります。設定に関する詳細は[[ファイアウォール]]を見て下さい。
 
   
  +
それ以外の場合、Wake-on-Lan は [[wikipedia:Port forwarding|ポートフォワーディング]] を介して実現できます。ルータは、以下のいずれかのオプションを使用して設定する必要があります:
電源を投入するには:
 
  +
  +
* 別のポートを送信先のマシンに転送するようにルーターを設定 (LAN 上で送信先のマシンに固定 IP アドレスを割り当てる必要があります)。
  +
* 特定のポートを[[wikipedia:ja:ブロードキャストアドレス|ブロードキャストアドレス]]に転送するようにルーターを設定 (ルーターによっては設定できない場合があります)。{{bc|$ ip neighbor add 192.168.1.254 lladdr FF:FF:FF:FF:FF:FF dev net0}} この例では、ネットワークが ''192.168.1.0/24'' であり、ネットワークインターフェイスとして ''net0'' を使用しています。次に、UDP ポート 9 を 192.168.1.254 に転送します。この解決策は、[[Wikipedia:Tomato_(firmware)|Tomato]] を実行している Linksys WRT54G および Verizon FIOS ActionTec ルータで正常にテストされました。[[Wikipedia:DD-WRT|DD-WRT]] ファームウェア付きルータでの手順については、[https://www.dd-wrt.com/wiki/index.php/WOL#Remote_Wake_On_LAN_via_Port_Forwarding このチュートリアル] を参照し、[[Wikipedia:OpenWrt|OpenWrt]] ファームウェア付きルータの場合は、[https://openwrt.org/docs/guide-user/services/w_o_l/wol このチュートリアル] を参照してください。
  +
  +
どちらの場合でも電源を投入するには以下のコマンドを実行します:
   
 
$ wol -p ''forwarded_port'' -i ''router_IP'' ''target_MAC_address''
 
$ wol -p ''forwarded_port'' -i ''router_IP'' ''target_MAC_address''
   
  +
== その他 ==
ルーターを介して複数のコンピュータが存在する場合、IP ごとに別々のポートフォワードを割り当てることを推奨します。
 
   
  +
=== Check reception of the magic packets ===
=== インターネットを使う ===
 
   
  +
In order to make sure the WoL packets reach the target computer, one can listen to the UDP port, usually port 9, for magic packets.
The syntax needed in this case:
 
  +
The magic packet frame expected contains 6 bytes of FF followed by 16 repetitions of the target computer's MAC (6 bytes each) for a total of 102 bytes.
   
  +
==== Using netcat ====
$ wol -p ''target_port'' -i ''target_IP_or_hostname'' ''target_MAC_address''
 
   
  +
This can be performed by installing {{Pkg|gnu-netcat}} on the target computer and using the following command:
*Assuming that you know the external IP of the target machine, and that the [[#ポートフォワーディングを使う|router ports]] on both sides have been forwarding correctly, then this should be exactly as the syntax states.
 
   
  +
# nc --udp --listen --local-port=9 --hexdump
Usually it is necessary to forward your wol port (typically UDP 9) to the broadcast address on your network, not to a particular IP. Most routers do not allow you to forward to broadcast, however if you can get shell access to your router (through telnet, ssh, serial cable, etc) you can implement this workaround:
 
$ ip neighbor add 192.168.1.254 lladdr FF:FF:FF:FF:FF:FF dev net0
 
   
  +
Then wait for the incoming traffic to appear in the {{ic|nc}} terminal.
(The above command assumes your network is 192.168.1.0/24 and use net0 as network interface). Now, forward UDP port 9 to 192.168.1.254. This has worked for me on a Linksys WRT54G running Tomato, and on the Verizon FIOS ActionTec router.
 
   
  +
{{Note|The firewall on the machine itself does not need to be opened for wake-on-LAN to work (interface's processing happen in the NIC, before the firewall). However, for debugging purposes with netcat, you still need to temporarily open that port.}}
For notes on how to do it on DD-WRT routers, see [http://www.dd-wrt.com/wiki/index.php/WOL#Remote_Wake_On_LAN_via_Port_Forwarding this tutorial].
 
   
== その他 ==
+
==== Using ngrep ====
   
  +
Install {{Pkg|ngrep}} on the target computer and type the following command:
=== バッテリーが食われる問題 ===
 
ノートパソコンによってはシャットダウン後にバッテリーを消費する問題が存在します [http://ubuntuforums.org/archive/index.php/t-1729782.html]。WOL が有効になっているのが原因です。問題を解決するには、''ethtool'' を使って無効化して下さい:
 
   
  +
# ngrep '\xff{6}(.{6})\1{15}' -x port 9
# ethtool -s net0 wol d
 
   
 
=== WOL サンプルスクリプト ===
 
=== WOL サンプルスクリプト ===
  +
以下は複数のマシンで自動的に WOL を使うスクリプトです:
Here is a script to automate WOL to several different machines:
 
   
 
{{bc|<nowiki>
 
{{bc|<nowiki>
175行目: 207行目:
 
ghost=01:1a:d2:56:6b:e6
 
ghost=01:1a:d2:56:6b:e6
   
while [ "$input1" != quit ]; do
+
while true; do
 
echo "Which PC to wake?"
 
echo "Which PC to wake?"
 
echo "p) powerless"
 
echo "p) powerless"
184行目: 216行目:
 
echo "q) quit and take no action"
 
echo "q) quit and take no action"
 
read input1
 
read input1
  +
if [ $input1 == p ]; then
 
  +
case $input1 in
  +
p)
 
/usr/bin/wol $powerless
 
/usr/bin/wol $powerless
exit 1
+
;;
fi
 
   
  +
m)
if [ $input1 == m ]; then
 
 
/usr/bin/wol $monster
 
/usr/bin/wol $monster
exit 1
+
;;
fi
 
   
  +
c)
if [ $input1 == c ]; then
 
 
/usr/bin/wol $chronic
 
/usr/bin/wol $chronic
exit 1
+
;;
fi
 
   
  +
g)
# this line requires an IP address in /etc/hosts for ghost
 
  +
# this line requires an IP address in /etc/hosts for ghost
# and should use wol over the internet provided that port 9
 
  +
# and should use wol over the internet provided that port 9
# is forwarded to ghost on ghost's router
 
  +
# is forwarded to ghost on ghost's router
 
if [ $input1 == g ]; then
 
 
/usr/bin/wol -v -h -p 9 ghost $ghost
 
/usr/bin/wol -v -h -p 9 ghost $ghost
exit 1
+
;;
fi
 
   
  +
b)
if [ $input1 == b ]; then
 
 
/usr/bin/wol $monster
 
/usr/bin/wol $monster
 
echo "monster sent, now waiting for 40sec then waking chronic"
 
echo "monster sent, now waiting for 40sec then waking chronic"
 
sleep 40
 
sleep 40
 
/usr/bin/wol $chronic
 
/usr/bin/wol $chronic
exit 1
+
;;
fi
 
   
  +
Q|q)
if [ $input1 == Q ] || [ $input1 == q ]; then
 
echo "later!"
+
echo "later!"
  +
break
exit 1
 
  +
;;
fi
 
  +
  +
esac
   
 
done
 
done
226行目: 256行目:
   
 
== トラブルシューティング ==
 
== トラブルシューティング ==
  +
  +
=== NetworkManager ===
  +
  +
==== Network adapter is still powered off on shutdown ====
  +
  +
Setting auto negotiation to {{ic|yes}} may help if WOL is configured through ''nmcli'' and network adapter is still powered off on shutdown.
  +
  +
Set it using:
  +
  +
# nmcli c modify "wired1" 802-3-ethernet.auto-negotiate yes
  +
  +
=== シャットダウン後にコンピュータが起動する ===
  +
一部のマザーボードには厄介なバグが存在し、BIOS で WoL が有効にされている限りシャットダウン後すぐに(またはランダムに)コンピュータが起動するという問題を引き起こすことがあります ([https://bbs.archlinux.org/viewtopic.php?id=173648 このスレッド]などを参照)。
  +
  +
==== BIOS の設定を変更して修正する ====
  +
次の設定を BIOS で変更すると、いくつかのマザーボードでは問題が解決することがあります。
  +
# USB の設定に関する "xHCI" を全て無効化する (これは起動時の USB 3.0 を無効にしてしまいます)。
  +
# EuP 2013 がオプションとして存在する場合に無効化する。
  +
# (任意) キーボードによる WOL を有効化する。
  +
{{Note|上記の3番目の設定については賛否が分かれておりマザーボードによっても変わります。}}
  +
  +
==== カーネルの quirks を使用して修正する ====
  +
次の文をカーネルのブートパラメーターに追加することでも問題を解決できます: {{ic|1=xhci_hcd.quirks=270336}}
  +
  +
これは次の quirks を有効にします:
  +
* {{ic|XHCI_SPURIOUS_REBOOT}}
  +
* {{ic|XHCI_SPURIOUS_WAKEUP}}
  +
  +
=== バッテリーが食われる問題 ===
  +
  +
ノートパソコンによってはシャットダウン後にバッテリーを消費する問題が存在します [https://ubuntuforums.org/archive/index.php/t-1729782.html]。WOL が有効になっているのが原因です。問題を解決するには、ethtool を使って無効化して下さい:
  +
  +
# ethtool -s net0 wol d
   
 
=== Realtek ===
 
=== Realtek ===
   
Realtek 8168 8169 8101 8111(C) が搭載された NIC (カード/オンボード) を使っている場合、起動時に NIC が無効になってしまって接続ランプが灯らないことがあります。[[ネットワーク設定#Realtek が使えない / WOL の問題]]を見て下さい。
+
Realtek 8168 8169 8101 8111(C) が搭載された NIC (カード/オンボード) を使っている場合、起動時に NIC が無効になってしまって接続ランプが灯らないことがあります。[[イーサネット#Realtek が使えない / WOL の問題]]を見て下さい。
  +
  +
MSI B85M-E45 マザーボード (BIOS バージョン V10.9) のオンボードチップセット Realtek 8111G では、コンピュータの電源が切れているときにネットワークスイッチのリンクライトは光っているのに Wake-on-LAN が機能しない場合、一度 {{Pkg|r8168}} カーネルモジュールを使ってシステムを起動してから、カーネルに組み込まれている r8169 に戻すことで問題が解決する場合があります。
  +
  +
=== alx driver support ===
   
  +
For some newer Atheros-based NICs (such as Atheros AR8161 and Killer E2500), WOL support has been disabled in the mainline {{ic|alx}} module due to a bug causing unintentional wake-up (see [https://lore.kernel.org/netdev/1372880891-12320-1-git-send-email-johannes@sipsolutions.net/ this patch discussion]). A patch can be applied (or installed as a [[dkms]] module using the {{AUR|alx-wol-dkms}} package) which both restores WOL support and fixes the underlying bug, as outlined in [https://bugzilla.kernel.org/show_bug.cgi?id=61651 this thread].
== 参照 ==
 
   
  +
See also the pre-patched sources in [https://github.com/Snugface/alx].
* [http://www.depicus.com/wake-on-lan/woli.aspx Wake-On-Lan]
 

2023年4月24日 (月) 11:56時点における最新版

Wake-on-LAN (WOL) はネットワーク接続 (インターネットまたはイントラネット) からコンピュータの電源を入れる機能です。

ハードウェア設定

Wake-on-LAN を使うにはコンピュータのマザーボードや NIC が Wake-on-LAN をサポートしている必要があります。無線カードは Wake-on-LAN をサポートしていないため、ルーターや他のコンピュータに物理的に (ケーブルで) 接続しなくてはなりません。

また、Wake-on-LAN 機能は PC の BIOS で有効にする必要があります。マザーボードのメーカーによって Wake-on-LAN 機能には様々な名前がつけられています。"PCI Power up" や "Allow PCI wake up event"、あるいは "Boot from PCI/PCI-E" というような単語を追って下さい。

一部のマザーボードには厄介なバグが存在し、BIOS で WoL が有効にされている限りシャットダウン後すぐに(またはランダムに)コンピュータが起動するという問題を引き起こすことがあります。

ソフトウェア設定

Enable WoL on the network adapter

ハードウェアによっては、ネットワークドライバーによって WOL がデフォルトでオフになっていることがあります。WOL の状態を確認したり、設定を変更するために、ethtool をインストールして下さい。

次のコマンドを使ってネットワークデバイスの状態を確認します:

# ethtool net0 | grep Wake-on
         Supports Wake-on: pumbag
    Wake-on: d

上記の値はどのアクティビティが動作するかを定義しています: d (無効), p (PHY アクティビティ), u (ユニキャストアクティビティ), m (マルチキャストアクティビティ), b (ブロードキャストアクティビティ), a (ARP アクティビティ), g (マジックパケットアクティビティ)。WOL を使うには g が必要です。

ドライバーの WOL 機能を有効化するには:

# ethtool -s net0 wol g

上記のコマンドは再起動してしまうと効果を失ってしまうため、何らかの方法で自動的に実行されるようにする必要があります。以下のサブセクションに一般的な方法を載せています。

Make it persistent

systemd.link を使う

systemd を使うことでリンクレベルの設定ができます。実際の設定は systemd に組み込まれている net_setup_link udev によって行われます。ネットワークリンクファイルに WakeOnLan オプションを追加してください:

/etc/systemd/network/50-wired.link
[Link]
WakeOnLan=magic
...
ノート: 上記の設定はリンクレベルにしか適用されません。NetworkManagersystemd-networkd などネットワーク層のデーモンとは無関係です。

詳しくは systemd-networkd#link ファイルman systemd.link を参照。

systemd サービスを使う

上述の systemd.link オプションと同じ効果がありますが、スタンドアロンの systemd サービスを使っています。

/etc/systemd/system/wol@.service
[Unit]
Description=Wake-on-LAN for %i
Requires=network.target
After=network.target

[Service]
ExecStart=/usr/bin/ethtool -s %i wol g
Type=oneshot

[Install]
WantedBy=multi-user.target

もしくは wol-systemdAUR パッケージをインストールして下さい。

その後 wol@interface.service起動することで新しいサービスを有効にして下さい。

udev を使う

udev を使うことでデバイスが認識されたときにコマンドを実行することができます。以下のルールは enp* にマッチする全てのネットワークインターフェースで WOL を有効にします:

/etc/udev/rules.d/99-wol.rules
ACTION=="add", SUBSYSTEM=="net", NAME=="enp*", RUN+="/usr/bin/ethtool -s $name wol g"

$name はマッチしたデバイスの NAME 変数の値に置き換えられます。

ノート: 設定ファイルの名前は重要です。systemd v197 から固定的なデバイス名が導入されたことで、特定のネットワークインターフェイスにマッチするルールは 80-net-name-slot.rules よりもアルファベット順で後に来るようにして、デバイスに名前が割り当てられた後に適用する必要があります。
警告: udev はデバイスが認識されたときにマッチを行います。実行されるのは (ルートディレクトリに制御が移る前の) initramfs あるいはメイン環境のどちらかになります。順番は必ずしもいつも同じとは限りません。initramfs に必要な udev ルール (/etc/udev/rules.d) と補助バイナリ (/usr/bin/ethtool) が含まれていることを確認してください。

cron を使う

crontab で "@reboot" を使うことでコンピュータを起動するたびにコマンドを実行させることができます。まず、cron をインストールして、それから root ユーザーの crontab を編集して以下の行を記述して下さい:

@reboot /usr/bin/ethtool -s [net-device] wol g

NetworkManager

バージョン 1.0.6 から NetworkManager には Wake-on-LAN の制御が追加されました [1]。nmcli を使ってマジックパケットで Wake-on-LAN を有効にできます。

まず、有線接続の名前を検索してください:

# nmcli con show
NAME    UUID                                  TYPE            DEVICE
wired1  612e300a-c047-4adb-91e2-12ea7bfe214e  802-3-ethernet  enp0s25

Wake-on-LAN の現在の設定は以下のようにして確認できます:

# nmcli c show "wired1" | grep 802-3-ethernet.wake-on-lan
802-3-ethernet.wake-on-lan:             default
802-3-ethernet.wake-on-lan-password:    --

マジックパケットを使って Wake-on-LAN を有効にするには:

# nmcli c modify "wired1" 802-3-ethernet.wake-on-lan magic

設定したら再起動してください。設定を有効にするには再起動が2回必要な場合があります。

バージョン 1.2.0 から nm-connection-editor を使ってグラフィカルに Wake-on-LAN の設定を変えることも可能です。

Enable WoL in TLP

When using TLP for suspend/hibernate, the WOL_DISABLE setting should be set to N in /etc/tlp.conf to allow resuming the computer with WoL.

電源の投入

マシンの WOL を実行するには、マシンの MAC アドレスと外部・内部 IP が必要です。

コンピュータの内部 IP アドレスと MAC アドレスを取得するには、次のコマンドを実行:

$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
   inet 127.0.0.1/8 scope host lo
      valid_lft forever preferred_lft forever
   inet6 ::1/128 scope host
      valid_lft forever preferred_lft forever
2: enp1s0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000
    link/ether 48:05:ca:09:0e:6a brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.20/24 brd 192.168.1.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 fe80::6a05:caff:fe09:e6a/64 scope link
       valid_lft forever preferred_lft forever

上記の場合、内部 IP アドレスは 192.168.1.20 で MAC アドレスは 48:05:ca:09:0e:6a です。

WOL を実行するためにマジックパケットを送信できるプログラムとして wol が存在します。

同一の LAN 上にある場合

ネットワークケーブルによって他のコンピュータと直接接続している場合、または LAN の中の通信がファイアウォールで遮断されていない場合、ポートのリダイレクトについて考える必要がないため簡単に Wake-on-LAN を使うことができます。

一番シンプルなケース、デフォルトのブロードキャストアドレス 255.255.255.255 を使用:

$ wol target_MAC_address

特定のサブネットやホストにだけマジックパケットを送信するには、-i スイッチを使用:

$ wol -i target_IP target_MAC_address

インターネットを経由する

送信元と送信先のコンピュータが NAT ルーターで区切られている場合、別の解決方法が考えられます。

  • ルータが WoL をサポートしている場合、ローカルネットワーク内でパケットを適切にブロードキャストしてくれることが期待できる。

それ以外の場合、Wake-on-Lan は ポートフォワーディング を介して実現できます。ルータは、以下のいずれかのオプションを使用して設定する必要があります:

  • 別のポートを送信先のマシンに転送するようにルーターを設定 (LAN 上で送信先のマシンに固定 IP アドレスを割り当てる必要があります)。
  • 特定のポートをブロードキャストアドレスに転送するようにルーターを設定 (ルーターによっては設定できない場合があります)。
    $ ip neighbor add 192.168.1.254 lladdr FF:FF:FF:FF:FF:FF dev net0
    この例では、ネットワークが 192.168.1.0/24 であり、ネットワークインターフェイスとして net0 を使用しています。次に、UDP ポート 9 を 192.168.1.254 に転送します。この解決策は、Tomato を実行している Linksys WRT54G および Verizon FIOS ActionTec ルータで正常にテストされました。DD-WRT ファームウェア付きルータでの手順については、このチュートリアル を参照し、OpenWrt ファームウェア付きルータの場合は、このチュートリアル を参照してください。

どちらの場合でも電源を投入するには以下のコマンドを実行します:

$ wol -p forwarded_port -i router_IP target_MAC_address

その他

Check reception of the magic packets

In order to make sure the WoL packets reach the target computer, one can listen to the UDP port, usually port 9, for magic packets. The magic packet frame expected contains 6 bytes of FF followed by 16 repetitions of the target computer's MAC (6 bytes each) for a total of 102 bytes.

Using netcat

This can be performed by installing gnu-netcat on the target computer and using the following command:

# nc --udp --listen --local-port=9 --hexdump

Then wait for the incoming traffic to appear in the nc terminal.

ノート: The firewall on the machine itself does not need to be opened for wake-on-LAN to work (interface's processing happen in the NIC, before the firewall). However, for debugging purposes with netcat, you still need to temporarily open that port.

Using ngrep

Install ngrep on the target computer and type the following command:

# ngrep '\xff{6}(.{6})\1{15}' -x port 9

WOL サンプルスクリプト

以下は複数のマシンで自動的に WOL を使うスクリプトです:

#!/bin/bash

# definition of MAC addresses
monster=01:12:46:82:ab:4f
chronic=00:3a:53:21:bc:30
powerless=1a:32:41:02:29:92
ghost=01:1a:d2:56:6b:e6

while true; do
echo "Which PC to wake?"
echo "p) powerless"
echo "m) monster"
echo "c) chronic"
echo "g) ghost"
echo "b) wake monster, wait 40sec, then wake chronic"
echo "q) quit and take no action"
read input1

case $input1 in
  p)
  /usr/bin/wol $powerless
  ;;

  m)
  /usr/bin/wol $monster
  ;;

  c)
  /usr/bin/wol $chronic
  ;;

  g)
  # this line requires an IP address in /etc/hosts for ghost
  # and should use wol over the internet provided that port 9
  # is forwarded to ghost on ghost's router
  /usr/bin/wol -v -h -p 9 ghost $ghost
  ;;

  b)
  /usr/bin/wol $monster
  echo "monster sent, now waiting for 40sec then waking chronic"
  sleep 40
  /usr/bin/wol $chronic
  ;;

  Q|q)
  echo "later!"
  break
  ;;

esac

done
echo  "this is the (quit) end!! c-ya!"

トラブルシューティング

NetworkManager

Network adapter is still powered off on shutdown

Setting auto negotiation to yes may help if WOL is configured through nmcli and network adapter is still powered off on shutdown.

Set it using:

# nmcli c modify "wired1" 802-3-ethernet.auto-negotiate yes

シャットダウン後にコンピュータが起動する

一部のマザーボードには厄介なバグが存在し、BIOS で WoL が有効にされている限りシャットダウン後すぐに(またはランダムに)コンピュータが起動するという問題を引き起こすことがあります (このスレッドなどを参照)。

BIOS の設定を変更して修正する

次の設定を BIOS で変更すると、いくつかのマザーボードでは問題が解決することがあります。

  1. USB の設定に関する "xHCI" を全て無効化する (これは起動時の USB 3.0 を無効にしてしまいます)。
  2. EuP 2013 がオプションとして存在する場合に無効化する。
  3. (任意) キーボードによる WOL を有効化する。
ノート: 上記の3番目の設定については賛否が分かれておりマザーボードによっても変わります。

カーネルの quirks を使用して修正する

次の文をカーネルのブートパラメーターに追加することでも問題を解決できます: xhci_hcd.quirks=270336

これは次の quirks を有効にします:

  • XHCI_SPURIOUS_REBOOT
  • XHCI_SPURIOUS_WAKEUP

バッテリーが食われる問題

ノートパソコンによってはシャットダウン後にバッテリーを消費する問題が存在します [2]。WOL が有効になっているのが原因です。問題を解決するには、ethtool を使って無効化して下さい:

# ethtool -s net0 wol d

Realtek

Realtek 8168 8169 8101 8111(C) が搭載された NIC (カード/オンボード) を使っている場合、起動時に NIC が無効になってしまって接続ランプが灯らないことがあります。イーサネット#Realtek が使えない / WOL の問題を見て下さい。

MSI B85M-E45 マザーボード (BIOS バージョン V10.9) のオンボードチップセット Realtek 8111G では、コンピュータの電源が切れているときにネットワークスイッチのリンクライトは光っているのに Wake-on-LAN が機能しない場合、一度 r8168 カーネルモジュールを使ってシステムを起動してから、カーネルに組み込まれている r8169 に戻すことで問題が解決する場合があります。

alx driver support

For some newer Atheros-based NICs (such as Atheros AR8161 and Killer E2500), WOL support has been disabled in the mainline alx module due to a bug causing unintentional wake-up (see this patch discussion). A patch can be applied (or installed as a dkms module using the alx-wol-dkmsAUR package) which both restores WOL support and fixes the underlying bug, as outlined in this thread.

See also the pre-patched sources in [3].