Un server a medio metro del suelo, y un niño de un año y medio correteando alrededor –> apagados y reinicios seguros 🙂
Pues eso, que mi pequeño trasto ha aprendido a apagar y reiniciar el equipo. Es que unas lucecitas azules y unos cuantos botoncitos es la mezcla perfecta para que un niño le meta mano, no le culpo; a mi me pasa igual 🙂
El caso es que se pueden paliar un poco los efectos. Por partes. Tenemos 3 problemas:

    • El botón de power

El más crítico, evidentemente. Si se deja el botón pulsado, ahí no hay tu tía. El equipo se apagará sí o sí, por hardware. Tenemos dos opciones, o bien desconectar el cable del botón físicamente de la placa base (y apagar el equipo por ejemplo por ssh) o tunear un poco el demonio acpi de linux para que haga lo que queramos cuando apretemos el botón (momentary press). Esto último es lo que he hecho, de forma que hay que apretar varias veces el botón en un determinado intervalo de tiempo para que el equipo efectivamente se apague. Hay que modificar un archivo de config de acpi y crear un script, que será el que se ejecute cuando apretemos el botón de power. Primero, el archivo a modificar es el siguiente, y quedaría así:

El último action es el nuevo script del que hablaba:

de forma que, en este ejemplo, el equipo se apagará si apretamos 3 veces el botón de power en menos de 1 segundo. Esto se puede cambiar con las variables TIMELIMIT y KEYSTROKES y ajustarlas según lo trasto que sea el niño 😀
La variable FALLBACK es lo que ejecutará cuando se den las condiciones de apagado (TIMELIMIT y KEYSTROKES). Normalmente será la antigua llamada de acpi.

Una cosa a tener en cuenta es que seguramente nuestro escritorio gráfico (gnome, kde, etc) venga con un demonio para controlar la energía, y que interceptará las llamadas a acpi. Yo por ejemplo uso Mint (mate), y viene con el demonio mate-power-manager corriendo, de forma que cuando apretaba el botón de power me aparecía una ventana de diálogo pregutándome qué quería hacer, y las siguientes pulsaciones de power no llegaban al demonio acpi. Yo en mi caso tuve simplemente que deshabilitar que mate-power-manager se ejecutara al inicio, con solo renombrar un archivo:

Según el entorno que uséis, posiblemente tengáis que adaptar otra solución. Podéis probar con:

aunque posiblemente os toque investigar un poco.

UPDATE: si os sigue sin funcionar, echad un vistazo a /etc/systemd/logind.conf y poned la variable HandlePowerKey a ignore. Estoy es nuevo en mint 17, que ha migrado a systemd. También os tocará posiblemente modificar el script powerbtn.sh. Por cierto a partir de ahora me encuentro con los eventos del botón duplicados… es decir, como si pulsara dos veces seguidas!

    • Botón de reset

Aquí tenemos un problema hardware, y es que la única solución es desconectar el botón de la placa base. Es lo que voy a hacer, porque bueno, este botón realmente es secundario. O hago un reboot por ssh, o apago y enciendo con el botón de power. No hay problema en ninguno de los dos casos

    • Bandeja del DVD

Jeje, esto no lo mencionaba antes, pero es otro problema, porque también le mola abrir y cerrar la bandeja, con el riesgo de que se apoye en ella y la rompa cuando la abra. Aquí, por una parte, primero lo que podemos es bloquear la bandeja para que no se pueda abrir cuando le de al botón. En muchos sitios hablan del comando eject, o directamente escribiendo un 1 en /proc/sys/dev/cdrom/lock, peeeeeeero al menos yo antes tuve que crear una regla de udev:

¿Por qué? Pues porque hay una regla de udev que hace que cuando apretemos el botón abra la bandeja, independientemente de que la hayamos bloqueado por ejemplo con el comando eject (ver regla /lib/udev/rules.d/60-cdrom_id.rules). La regla que he escrito arriba sobreescribe la que viene en el sistema para que no haga nada cuando le demos al botón de la bandeja.
Ahora, sí que podemos bloquearla:

y desbloquearla

Otra opción que tenemos es monitorizar cada cierto tiempo (2 minutos por ejemplo?) si la bandeja está abierta, y cerrarla si procede. He buscado bastante y parece que no hay forma estándar de saber si la bandeja está abierta o cerrada. Lo que sí he visto y probado un programa en C sacado de http://www.linuxquestions.org/questions/slackware-14/detect-cd-tray-status-4175450610/#post4894188

Compilamos con gcc y vemos que efectivamente devuelve un 0 si está abierta y un 1 si está cerrada.

Al final lo que hice fue implementar una combinación de botones para abrir el DVD, de forma que éste solo se abre si primero aprieto el botón de power del equipo, y seguidamente en menos de 5 segundos le doy al botón de la bandeja. Cuando está la bandeja bloqueada (con eject -i 1) y se da al botón, se emite un evento que recoje udev. Dicho evento lleva la variable de entorno DISK_EJECT_REQUEST. Creamos entonces la regla de udev de la que hablo un poco más arriba, ligeramente modificada:

Y el siguiente script, que detectará si en los últimos 5 segundos se ha presionado el botón de power:

MUY IMPORTANTE: la variable LOCKFILE debe ser la misma que en el script de más arriba!

Por último, bloqueamos la bandeja del DVD en el arranque del equipo:

No hay que olvidar dar permisos de ejecución a todos los scripts!!

Listo! Un equipo a prueba de niños!

A prueba de niños

Deja un comentario

Tu dirección de correo electrónico no será publicada.