# Remotely wake up your server with Wake-on-LAN (WoL)

Did you ever try to remotely access your computer, maybe a server, only to realize that the machine is turned off? Or do you have a computer in the basement or a closet that you don’t want to run 24/7 and would like to conveniently power it on from anywhere in the world? There’s a solution for that called Wake-on-LAN (WoL). As the name suggests, it works by waking up the computer from a very low power state by sending a special message on the network. In this post, I will show you how to configure WoL on a computer running Ubuntu (it should also work with minor changes on other Linux flavors).

# Step 1: Setup your server’s BIOS

First, enable Wake-on-LAN in your server’s BIOS. The option might be called something like `Power On by Onboard Lan`. It is also possible that there’s no such option but that doesn’t mean that WoL is not supported. For example my Sun Ultra 24 workstation doesn’t have such an option in the BIOS but WoL works like a charm. This part was not necessary for my workstation.

# Step 2: Find your network interface

Use the `ifconfig` command to show all network interfaces:

```$ifconfig -a eth0 Link encap:Ethernet HWaddr 02-bb-b9-5e-4d-ad inet addr:192.168.0.20 Bcast:192.168.0.255 Mask:255.255.255.0 inet6 addr: fe80::f66d:4ff:fe94:4dc6/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:24456 errors:0 dropped:8 overruns:0 frame:0 TX packets:19553 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:21270369 (21.2 MB) TX bytes:12700784 (12.7 MB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:1524 errors:0 dropped:0 overruns:0 frame:0 TX packets:1524 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1 RX bytes:404601 (404.6 KB) TX bytes:404601 (404.6 KB)``` In my case I only have two devices, the wired network interface eth0 and the loopback interface lo which the system uses to communicate with itself. I want to wake my server on eth0. On newer setups, the network interface might be called something like enp0s5. This is simply a new naming scheme for network interfaces. The highlighted line above shows the corresponding MAC address HWaddr 02-bb-b9-5e-4d-ad. This sequence uniquely identifies the network interface. Make note of the MAC address as you will need it later to wake up the computer. # Step 3: Set up the server software configuration Now that you have identified the network interface, you need to enable WoL on your network interface using `ethtool`. If not already pre-installed, install it using `sudo apt install ethtool`. To check if WoL is supported and if it is already enabled on the network interface, run `sudo ethtool <interface name>`: ```$sudo ethtool eth0
Settings for eth0:
Supported ports: [ TP MII ]
100baseT/Half 100baseT/Full
1000baseT/Half 1000baseT/Full
Supported pause frame use: No
Supports auto-negotiation: Yes
100baseT/Half 100baseT/Full
1000baseT/Half 1000baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Speed: 1000Mb/s
Duplex: Full
Port: MII
Transceiver: internal
Auto-negotiation: on
Supports Wake-on: pumbg
Wake-on: g
Current message level: 0x00000033 (51)
drv probe ifdown ifup

The first highlighted line with the keyword `Wake-on` shows the supported WoL options <code>pumbg</code>. The letter `g` indicates that waking the system using a magic packet is supported. For all the other options, refer to the ethtool manual.

The second highlighted line shows the already enabled WoL options. As indicated by `Wake-on: g`, WoL is already enabled on this system using magic packet. If this is not the case, WoL needs to be enabled with `sudo ethtool -s <interface name> wol g`. However, this only temporarily enables WoL. To enable it permanently, add the line `pre-down /usr/sbin/ethtool -s <interface name> wol g` to  `/etc/network/interfaces`:

```auto eth0
iface eth0 inet static
gateway 192.168.0.1
nameservers 192.168.0.1 8.8.8.8
pre-down /usr/sbin/ethtool -s eth0 wol g```

In order to listen for a magic packet on the network interface, the network card must stay active after powering off the system. To keep the system from turning off completely, add `NETDOWN=no` to `/etc/default/halt`:

```# Default behaviour of shutdown -h / halt. Set to "halt" or "poweroff".
HALT=poweroff
NETDOWN=no```

Now that your system is configured for WoL, it is time to give it a try.

# Step 4: Wake up the computer remotely

WoL works by sending a special message called the magic packet to all the machines on the network. The MAC address, as a unique identifier of the computer, is used to indicate which computer is to be woken up.

There are plenty of tools to send such wake up messages from another computer or even from a smartphone. I use the command-line tool  `wakeonlan` to wake up my server. You can install it with `sudo apt install wakeonlan`.

To wake up your system, run `$wakeonlan <MAC address>`: ```$wakeonlan 02-bb-b9-5e-4d-ad
Sending magic packet to 255.255.255.255:9 with 02-bb-b9-5e-4d-ad```

You can also save the MAC address in a text file and run it using `\$wakeonlan -f <file name>.`

# Troubleshooting

If your computer doesn’t power on after sending a magic packet, check the following things:

• MAC address: do you have the correct MAC address? Double-check using ifconfig -a.
• WoL enabled: is WoL permanently enabled? Reboot the server and check the output of `sudo ethtool <interface name>`. If you don’t have the line `Wake-on: g`, try repeating the commands from step 3.
• Network interface: is your network interface listening for a wake-up call when the system is turned off? Check the halt script `/etc/default/halt` for the option code>NETDOWN=no

If after all these steps WoL is still not working, it might be a hardware specific issue. Search for wake on lan and the name of your computer, main board or network card and you might just find a solution.