WOL no funciona en ubuntu 10.04 LTS tras realizar la suspensión
Hacía tiempo que no me encontraba con un problema difícil de resolver en Linux. Resulta que tenemos un bug reconocido por el cual la función Wake On LAN dejará de funcionar tras la primera suspensión / hibernación del equipo. Es decir, que puedes suspender y reiniciar la máquina mediante WOL una única vez; las sucesivas será imposible. Y como es de costumbre, google te muestra miles de resultados con gente que configura el WOL sin problemas, pero nadie que se encuentre en mi misma tesitura.
Investigando un poco me he encontrado con varios enlaces que sugerían diversas soluciones, ninguna de las cuales me ha servido. Sin embargo, si me han dado una pista de por donde empezar. El directorio /etc/pm/sleep.d/ contiene scripts que se ejecutan al suspender y restaurar el sistema, llevando a cabo las acciones necesarias, de forma parecida a los de System V. Además, en /usr/lib/pm/sleep.d/ hay otros tantos definidos que se también se ejecutan.
Ya puestos en situación, resulta que he descubierto (mediante el conocidísimo método informático ensayo-error) que es necesario “resetear” las interfaces de red para que funcione de forma adecuada el WOL, además de habilitarlo, pues se deshabilita en cada suspensión / apagado. Esto lo hago con el siguiente script que me he creado, y que he colocado en /etc/pm/sleep.d/10_wol:
#!/bin/bash
IFACE=eth0
resetif() {
ifconfig $IFACE down
ifconfig $IFACE up
ethtool -s eth0 wol g
}
case "${1}" in
suspend|hibernate)
resetif
;;
resume|thaw)
resetif
dhclient $IFACE
;;
esac
El inconveniente es que este script entra en conflicto con /usr/lib/pm/sleep.d/55NetworkManager; el susodicho para y restaura el NetworkManager de Ubuntu. Así que he borrado éste último para evitar que falle.
Por cierto, que también es necesario habilitar WOL tras reiniciar la máquina. Para ello basta con crear un script que lo haga en cada automáticamente, /etc/init.d/wol:
#!/bin/bash
#
# Enables Wake On LAN
ethtool -s eth0 wol g
Y habilitarlo para que se ejecute en cada inicio:
# update-rc.d wol defaults
Y con esto ya tenemos nuestro Wake On LAN funcional.