jueves, 8 de noviembre de 2012

Como desactivar Hibernar y Suspender en GNU/Linux

En muchas distribuciones GNU/Linux las funciones de Hibernar y Suspender no funcionan correctamente, debido a razones que desconozco y que luego investigaré, la mayoría de ellas no "despierta" luego de estar en uno de estos dos estados. Al menos en mi caso, el teclado de mi computadora tiene un botón con una media luna que pone el sistema en hibernación y que mi bebé de dos años presiona con cierta regularidad, por accidente o curiosidad.

A fin de cuentas debido a que el sistema no volvía en sí, sino que había que apagarlo a la fuerza (cortando la corriente) investigué cómo deshabilitar estas funciones a nivel de sistema operativo.

Lo primero que debemos hacer es averiguar con PolicyKit el nombre de las acciones que controlar estas dos funciones. PolicyKit es una herramienta a nivel de aplicación para definir y manejar políticas que permitan a procesos sin privilegios hablar o conectar con procesos privilegiados. Esta herramienta es específica para usarse en entornos multiusuarios de sistemas tipo Unix. Como trabaja a nivel de aplicación no tiene nada que ver o se relaciona con características del kernel.

Esto lo haremos con el comando pkaction:
[root@rainbow ~]# pkaction | grep power
org.freedesktop.devicekit.power.hibernate
org.freedesktop.devicekit.power.qos.cancel-request
org.freedesktop.devicekit.power.qos.request-latency
org.freedesktop.devicekit.power.qos.request-latency-persistent
org.freedesktop.devicekit.power.qos.set-minimum-latency
org.freedesktop.devicekit.power.suspend
Como podemos observar hay dos acciones que controlan las fuciones que nos interesan y son: org.freedesktop.devicekit.power.hibernate y org.freedesktop.devicekit.power.suspend, por lo que las usaremos en un fichero que crearemos en PolicyKit:
[root@rainbow ~]# nano /etc/polkit-1/localauthority/50-local.d/50-disable-suspend.pkla

[Disable Suspend]
Identity=unix-user:*
Action=org.freedesktop.devicekit.power.hibernate;org.freedesktop.devicekit.power.suspend
ResultAny=no
ResultInactive=no
ResultActive=no
Viendo pues un poco en detalle el fichero anterior, en el valor Identity vamos a pasarle unix-user:*, ya que la intención es deshabilitarlo para todos los usuarios. Es posible también indicar grupos de usuarios con unix-group:nombre_grupo, o en el caso de los usuarios especificar los usuarios separados por punto y coma: unix-user:fraterneo;root.

En Action obviamente van las acciones que encontramos con el comando pkaction, y las demás variables con valor no para que las acciones en cuestión queden deshabilitadas. En distribuciones derivadas de Debian como Ubuntu y Linux Mint las acciones pueden llamarse diferente:
fraterneo@rainbow2 ~ $ pkaction | grep power
org.freedesktop.upower.hibernate
org.freedesktop.upower.qos.cancel-request
org.freedesktop.upower.qos.request-latency
org.freedesktop.upower.qos.request-latency-persistent
org.freedesktop.upower.qos.set-minimum-latency
org.freedesktop.upower.suspend
org.gnome.settings-daemon.plugins.power.backlight-helper
org.mate.power.backlight-helper
Pero al crear el fichero el formato es el mismo. Es posible también lograr el mismo resultado mediante gconf-editor, es más fácil pero esto nos enseña el uso de PolicyKit cuyo campo de acción es más amplio y porfesional.

Más recursos:
man polkit
man pklocalauthority

9 comentarios:

  1. Respuestas
    1. hola soy nuevo quiero hacer un repositorio local de centos como ago me pueden ayudar

      Eliminar
  2. Hola Claudio, gracias por este artículo, es bastante útil.

    En mi caso, estoy usando Ubuntu Server, en un "ordeñador" portátil, no me aparecen todas las opciones que muestras en tu caso.

    Solo tengo lo siguiente:

    org.freedesktop.login1.inhibit-handle-power-key
    org.freedesktop.login1.power-off
    org.freedesktop.login1.power-off-ignore-inhibit
    org.freedesktop.login1.power-off-multiple-sessions

    Me gustaría aprender como configurar el servidor para que no hiberne o suspenda cuando le cierre la pantalla y por supuesto, que no apague le disco duro, pero que si apague la pantalla, ya que no es útil en mi caso, por que suelo acceder por acceso remoto ssh.

    Creo entender que las lineas del archivo en mi caso son para desactivar el botón ce encendido & apagado, pero como no veo nada de hibernación y suspensión, entonces no se como proceder para desactivar estas acciones pre-configuradas del servidor.

    ¿Algún consejo/sugerencia?

    Saludos

    ResponderEliminar
    Respuestas
    1. Hola. Gracias por su comentario.

      En vez de usar power como filtro en grep, use hiberbate y suspend, y así podrá verlos

      # pkaction | grep suspend
      # pkaction | grep hibernate

      Saludos.

      Eliminar
  3. Estupendo!

    Tengo que cambiar la forma de pensar tipo M$ que tengo todavía.
    No se me había ocurrido y eso que es bastante lógico.

    Muchísimas gracias Claudio.

    ResponderEliminar
  4. Bueno, mis disculpas por varios comentarios seguidos, pero he encontrado algo que a algún neófito en Linux como yo le podría ayudar con el tema tratado en el articulo de Claudio.

    El objetivo en cuestión es logind.conf y está en /etc/systemd/ (Debian/Ubuntu) posiblemente, en otras distros sea la misma localización o no, no lo sé.

    sudo nano /etc/systemd/logind.conf

    En este archivo aparecen unas opciones mas que interesantes, no estoy seguro al 100% pero creo que se puede aplicar la configuración adecuada para cualquier caso editando este archivo.

    A mi me aparece lo siguiente:

    [Login]
    #NAutoVTs=6
    #ReserveVT=6
    #KillUserProcesses=no
    #KillOnlyUsers=
    #KillExcludeUsers=root
    #InhibitDelayMaxSec=5
    #HandlePowerKey=poweroff
    #HandleSuspendKey=suspend
    #HandleHibernateKey=hibernate
    #HandleLidSwitch=suspend
    #HandleLidSwitchDocked=ignore
    #PowerKeyIgnoreInhibited=no
    #SuspendKeyIgnoreInhibited=no
    #HibernateKeyIgnoreInhibited=no
    #LidSwitchIgnoreInhibited=yes
    #HoldoffTimeoutSec=30s
    #IdleAction=ignore
    #IdleActionSec=30min
    #RuntimeDirectorySize=10%
    #RemoveIPC=yes

    Descomentando las linea que queramos usar y cambiándole el atributo adecuado que nos interese se consigue la configuración deseada.

    En mi caso y a modo de ejemplo, para deshabilitar el interruptor usado en el cierre de la pantalla de un portátil que provoca la suspensión del sistema y o la hibernación del servidor, incluso provocaba el cierre de la sesión ssh de acceso remoto.

    HandleSuspendKey=ignore
    HandleHibernateKey=ignore
    HandleLidSwitch=ignore

    Guardamos los cambios, reiniciamos el sistema operativo y comprobamos el resultado.

    Y eso es todo, solo modifiqué esas tres propiedades del sistema y ahora ya no se suspende el sistema al cerrar la pantalla del PC portátil, pero la pantalla si se apaga al cerrarla.

    En mi caso, este tema quedo solucionado, una vez mas, muchas gracias por tu ayuda Claudo!

    Saludos.


    ResponderEliminar
    Respuestas
    1. Gracias por el aporte.

      Eso es así debido a que su distro usa Systemd, como ya lo hace la mayoría de las principales.

      Eliminar
  5. hola escribí el comando sleep así sin ponerle tiempo y ahora no me deja entrar que puedo hacer.

    ResponderEliminar
  6. hola escribí el comando sleep así sin ponerle tiempo y ahora no me deja entrar que puedo hacer.

    ResponderEliminar