Difference between revisions of "Wake-on-LAN"

From MythTV Official Wiki
Jump to: navigation, search
m (removing invalid link)
(34 intermediate revisions by 11 users not shown)
Line 1: Line 1:
[[Category:HOWTO]]
+
[[Category:Power Management]]
  
If you have a network card that supports wake-on-lan, you can powerup your mythbox by sending it a 'magic packet' over the network. Here's what i did (i use an Epia M10k with Fedore Core 4):
+
If you have a network card that supports wake-on-lan (wol), you can powerup your mythbox by sending it a 'magic packet' over the network.
 
== Setting up ==
 
== Setting up ==
 
First, find out whether your network card supports wol:
 
First, find out whether your network card supports wol:
Line 20: Line 20:
 
         Auto-negotiation: on
 
         Auto-negotiation: on
 
         Supports Wake-on: pumbg
 
         Supports Wake-on: pumbg
         Wake-on: g
+
         Wake-on: d
 
         Current message level: 0x00000001 (1)
 
         Current message level: 0x00000001 (1)
 
         Link detected: yes
 
         Link detected: yes
Line 27: Line 27:
 
  # ethtool -s eth0 wol g
 
  # ethtool -s eth0 wol g
  
Since after rebooting ''Wake-on'' will be reset, you might what to add it to /etc/rc.local:
+
When you run `ethtool eth0` again you will see that "Wake-on: d" (disable; wake on nothing) has changed to "g" (wake on magic packet)
  # echo 'ethtool -s eth0 wol g' >> /etc/rc.local
+
 
 +
Since after rebooting ''Wake-on'' will be reset, you will want to add this setting somewhere in your boot up.
 +
 
 +
=== Ubuntu 10.04 ===
 +
To make this setting permanent edit <code>/etc/network/interfaces</code>, in the <code>auto eth0</code> section add at the end:
 +
ethernet-wol g
 +
 
 +
=== Other Linux ===
 +
To make this setting permanent edit /etc/rc.local:
 +
  # nano -w /etc/rc.local
 +
 
 +
Add <code>ethtool -s eth0 wol g</code> above the 'exit 0' line.
  
 
Now turn off you mythbox and send it a 'magic packet'.
 
Now turn off you mythbox and send it a 'magic packet'.
Line 36: Line 47:
 
  # ifconfig
 
  # ifconfig
  
Turn off you mythbox and from another computer execute the following command (replacing the MAC address with the one you just found). I used a [http://ahh.sourceforge.net/wol/ wake-on-lan client] from Sourceforge.
+
Turn off your mythbox and from another computer execute the following command (replacing the MAC address with the one you just found). I used a [http://ahh.sourceforge.net/wol/ wake-on-lan client] from Sourceforge.
 
  $ wol 00:4F:49:07:0B:5F
 
  $ wol 00:4F:49:07:0B:5F
If all went well, your mythbox will boot up now! There are other clients for [http://www.depicus.com/wake-on-lan/ Windows] and [http://www.apple.com/downloads/macosx/networking_security/wakeonlan.html Mac OS X] as well.
+
If all went well, your mythbox will boot up now! There are other clients for [http://www.depicus.com/wake-on-lan/ Windows], [http://www.apple.com/downloads/macosx/networking_security/wakeonlan.html Mac OS X] and [http://itunes.apple.com/nl/app/netawake/id288779132?mt=8 iPhone] as well.
 +
 
 +
=== Via Python one-liner ===
 +
Maybe not as clean, but works on all systems where Python is available, replace the '\x00\x1A\x92\x9D\x69\x85' with the numbers of your backend's MAC address:
 +
 
 +
# python -c "import socket; s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM); s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1);
 +
s.sendto('\xff'*6+'\x00\x1A\x92\x9D\x69\x85'*16, ('<broadcast>', 7));"
 +
 
 +
=== Send automatically from a frontend ===
 +
 
 +
By adding one or two scripts into a remote frontend, it will automatically start the backend, and then wait until the backend is ready to accept a client connection. Ideally the frontend and backend would boot concurrently, however that's difficult to arrange without building a special environment (e.g. to boot rapidly from flash memory), so the practical solution is simply to use an /etc/init.d script in the frontend, and wait while the frontend and backend boot serially.
 +
 
 +
The purpose of the first script is to issue the WOL packet as early as possible. If the overall bootup time is not considered to be an issue, this script can be omitted and the wakeonlan command can be issued from the script which runs from the user's auto-started sessions (called mythfestart.sh, further down).  These scripts use 'wakeonlan' from Ubuntu package repos, but wol or ether-wake would work just as well.
 +
 
 +
/etc/init.d/wol:
 +
#! /bin/sh
 +
# MAC address of backend
 +
SERVER_MAC=xx:xx:xx:xx:xx:xx
 +
#
 +
case "$1" in
 +
  start)
 +
    # Issue wakeonlan at intervals until our own network interface
 +
    #  is active and the magic packet is successfully sent.
 +
    #
 +
    until /usr/bin/wakeonlan $SERVER_MAC > /dev/null 2>&1 ; do
 +
      sleep 1
 +
    done
 +
  ;;
 +
  *)
 +
esac
 +
exit 0
 +
 
 +
After the above script has been placed in /etc/init.d/ (and marked executable with chmod +x ..), it can be made to run at bootup by issuing:
 +
 
 +
sudo update-rc.d wol defaults
 +
 
 +
Now we need a script which waits until the backend is ready to accept client connections, before starting mythfrontend. That way, the frontend will start cleanly without any error panels such as "no UPnP backends found", etc. This script can be added to the user's autostarted sessions (in place of the normal 'mythfrontend' script).
 +
 
 +
/usr/bin/mythfestart.sh:
 +
#! /bin/bash
 +
# IP address of backend
 +
SERVER_IP=xxx.xxx.xxx.xxx
 +
# SERVER_MAC=xx:xx:xx:xx:xx:xx
 +
# Could optionally send a wakeup packet here, if
 +
#  a) it is decided that the early-running script above is not needed, or
 +
#  b) to cover the rare case that backend was shutting down when first one sent
 +
#
 +
# Use mythTV status port as backend connectivity test
 +
until [ -n "`telnet $SERVER_IP 6544 |grep -i connected`" ]; do
 +
  sleep 3
 +
done
 +
# start frontend
 +
mythfrontend &
 +
exit 0
 +
 
 +
Both scripts must of course be made executable with chmod +x <script-filename>
  
 
== Password 'protection' ==
 
== Password 'protection' ==
Wake-on-lan has a SecureON password feature. Here's an example of how to use ethtool and wol with SecureON:
+
Wake-on-lan has a SecureON password feature. Here's an example of how to use ethtool and wol with SecureON (note that the password contains 6 hexadecimal numbers):
  ethtool -s eth0 wol g sopass 11:22:33:aa:bb:cc  
+
  # ethtool -s eth0 wol g sopass 11:22:33:aa:bb:cc  
  wol --passwd=11-22-33-aa-bb-cc 00:4F:49:07:0B:5F
+
  $ wol --passwd=11-22-33-aa-bb-cc 00:4F:49:07:0B:5F
 +
 
 +
== Wake-on-LAN supported but just won't wake up ==
 +
At this writing, the Marvell Gigabit Ethernet controller on the Asus A8V and some other motherboards, using skge driver under Debian Etch may not wake at all while connected at Gigabit speeds to a Gigabit switch. The same hardware may wake correctly when shutdown with Windows in a dual-boot system.
 +
 
 +
A variety of workarounds have been suggested, from modifying the halt binary to using the NIC at 100 Mbps speeds, to placing calls to ethtool in various startup/network/shutdown scripts, but the simplest path to solution is probably to disable the motherboard network controller in BIOS and replace with a known-good PCI Gigabit NIC (such as the US Robotics 7902 Gigabit NIC).
 +
 
 +
=== Wake On LAN, Fedora 11 and Realtek RTL8111/8168 (etc)  ===
 +
This chip seems to be pretty common, along with a lot of problems getting WOL to work...
 +
I suspect this will apply to the following NICs chips
 +
<pre>
 +
RTL8111B/RTL8168B/RTL8111/RTL8168
 +
RTL8111C/RTL8111CP/RTL8111D(L)
 +
RTL8168C/RTL8111DP/RTL8111E
 +
RTL8105E
 +
</pre>
 +
Finally, after much headache, this is the fairly simple solution (based on much crawling around on the web and some considerable testing)...
 +
Go to the Realtek Site, download the driver from there (http://www.realtek.com.tw/downloads/downloadsView.aspx?Langid=1&PNid=13&PFid=5&Level=5&Conn=4&DownTypeID=3&GetDown=false)
 +
Follow the instructions in the README and make and install yourself a new kernel mod (this will be r8168).
 +
 
 +
Now, edit /etc/modprobe.d/blacklist.conf and add
 +
<pre>
 +
# NIC Kludge Stop r8169 loading so that r8168 will
 +
blacklist r8169
 +
</pre>
 +
this stops the r8169 module loading after reboot, this is the one that ships with the kernel, and WOL won't work (except for physical activity), which means it will happily use your shiney new r8168 module instead.
 +
 
 +
It also appears to be necessary to place the following lines into /etc/init.d/halt
 +
 
 +
<pre>
 +
/usr/sbin/ethtool -s eth0 wol g      # This sets the WOL options on the NIC you may wish to use different ones
 +
sleep 10                              # Apparently this is necessary
 +
</pre>
 +
 
 +
The above lines need to be the penultimates ones, just above
 +
<pre>
 +
exec $command $HALTARGS
 +
</pre>
 +
 
 +
=== General remarks ===
 +
 
 +
Some motherboards allow a large set of events to wake-up the machine via ACPI. These can be toggled via <code>/proc/acpi/wakeup</code>. Examples of ACPI wakeup events related to Wake-on-LAN:
 +
 
 +
* 'LAN0', 'LANC' - The ethernet card
 +
* 'P0P2', 'PCI0' - The PCI bridge may need to be allowed to wakeup your machine before WOL works. You can find out which is your PCI bridge by matching the first column of <code>lspci</code> output with the last column of <code>cat /proc/acpi/wakeup</code>.
 +
 
 +
One-liner to enable a wakeup event (ex: LAN0):
 +
 
 +
# grep 'LAN0.*enabled' < /proc/acpi/wakeup >/dev/null || echo LAN0 > /proc/acpi/wakeup
 +
 
 +
'NOTE:' Using <code>/proc/acpi/wakeup</code> is a legacy system. It is in the process of being split into <code>/sys/devices/[..]/power/wakeup</code> per device. Use <code>echo enabled > power/wakeup</code> on each device node you want to use to wake up the machine. Shortcuts may be available, like <code>/sys/class/net/eth0/device/power/wakeup</code> for your eth0 network device..
 +
 
 +
== Tested with ==
 +
* Epia M10k with Fedore Core 4
 +
* M2NPV-VM with Ubuntu 10.04
 +
* MacPro 1,1 with Arch Linux
  
== Useful links: ==
+
== Useful links ==
# http://ahh.sourceforge.net/wol/ (wake-on-lan client + additinal information)
+
# http://ahh.sourceforge.net/wol/ (wake-on-lan client + additional information)
 
# http://dag.wieers.com/packages/wol/ (wol packages for RedHat and Fedora)
 
# http://dag.wieers.com/packages/wol/ (wol packages for RedHat and Fedora)
 
# http://www.die.net/doc/linux/man/man8/ethtool.8.html (man page for ethtool)
 
# http://www.die.net/doc/linux/man/man8/ethtool.8.html (man page for ethtool)
 
# http://www.sourceforge.net/projects/gkernel/ (gkernel package that contains ethtool)
 
# http://www.sourceforge.net/projects/gkernel/ (gkernel package that contains ethtool)

Revision as of 18:52, 11 August 2013


If you have a network card that supports wake-on-lan (wol), you can powerup your mythbox by sending it a 'magic packet' over the network.

Setting up

First, find out whether your network card supports wol:

# ethtool eth0
Settings for eth0:
       Supported ports: [ TP MII ]
       Supported link modes:   10baseT/Half 10baseT/Full
                               100baseT/Half 100baseT/Full
       Supports auto-negotiation: Yes
       Advertised link modes:  10baseT/Half 10baseT/Full
                               100baseT/Half 100baseT/Full
       Advertised auto-negotiation: Yes
       Speed: 100Mb/s
       Duplex: Full
       Port: MII
       PHYAD: 1
       Transceiver: internal
       Auto-negotiation: on
       Supports Wake-on: pumbg
       Wake-on: d
       Current message level: 0x00000001 (1)
       Link detected: yes

The 'g' in Supports Wake-on: pumbg indicates that wake-on-lan by using a 'magic packet' is indeed supported. Next, you need to make sure that wake-on-lan support is enabled in the BIOS (although, this does not seem to be necessary for my motherboard). In addition, you need to tell your network card to enable wake-on-lan:

# ethtool -s eth0 wol g

When you run `ethtool eth0` again you will see that "Wake-on: d" (disable; wake on nothing) has changed to "g" (wake on magic packet)

Since after rebooting Wake-on will be reset, you will want to add this setting somewhere in your boot up.

Ubuntu 10.04

To make this setting permanent edit /etc/network/interfaces, in the auto eth0 section add at the end:

ethernet-wol g

Other Linux

To make this setting permanent edit /etc/rc.local:

# nano -w /etc/rc.local

Add ethtool -s eth0 wol g above the 'exit 0' line.

Now turn off you mythbox and send it a 'magic packet'.

Sending 'magic packet' to wake up your mythbox

You will need a wake-on-lan client to send 'magic packets' over your network. First, determine the MAC address of the machine you what to power on:

# ifconfig

Turn off your mythbox and from another computer execute the following command (replacing the MAC address with the one you just found). I used a wake-on-lan client from Sourceforge.

$ wol 00:4F:49:07:0B:5F

If all went well, your mythbox will boot up now! There are other clients for Windows, Mac OS X and iPhone as well.

Via Python one-liner

Maybe not as clean, but works on all systems where Python is available, replace the '\x00\x1A\x92\x9D\x69\x85' with the numbers of your backend's MAC address:

# python -c "import socket; s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM); s.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1);
s.sendto('\xff'*6+'\x00\x1A\x92\x9D\x69\x85'*16, ('<broadcast>', 7));"

Send automatically from a frontend

By adding one or two scripts into a remote frontend, it will automatically start the backend, and then wait until the backend is ready to accept a client connection. Ideally the frontend and backend would boot concurrently, however that's difficult to arrange without building a special environment (e.g. to boot rapidly from flash memory), so the practical solution is simply to use an /etc/init.d script in the frontend, and wait while the frontend and backend boot serially.

The purpose of the first script is to issue the WOL packet as early as possible. If the overall bootup time is not considered to be an issue, this script can be omitted and the wakeonlan command can be issued from the script which runs from the user's auto-started sessions (called mythfestart.sh, further down). These scripts use 'wakeonlan' from Ubuntu package repos, but wol or ether-wake would work just as well.

/etc/init.d/wol:
#! /bin/sh
# MAC address of backend
SERVER_MAC=xx:xx:xx:xx:xx:xx
# 
case "$1" in
  start)
    # Issue wakeonlan at intervals until our own network interface
    #  is active and the magic packet is successfully sent.
    #
    until /usr/bin/wakeonlan $SERVER_MAC > /dev/null 2>&1 ; do
      sleep 1
    done
  ;;
  *)
esac
exit 0

After the above script has been placed in /etc/init.d/ (and marked executable with chmod +x ..), it can be made to run at bootup by issuing:

sudo update-rc.d wol defaults

Now we need a script which waits until the backend is ready to accept client connections, before starting mythfrontend. That way, the frontend will start cleanly without any error panels such as "no UPnP backends found", etc. This script can be added to the user's autostarted sessions (in place of the normal 'mythfrontend' script).

/usr/bin/mythfestart.sh:
#! /bin/bash
# IP address of backend
SERVER_IP=xxx.xxx.xxx.xxx
# SERVER_MAC=xx:xx:xx:xx:xx:xx
# Could optionally send a wakeup packet here, if
#  a) it is decided that the early-running script above is not needed, or
#  b) to cover the rare case that backend was shutting down when first one sent
#
# Use mythTV status port as backend connectivity test
until [ -n "`telnet $SERVER_IP 6544 |grep -i connected`" ]; do
  sleep 3
done
# start frontend
mythfrontend &
exit 0

Both scripts must of course be made executable with chmod +x <script-filename>

Password 'protection'

Wake-on-lan has a SecureON password feature. Here's an example of how to use ethtool and wol with SecureON (note that the password contains 6 hexadecimal numbers):

# ethtool -s eth0 wol g sopass 11:22:33:aa:bb:cc 
$ wol --passwd=11-22-33-aa-bb-cc 00:4F:49:07:0B:5F

Wake-on-LAN supported but just won't wake up

At this writing, the Marvell Gigabit Ethernet controller on the Asus A8V and some other motherboards, using skge driver under Debian Etch may not wake at all while connected at Gigabit speeds to a Gigabit switch. The same hardware may wake correctly when shutdown with Windows in a dual-boot system.

A variety of workarounds have been suggested, from modifying the halt binary to using the NIC at 100 Mbps speeds, to placing calls to ethtool in various startup/network/shutdown scripts, but the simplest path to solution is probably to disable the motherboard network controller in BIOS and replace with a known-good PCI Gigabit NIC (such as the US Robotics 7902 Gigabit NIC).

Wake On LAN, Fedora 11 and Realtek RTL8111/8168 (etc)

This chip seems to be pretty common, along with a lot of problems getting WOL to work... I suspect this will apply to the following NICs chips

RTL8111B/RTL8168B/RTL8111/RTL8168
RTL8111C/RTL8111CP/RTL8111D(L)
RTL8168C/RTL8111DP/RTL8111E
RTL8105E

Finally, after much headache, this is the fairly simple solution (based on much crawling around on the web and some considerable testing)... Go to the Realtek Site, download the driver from there (http://www.realtek.com.tw/downloads/downloadsView.aspx?Langid=1&PNid=13&PFid=5&Level=5&Conn=4&DownTypeID=3&GetDown=false) Follow the instructions in the README and make and install yourself a new kernel mod (this will be r8168).

Now, edit /etc/modprobe.d/blacklist.conf and add

# NIC Kludge Stop r8169 loading so that r8168 will 
blacklist r8169

this stops the r8169 module loading after reboot, this is the one that ships with the kernel, and WOL won't work (except for physical activity), which means it will happily use your shiney new r8168 module instead.

It also appears to be necessary to place the following lines into /etc/init.d/halt

/usr/sbin/ethtool -s eth0 wol g       # This sets the WOL options on the NIC you may wish to use different ones
sleep 10                              # Apparently this is necessary

The above lines need to be the penultimates ones, just above

exec $command $HALTARGS

General remarks

Some motherboards allow a large set of events to wake-up the machine via ACPI. These can be toggled via /proc/acpi/wakeup. Examples of ACPI wakeup events related to Wake-on-LAN:

  • 'LAN0', 'LANC' - The ethernet card
  • 'P0P2', 'PCI0' - The PCI bridge may need to be allowed to wakeup your machine before WOL works. You can find out which is your PCI bridge by matching the first column of lspci output with the last column of cat /proc/acpi/wakeup.

One-liner to enable a wakeup event (ex: LAN0):

# grep 'LAN0.*enabled' < /proc/acpi/wakeup >/dev/null || echo LAN0 > /proc/acpi/wakeup

'NOTE:' Using /proc/acpi/wakeup is a legacy system. It is in the process of being split into /sys/devices/[..]/power/wakeup per device. Use echo enabled > power/wakeup on each device node you want to use to wake up the machine. Shortcuts may be available, like /sys/class/net/eth0/device/power/wakeup for your eth0 network device..

Tested with

  • Epia M10k with Fedore Core 4
  • M2NPV-VM with Ubuntu 10.04
  • MacPro 1,1 with Arch Linux

Useful links

  1. http://ahh.sourceforge.net/wol/ (wake-on-lan client + additional information)
  2. http://dag.wieers.com/packages/wol/ (wol packages for RedHat and Fedora)
  3. http://www.die.net/doc/linux/man/man8/ethtool.8.html (man page for ethtool)
  4. http://www.sourceforge.net/projects/gkernel/ (gkernel package that contains ethtool)