El wakeonlan, los cables de red y el sistema sudo

Son ya dos las máquinas que en casa están casi siempre en modo ahorro de energía y cuya finalidad es recibir copias de seguridad. O hacer, según me dé, aunque lo veo más complicado.

En una de ellas a la que he llamado silo haciendo referencia su función principal de almacenar reservas, he descubierto algunas cosas interesantes sobre el funcionamiento de la gestión de energía. La primera es que existen varias maneras para llevar la máquina a este modo de funcionamiento, pero con la llegada tiempo atrás de systemd y su prima la mejor forma es emplearlo: $ sudo systemctl suspend.

También he aprendido que si el cable de red está piojoso o en algún estado similar tras permanecer años en una caja el sistema no funciona. Sí, el modo de ahorro se activa pero luego no es posible despertarlo. Toca cambiar el cable o ir ajustándolo con pequeños vaivenes hasta que recibe la señal WOL. La susodicha señal es un acrónimo para Wake On Lan y consiste en enviar un paquete UDP -especialmente construido- a su interfaz de red empleando la dirección MAC del mismo. Y si el cable está más para allá que para acá pues lo dicho: no va.

Una vez que la máquina está despierta tarda muy poco, uno o dos segundos, en estar disponible para el uso. Esto es importante porque si vas a emplearlo como almacén de datos es necesario asegurarse antes de que está despierto. Se trabaja con él normalmente y al terminar se le vuelve otra vez al sueño. Si no es posible hacerlo durante ese trabajo porque es una conexión directa de datos (por ejemplo con borg) lo mejor es conectar más tarde con SSH y ponerlo a dormir.

Teniendo un usuario para estas operaciones como osr (que es el que siempre uso) basta con añadir una regla para él en el sistema sudo (un archivo de nombre arbitrario en /etc/sudoers.d) y lanzarlo directamente.

# suspend sudoers.d config file
# ------------------------------------
#
# Please consider a look at /etc/sudoers.d/README howto enable this file.
#

# Keep apt-dater's MAINTAINER environment variable
Defaults        env_keep += MAINTAINER

# Allow members of group adm to execute the apt-get command
osr     ALL=NOPASSWD: /usr/bin/systemctl suspend

Como se puede ver se ha limitado mucho lo que es posible llamar. Para que funcione debe hacerse de la siguiente forma:

$ ssh osr@silo sudo /usr/bin/systemctl suspend

Asumiendo, claro, que la conexión vía SSH esté establecida y no necesite contraseña y demás.

¿Y para despertar a la bestia? Pues para eso se pueden emplear varios programas (demasiados tal vez) que le envían la trama a su dirección MAC. Obtengamos primero dicha dirección o no hacemos nada.

Una vez con ella enviamos le paquete para despertarlo de esta forma:

# la dirección es un ejemplo
$ wakonlan c8:1f:66:08:fa:29

Y si el maldito cable está bien, como he dicho, pues funciona. Si no te toca conectar un monitor, darle energía e incluso conectar un teclado para saber qué coño está pasando en la máquina.

Sé listo: comprueba el puto cable.

Pues ahora le da por dormir …

… a una máquina que nunca debe estar así. Y es un engorro dado que al ser mi puesto de trabajo la empleo mucho para conexiones desde el exterior con la red de la empresa.

Y ni idea de lo que le ha ocurrido o lo que he tocado. No estoy muy fino últimamente con los recuerdos, es verdad, pero algo así tendría que saber de dónde proviene, ¿ no ?

Pues no, ahora cuando cierro sesión la máquina pasa al modo de ahorro de energía y tengo que despertarla primero empleando Wake on Lan. Que sí, que es cómodo una vez que tienes la MAC pero que es otra piedrecita en el camino y no quiero recoger más. Eso contando con que esté presente, que si las copias de seguridad están en marcha, por ejemplo, el sistema se congela y la conexión se pierde y … todo son dramas.

Pues para despertarlo, una vez que conozco la MAC de mi ordenador consultando la tabla arp en el servidor frontera, me basta con usar lo siguiente:

$ sudo wakeonlan -i 192.168.100.40 74:d4:35:ab:f6:a4

Pero para asegurarme de que no hace el tonto más he tenido que recurrir a enmascarar varios objetivos empleando systemd (según he encontrado en esta página):

$ sudo systemctl mask sleep.target suspend.target hibernate.target