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

提供: ArchWiki
ナビゲーションに移動 検索に移動
(en:Wake-on-LANへの転送ページ)
 
1行目: 1行目:
  +
[[Category:ネットワーク]]
#redirect[[en:Wake-on-LAN]]
 
  +
[[en:Wake-on-LAN]]
  +
Wake-on-LAN (WOL) はネットワーク接続 (インターネットまたはイントラネット) からコンピュータの電源を入れる機能です。
  +
  +
== ハードウェア設定 ==
  +
  +
Wake-on-LAN を使うにはコンピュータのマザーボードや [[wikipedia:NIC|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" というような単語を追って下さい。
  +
  +
一部のマザーボードには厄介なバグが存在し、特定の状況下でシャットダウンの代わりに再起動を引き起こすことがあります ([https://bbs.archlinux.org/viewtopic.php?id=173648 このスレッド] などを参照)。このバグが発現しないように、マシンで以下の設定を行うことを推奨します:
  +
# USB の設定に関する "xHCI" を全て無効化する。
  +
# EuP 2013 がオプションとして存在する場合に無効化する。
  +
# (任意) キーボードによる WOL を有効化する。
  +
  +
{{Note|There are mixed opinions as to the value of #3 above and it may be motherboard dependent.}}
  +
  +
== ソフトウェア設定 ==
  +
  +
ハードウェアによっては、ネットワークドライバーによって WOL がデフォルトでオフになっていることがあります。WOL の状態を確認したり、設定を変更するために、{{Pkg|ethtool}} をインストールして下さい。
  +
  +
次のコマンドを使ってネットワークデバイスの状態を確認します:
  +
  +
{{hc|<nowiki># ethtool net0 | grep Wake-on</nowiki>|<nowiki>
  +
Supports Wake-on: pumbag
  +
Wake-on: d
  +
</nowiki>}}
  +
  +
上記の値はどのアクティビティが動作するかを定義しています: {{ic|d}} (無効), {{ic|p}} (PHY アクティビティ), {{ic|u}} (ユニキャストアクティビティ), {{ic|m}} (マルチキャストアクティビティ), {{ic|b}} (ブロードキャストアクティビティ), {{ic|a}} (ARP アクティビティ), {{ic|g}} (マジックパケットアクティビティ)。WOL を使うには {{ic|g}} が必要です。
  +
  +
ドライバーの WOL 機能を有効化するには:
  +
  +
# ethtool -s net0 wol g
  +
  +
上記のコマンドは再起動してしまうと効果を失ってしまうため、何らかの方法で自動的に実行されるようにする必要があります。以下のサブセクションに一般的な方法を載せています。
  +
  +
=== netctl を使う ===
  +
  +
netctl を使う場合、以下の設定を netctl のプロファイルに追加することで永続化させることができます:
  +
  +
{{hc|/etc/netctl/''profile''|2=
  +
ExecUpPost='/usr/bin/ethtool -s net0 wol g'
  +
}}
  +
  +
=== systemd を使う ===
  +
  +
[[systemd-networkd]] を使ってマシンのネットワークを設定している場合、{{ic|systemd.link}} の設定を使うことで簡単に Wake-On-Lan を有効にできます。{{ic|WakeOnLan}} オプションをネットワークの link ファイルに追加してください:
  +
  +
{{hc|/etc/systemd/network/wired.link|2=
  +
[Link]
  +
WakeOnLan=magic
  +
}}
  +
  +
詳しくは {{ic|man systemd.link}} を参照。
  +
  +
=== スタンドアロンの systemd サービスを使う ===
  +
  +
上述の {{ic|systemd.link}} オプションと同じ効果がありますが、スタンドアロンの systemd サービスを使っています。
  +
  +
{{hc|/etc/systemd/system/wol@.service|2=
  +
[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
  +
}}
  +
  +
もしくは {{AUR|wol-systemd}}{{Broken package link|{{aur-mirror|wol-systemd}}}} パッケージをインストールして下さい。
  +
  +
{{ic|wol@''interface''.service}} を[[起動]]することで新しいサービスを有効にして下さい。
  +
  +
=== udev を使う ===
  +
  +
udev を使うことでデバイスが認識されたときにコマンドを実行することができます。以下を {{ic|/etc/udev/rules.d/50-wol.rules}} に記述してください (N は使用するインターフェイスの番号に置き換えて下さい):
  +
  +
ACTION=="add", SUBSYSTEM=="net", KERNEL=="netN", RUN+="/usr/bin/ethtool -s %k wol g"
  +
  +
上記の udev ルールによって、netN デバイスが認識されるとすぐに {{ic|/usr/bin/ethtool -s netN wol g}} が実行されます。全てのデバイスで Wake-on-LAN を有効化したいときは、N を '*' に置き換えます:
  +
  +
ACTION=="add", SUBSYSTEM=="net", KERNEL=="net*", RUN+="/usr/bin/ethtool -s %k wol g"
  +
  +
=== cron を使う ===
  +
  +
crontab で "@reboot" を使うことでコンピュータを起動するたびにコマンドを実行させることができます。まず、[[Cron#インストール|cron]] をインストールして、それから root ユーザーの [[cron#基本的なコマンド|crontab]] を編集して以下の行を記述して下さい:
  +
  +
@reboot /usr/bin/ethtool -s [net-device] wol g
  +
  +
== 電源の投入 ==
  +
  +
マシンの WOL を実行するには、マシンの MAC アドレスと外部・内部 IP が必要です。
  +
  +
コンピュータの内部 IP アドレスと MAC アドレスを取得するには、次のコマンドを実行:
  +
  +
{{hc|$ 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 アドレスは {{ic|192.168.1.20}} で MAC アドレスは {{ic|48:05:ca:09:0e:6a}} です。
  +
  +
WOL を実行するためにマジックパケットを送信できるプログラムとして {{Pkg|wol}} が存在します。
  +
  +
=== 同一の LAN 上にある場合 ===
  +
  +
ネットワークケーブルによって他のコンピュータと直接接続している場合、または LAN の中の通信がファイアウォールで遮断されていない場合、ポートのリダイレクトについて考える必要がないため簡単に Wake-on-LAN を使うことができます。
  +
  +
一番シンプルなケース、デフォルトのブロードキャストアドレス {{ic|255.255.255.255}} を使用:
  +
  +
$ wol ''target_MAC_address''
  +
  +
特定のサブネットやホストにだけマジックパケットを送信するには、{{ic|-i}} スイッチを使用:
  +
  +
$ 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.}}
  +
  +
=== ポートフォワーディングを使う ===
  +
  +
送信元と送信先のコンピュータがルーターで区切られている場合、[[wikipedia:Port forwarding|ポートフォワーディング]]によって Wake-on-LAN を使うことができます。特定のポートを使用する全ての信号を送信先の PC の内部 IP に転送するようにルーターが設定されている必要があります。設定に関する詳細は[[ファイアウォール]]を見て下さい。
  +
  +
電源を投入するには:
  +
  +
$ wol -p ''forwarded_port'' -i ''router_IP'' ''target_MAC_address''
  +
  +
ルーターを介して複数のコンピュータが存在する場合、IP ごとに別々のポートフォワードを割り当てることを推奨します。
  +
  +
=== インターネットを使う ===
  +
  +
The syntax needed in this case:
  +
  +
$ wol -p ''target_port'' -i ''target_IP_or_hostname'' ''target_MAC_address''
  +
  +
*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.
  +
  +
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
  +
  +
(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.
  +
  +
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].
  +
  +
== その他 ==
  +
  +
=== バッテリーが食われる問題 ===
  +
ノートパソコンによってはシャットダウン後にバッテリーを消費する問題が存在します [http://ubuntuforums.org/archive/index.php/t-1729782.html]。WOL が有効になっているのが原因です。問題を解決するには、''ethtool'' を使って無効化して下さい:
  +
  +
# ethtool -s net0 wol d
  +
  +
=== WOL サンプルスクリプト ===
  +
Here is a script to automate WOL to several different machines:
  +
  +
{{bc|<nowiki>
  +
#!/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 [ "$input1" != quit ]; 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
  +
if [ $input1 == p ]; then
  +
/usr/bin/wol $powerless
  +
exit 1
  +
fi
  +
  +
if [ $input1 == m ]; then
  +
/usr/bin/wol $monster
  +
exit 1
  +
fi
  +
  +
if [ $input1 == c ]; then
  +
/usr/bin/wol $chronic
  +
exit 1
  +
fi
  +
  +
# 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
  +
  +
if [ $input1 == g ]; then
  +
/usr/bin/wol -v -h -p 9 ghost $ghost
  +
exit 1
  +
fi
  +
  +
if [ $input1 == b ]; then
  +
/usr/bin/wol $monster
  +
echo "monster sent, now waiting for 40sec then waking chronic"
  +
sleep 40
  +
/usr/bin/wol $chronic
  +
exit 1
  +
fi
  +
  +
if [ $input1 == Q ] || [ $input1 == q ]; then
  +
echo "later!"
  +
exit 1
  +
fi
  +
  +
done
  +
echo "this is the (quit) end!! c-ya!"
  +
</nowiki>}}
  +
  +
== トラブルシューティング ==
  +
  +
=== Realtek ===
  +
  +
Realtek 8168 8169 8101 8111(C) が搭載された NIC (カード/オンボード) を使っている場合、起動時に NIC が無効になってしまって接続ランプが灯らないことがあります。[[ネットワーク設定#Realtek が使えない / WOL の問題]]を見て下さい。
  +
  +
== 参照 ==
  +
  +
* [http://www.depicus.com/wake-on-lan/woli.aspx Wake-On-Lan]

2015年8月28日 (金) 00:59時点における版

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" というような単語を追って下さい。

一部のマザーボードには厄介なバグが存在し、特定の状況下でシャットダウンの代わりに再起動を引き起こすことがあります (このスレッド などを参照)。このバグが発現しないように、マシンで以下の設定を行うことを推奨します:

  1. USB の設定に関する "xHCI" を全て無効化する。
  2. EuP 2013 がオプションとして存在する場合に無効化する。
  3. (任意) キーボードによる WOL を有効化する。
ノート: There are mixed opinions as to the value of #3 above and it may be motherboard dependent.

ソフトウェア設定

ハードウェアによっては、ネットワークドライバーによって 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

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

netctl を使う

netctl を使う場合、以下の設定を netctl のプロファイルに追加することで永続化させることができます:

/etc/netctl/profile
ExecUpPost='/usr/bin/ethtool -s net0 wol g'

systemd を使う

systemd-networkd を使ってマシンのネットワークを設定している場合、systemd.link の設定を使うことで簡単に Wake-On-Lan を有効にできます。WakeOnLan オプションをネットワークの link ファイルに追加してください:

/etc/systemd/network/wired.link
[Link]
WakeOnLan=magic

詳しくは 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[リンク切れ: アーカイブ: aur-mirror] パッケージをインストールして下さい。

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

udev を使う

udev を使うことでデバイスが認識されたときにコマンドを実行することができます。以下を /etc/udev/rules.d/50-wol.rules に記述してください (N は使用するインターフェイスの番号に置き換えて下さい):

ACTION=="add", SUBSYSTEM=="net", KERNEL=="netN", RUN+="/usr/bin/ethtool -s %k wol g"

上記の udev ルールによって、netN デバイスが認識されるとすぐに /usr/bin/ethtool -s netN wol g が実行されます。全てのデバイスで Wake-on-LAN を有効化したいときは、N を '*' に置き換えます:

ACTION=="add", SUBSYSTEM=="net", KERNEL=="net*", RUN+="/usr/bin/ethtool -s %k wol g"

cron を使う

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

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

電源の投入

マシンの 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
ヒント: If you intend to continue using Wake-on-LAN, it is recommended to assign a static IP address to the target computer.

ポートフォワーディングを使う

送信元と送信先のコンピュータがルーターで区切られている場合、ポートフォワーディングによって Wake-on-LAN を使うことができます。特定のポートを使用する全ての信号を送信先の PC の内部 IP に転送するようにルーターが設定されている必要があります。設定に関する詳細はファイアウォールを見て下さい。

電源を投入するには:

$ wol -p forwarded_port -i router_IP target_MAC_address

ルーターを介して複数のコンピュータが存在する場合、IP ごとに別々のポートフォワードを割り当てることを推奨します。

インターネットを使う

The syntax needed in this case:

$ wol -p target_port -i target_IP_or_hostname target_MAC_address
  • 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.

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

(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.

For notes on how to do it on DD-WRT routers, see this tutorial.

その他

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

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

# ethtool -s net0 wol d

WOL サンプルスクリプト

Here is a script to automate WOL to several different machines:

#!/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 [ "$input1" != quit ]; 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
  if [ $input1 == p ]; then
  /usr/bin/wol $powerless
  exit 1
fi

if [ $input1 == m ]; then
  /usr/bin/wol $monster
  exit 1
fi

if [ $input1 == c ]; then
  /usr/bin/wol $chronic
  exit 1
fi

# 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

if [ $input1 == g ]; then
  /usr/bin/wol -v -h -p 9 ghost $ghost
  exit 1
fi

if [ $input1 == b ]; then
  /usr/bin/wol $monster
  echo "monster sent, now waiting for 40sec then waking chronic"
  sleep 40
  /usr/bin/wol $chronic
  exit 1
fi

if [ $input1 == Q ] || [ $input1 == q ]; then
echo "later!"
exit 1
fi

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

トラブルシューティング

Realtek

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

参照