NetworkManager: red deshabilitada al enviar el sistema a la suspensión

11

Cuando suspendo mi computadora portátil, NetworkManagerdeshabilita la red inalámbrica (in nm-manager.c:do_sleep_wake).

Sin embargo, me encantaría seguir usando la red por un tiempo muy corto (para desmontar cifsmonturas, que de lo contrario harán que mi sistema sea inutilizable cuando se reanude).

¿Cómo puedo hacer que NetworkManager no deshabilite mi red? ¿Es posible esperar unos segundos (o hasta que se active algo o se libere un bloqueo)?

Relacionado: pm-utils: ¿No hay red en los scripts de suspensión?

registro de depuración:

Feb  8 10:03:23 zenbook NetworkManager[3606]: <debug> [1360314203.373226] [nm-manager.c:3391] upower_sleeping_cb(): Received UPower sleeping signal
Feb  8 10:03:23 zenbook NetworkManager[3606]: <info> sleep requested (sleeping: no  enabled: yes)
Feb  8 10:03:23 zenbook NetworkManager[3606]: <info> sleeping or disabling...
Feb  8 10:03:23 zenbook NetworkManager[3606]: <info> (wlan0): now unmanaged

EDITAR: para que quede claro, tener secuencias de comandos /etc/pm/sleep.dno ayuda, ya que la red ya está desactivada tan pronto como se ejecuta una secuencia de comandos.

C-Otto
fuente
Eche un vistazo a las opciones de administración de energía y busque algo en el sentido de "deshabilitar la red cuando la computadora está suspendida"
Joseph R.
No existe tal cosa. Estoy usando xmonad con Gnome 3.
C-Otto
¿Quieres decir que estás reemplazando el Shell de GNOME con xmonad, pero sin cambiar nada más? si es así, las opciones de energía se encuentran en el panel "Energía" de gnome-control-center.
Strugee
Lo sé. No hay tal cosa como dijiste.
C-Otto
La Q que está preguntando es un poco un problema XY . La respuesta que le proporcioné el año pasado, unix.stackexchange.com/questions/62157/… , es la creación de ganchos de trabajo personalizados vinculados a la suspensión / reanudación de la administración de energía. para ir aquí Intentar apuntalar la red un poco más no es la forma correcta de abordar este problema.
slm

Respuestas:

4

No sé si es estándar, pero en Ubuntu hay secuencias de comandos que se ejecutan antes de suspender / después de reanudar /etc/pm/sleep.dy continuar /usr/lib/pm-utils/sleep.d. En mi sistema parece que la red está cerrada por /usr/lib/pm-utils/sleep.d/60_wpa_supplicant.

Puede escribir un script, por ejemplo, /etc/pm/sleep.d/10-umountpara desmontar sus recursos compartidos antes de suspenderlos. La estructura de estos scripts es así:

#!/bin/sh
#
case "${1}" in
        suspend|hibernate)
                # your command to umount here 
                ;;
        resume|thaw)
                # (possibly) your command to mount here
                ;;
esac

Tenga en cuenta que si el script devuelve un error genérico, la suspensión se cancela, así que tenga cuidado con esto (especialmente si usted, como yo, lo usa para cerrar la tapa y guardar la computadora portátil ...). Para escribir cosas más complejas, gracias a Samuel Peter por su comentario:

puede devolver un error sin abortar la suspensión devolviendo uno de los valores especiales definidos en /usr/lib/pm-utils/pm-functions: $NA es "no aplicable", $DXestá "deshabilitado" y $NX"no es ejecutable". Vea la hook_exit_statusfunción en el script pm-functions

Incluso podría volver a montarlos después de reanudar automáticamente; desde aquí encontré que:

Si desea hacer algo específico a su configuración durante la suspensión o hibernación, puede poner fácilmente su propio gancho en /etc/pm/sleep.d. Los ganchos en este directorio se llamarán en orden alfabético durante la suspensión (esa es la razón por la cual todos sus nombres comienzan con 2 dígitos, para hacer que el pedido sea explícito) y en orden inverso durante la reanudación.

Poner en el mismo script el umounty mount commanddebería funcionar (en suspensión se ejecuta antes de apagar la red y en el curriculum vitae después de eso).

El enlace en su pregunta es revelador; Es mi interpretación que si NetworkManager apaga la red antes de que se ejecuten los scripts en el nivel 00-50, es un error --- al menos si la conexión está marcada como conexión del sistema (en Configuración de red -> Opciones -> Identidad - > Poner a disposición de otro usuario).

Rmano
fuente
+1 pm-utilsdebería estar disponible en todas las distribuciones principales y probablemente esté instalado de forma predeterminada.
Ricitos de oro
1
Tenga en cuenta que puede devolver un error sin abortar la suspensión devolviendo uno de los valores especiales definidos en / usr / lib / pm-utils / pm-functions: $NA"no corresponde", $DXestá "deshabilitado" y $NX"no es ejecutable" . Vea la hook_exit_statusfunción en el script pm-functions
Samuel Peter
NOTA: Esta respuesta y más se proporcionó al OP en este Q: unix.stackexchange.com/questions/62157/… Creo que está buscando algo más que no existe wrt NetworkManager.
slm
Como ya dije en la pregunta mencionada, no tengo ninguna red en los scripts (es decir, 10 umount). Tan pronto como se ejecuta cualquier script, la red ya está inactiva.
C-Otto
1
Investigaré la system connectionpropiedad. EDITAR: Ya era un system connection.
C-Otto
3

Sobre la base de lo que dijo @ensc, podría escuchar esa señal D-Bus (sesión del sistema). El flujo de trabajo general con la org.freedesktop.login1.Managerinterfaz sería:

  1. inhibir el sueño del sistema (tal vez también apagado) con Inhibit(what, who, why, mode)
    • what: sleeposhutdown:sleep
    • who: unmount_cifso como llames tu guión
    • why: unmounting cifs X before suspend ...o equivalente
    • mode: delaypara inhibir por un máx. de 5 s (predeterminado) o blockpara bloquear indefinidamente (recomendaría el primero. Si su script se detiene, su computadora portátil nunca se irá a dormir).
    • esto devuelve un descriptor de archivo que 'mantiene' el bloqueo
  2. ahora escuchas las señales
    • PrepareForSleep, que regresa Truecuando está a punto de suspender o hibernar y Falseal reanudar y descongelar)
    • PrepareForShutdown, que regresa Truecuando está a punto de apagarse y debería regresar Falsecuando se vuelve a encender (en cambio, también regresa Falseal mismo tiempo que regresa, Truelo que no tiene sentido para mí, por lo que simplemente ignoraría la Falseparte aquí; probablemente ya tenga algún tipo de script de montaje automático en el sistema de todos modos, ¿no?)
  3. tan pronto como termine de manejar la Trueseñal (es decir, desmontar), suelta el bloqueo cerrando el descriptor de archivo (devuelto por Inhibit(...)), de modo que la máquina pueda ir a dormir o apagarse lo más rápido posible sin esperar los 5 segundos completos ( o incluso indefinidamente cuando está en blockmodo)
  4. puede manejar la Falseseñal (reanudar / descongelar) volviendo a montar (tal vez primero esperando a que la red vuelva a Inhibit(...)encenderse) y luego crear un nuevo bloqueo con (para la próxima suspensión o apagado)

En Python (2.7) esto podría verse así:

#!/usr/bin/env python
import os, atexit, dbus, gobject
from dbus.mainloop import glib

def login1ManagerDBusIface():
    system_bus = dbus.SystemBus()
    proxy = system_bus.get_object( 'org.freedesktop.login1',
                                  '/org/freedesktop/login1' )
    login1 = dbus.Interface( proxy, 'org.freedesktop.login1.Manager')
    return login1

def sleepShutdownInhibit():
    login1 = login1ManagerDBusIface()
    fd = login1.Inhibit( 'shutdown:sleep', 'unmount_cifs',
                         'Unmounting before suspend/shutdown ...',
                         'delay' )
    return fd

def take_lock():
    global FD
    FD = sleepShutdownInhibit()

def remove_lock():
    global FD
    if FD:
        os.close( FD.take() )
        FD = None

def signal_handler(boolean, member=None):
    if boolean:  ## going to suspend/hibernate or shutdown
        ## PLACE YOUR UNMOUNT STUFF HERE
        remove_lock()
    else:  ## resume/thaw
        if member == 'PrepareForSleep':
            ## PLACE YOUR MOUNT STUFF HERE
            take_lock()

if __name__ == '__main__':
    take_lock()
    atexit.register(remove_lock)
    login1 = login1ManagerDBusIface()
    for signal in ['PrepareForSleep', 'PrepareForShutdown']:
        login1.connect_to_signal(signal, signal_handler,
                                 member_keyword='member')
    glib.DBusGMainLoop(set_as_default=True)
    loop = gobject.MainLoop()
    loop.run()

En este Gist encontrará mi envoltorio alrededor de Pidgin para desconectar las cuentas de mensajería instantánea en el modo de suspensión y apagado, utilizando exactamente el mismo enfoque.

Consulte también la documentación oficial de freedesktop sobre Inhibitor Locks y la logindAPI de D-Bus .

ste-fan
fuente
Estoy mirando hacer algo similar (para unix.stackexchange.com/q/337853 ). Esto suena prometedor, pero seguramente está compitiendo con NetworkManager que está haciendo lo mismo. ¿Qué sucede si mi script dependiente de la red tarda más en ejecutarse que el NetworkManager para detener la red?
David
Lo probé ( github.com/davidn/av ) y parece que funciona.
David
1

Podría intentar averiguar por qué nmestá cerrando los dispositivos:

dbus-monitor --system &
nmcli g logging level DEBUG
--> trigger suspend

Cuando (como en mi caso (Fedora 20)) systemdestá activando la señal, puede negar su entrega en la configuración de dbus:

---- /etc/dbus-1/system.d/99-my-suspend.conf ---
<busconfig>
        <policy user="root">
                <deny receive_interface="org.freedesktop.login1.Manager"
                      receive_type="signal"
                      receive_member="PrepareForSleep"/>
        </policy>
</busconfig>

Desafortunadamente, estas reglas no son muy finas y bloquearán la PrepareForSleepseñal para otros procesos también.

ensc
fuente
0

Intente apagar el servicio antes de suspenderlo y comience nuevamente después de reanudar. Como eso:

http://oleeekchoff.blogspot.ie/2012/05/restart-modulesservices-after.html

ipeacocks
fuente
¿Qué quieres decir? ¿Debo detener el servicio de administrador de red? No entiendo cómo eso ayudaría.
C-Otto
bienvenido a Stack Exchange! por favor no dé respuestas que sean básicamente enlaces únicos. si es posible, debe parafrasear el material al que se vinculó, de lo contrario, copiar y pegar está bien siempre que lo atribuya. y de nuevo, bienvenido!
Strugee