NetworkManager: rede desativada ao enviar o sistema para suspensão

11

Quando suspendo o notebook, NetworkManagerdesativa a rede sem fio (entrada nm-manager.c:do_sleep_wake).

No entanto, eu adoraria continuar usando a rede por um período muito curto (para desmontar cifsmontagens, que de outra forma tornariam meu sistema inutilizável ao reiniciar).

Como posso fazer para NetworkManager não desativar minha rede? É possível esperar alguns segundos (ou até que algo seja acionado; ou um bloqueio seja liberado)?

Relacionado: pm-utils: Nenhuma rede nos scripts de suspensão?

log de depuração:

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

EDIT: Para deixar claro, ter scripts /etc/pm/sleep.dnão ajuda, pois a rede já está desativada assim que um script é executado.

C-Otto
fonte
Dê uma olhada nas opções de gerenciamento de energia e procurar algo para o efeito de "desativar a rede quando o computador está suspenso"
Joseph R.
Não existe tal coisa. Eu estou usando xmonad com Gnome 3.
C-Otto
quer dizer que você está substituindo o GNOME Shell pelo xmonad, mas não está mudando mais nada? Nesse caso, as opções de energia estão no painel "Energia" de gnome-control-center.
strugee
Eu sei. Não existe o que você disse.
C-Otto
O Q que você está perguntando é um problema XY . A resposta que eu lhe dei no ano passado, unix.stackexchange.com/questions/62157/… , wrt criando ganchos de trabalho personalizados, vinculados à suspensão / retomada do gerenciamento de energia, é o caminho para ir aqui. Tentar sustentar a rede um pouco mais não é o caminho certo para abordar esse problema.
slm

Respostas:

4

Eu não sei se é padrão, mas no Ubuntu existem scripts que são executados antes da suspensão / após a retomada no /etc/pm/sleep.de dentro /usr/lib/pm-utils/sleep.d. No meu sistema parece que a rede está desligada /usr/lib/pm-utils/sleep.d/60_wpa_supplicant.

Você pode escrever um script, por exemplo, /etc/pm/sleep.d/10-umountpara desmontar seus compartilhamentos antes de suspender. A estrutura desses scripts é assim:

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

Observe que, se o script retornar um erro genérico, a suspensão será abortada; portanto, cuide disso (especialmente se você, como eu, usa para fechar a tampa e guardar o laptop ...). Para escrever coisas mais complexas, obrigado a Samuel Peter por seu comentário:

você pode retornar um erro sem interromper a suspensão, retornando um dos valores especiais definidos em /usr/lib/pm-utils/pm-functions: $NA é "não aplicável", $DXestá "desabilitado" e $NX"não é executável". Veja a hook_exit_statusfunção no script pm-functions

Você pode até remontá-los após retomar automaticamente; a partir daqui , descobri que:

Se você quiser fazer algo específico à sua configuração durante a suspensão ou hibernação, poderá facilmente colocar seu próprio gancho em /etc/pm/sleep.d. Os ganchos neste diretório serão chamados em ordem alfabética durante a suspensão (é por isso que todos os nomes começam com 2 dígitos, para tornar a ordem explícita) e na ordem inversa durante o resumo.

Então, colocar no mesmo script do umounte mount commanddeve funcionar (em suspendê-lo é executado antes de desligar da rede, e no currículo depois disso).

O link na sua pergunta é revelador; Minha interpretação é que, se o NetworkManager encerra a rede antes da execução dos scripts no nível 00-50, é um erro - pelo menos se a conexão estiver marcada como uma conexão do sistema (em Configurações de rede -> Opções -> Identidade - > Disponibilizar para outro usuário).

Rmano
fonte
O +1 pm-utilsdeve estar disponível em todas as distros principais e provavelmente está instalado por padrão.
Goldilocks
1
Observe que você pode retornar um erro sem interromper a suspensão retornando um dos valores especiais definidos em / usr / lib / pm-utils / pm-functions: $NAé "não aplicável", $DXestá "desativado" e $NX"não é executável" . Veja a hook_exit_statusfunção no script pm-functions
Samuel Peter
NOTA: Esta resposta foi fornecida mais ao OP neste Q: unix.stackexchange.com/questions/62157/… Acho que ele está procurando outra coisa que não existe no NetworkManager.
slm
Como eu já disse na pergunta referenciada, eu não tenho nenhuma rede nos scripts (ou seja, 10 unidades). Assim que qualquer script é executado, a rede já está inoperante.
C-Otto
1
Vou investigar a system connectionpropriedade. EDIT: Já era um system connection.
C-Otto
3

Com base no que o @ensc disse, você pode ouvir o sinal D-Bus (sessão do sistema). O fluxo de trabalho geral com a org.freedesktop.login1.Managerinterface seria:

  1. inibir o sono do sistema (talvez também desligar) com Inhibit(what, who, why, mode)
    • what: sleepoushutdown:sleep
    • who: unmount_cifsou o que você chamar de seu script
    • why: unmounting cifs X before suspend ...ou equivalente
    • mode: delaypara inibir no máximo. de 5s (padrão) ou blockpara bloquear indefinidamente (eu recomendaria o primeiro. Se o seu script parar, o seu notebook nunca irá dormir).
    • isso retorna um descritor de arquivo que 'mantém' o bloqueio
  2. agora você ouve o (s) sinal (es)
    • PrepareForSleep, que retorna Truequando está prestes a suspender ou hibernar e Falseao retomar e descongelar)
    • PrepareForShutdown, que retorna Truequando está prestes a desligar e deve retornar Falseao ligar novamente (em vez disso, também retorna Falseao mesmo tempo em que retorna, o Trueque não faz sentido para mim, então eu ignoraria a Falseparte aqui; provavelmente você já tem algum tipo de script de montagem automática no sistema iniciar de qualquer maneira, não é?)
  3. assim que você terminar de manipular o Truesinal (ou seja, desmontar), solte a trava fechando o descritor de arquivo (retornado por Inhibit(...)), para que a máquina entre no modo de suspensão ou desligamento o mais rápido possível sem esperar pelos 5s inteiros ( ou indefinidamente quando no blockmodo)
  4. você pode manipular o Falsesinal (retomar / descongelar) remontando (talvez primeiro aguardando a rede voltar a ligar) e, em seguida, crie um novo bloqueio com Inhibit(...)(para a próxima suspensão ou desligamento)

No Python (2.7), isso pode se parecer com:

#!/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()

No presente Síntese você vai encontrar o meu invólucro em torno Pidgin para desconectar IM contas sobre o sono e desligamento, usando exatamente a mesma abordagem.

Consulte também a documentação oficial do freedesktop sobre bloqueios de inibidores e a logindAPI D-Bus .

ste-fan
fonte
Eu estou olhando para fazer algo semelhante (para unix.stackexchange.com/q/337853 ). Parece promissor, mas certamente está correndo com o NetworkManager, que está fazendo a mesma coisa? O que acontece se o script dependente da rede demorar mais para ser executado do que o NetworkManager para parar a rede?
David
Tentei ( github.com/davidn/av ) e parece funcionar!
David
1

Você pode tentar descobrir por que nmestá desligando os dispositivos:

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

Quando (como no meu caso (Fedora 20)) systemdestá disparando o sinal, você pode negar sua entrega na configuração do 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>

Infelizmente, essas regras não são muito refinadas e também bloquearão o PrepareForSleepsinal para outros processos.

ensc
fonte
0

Tente desligar o serviço antes de suspender e reinicie após o resumo. Curtiu isso:

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

ipeacocks
fonte
O que você quer dizer? Devo parar o serviço de gerenciamento de rede? Eu não entendo como isso ajudaria.
C-Otto
bem-vindo ao Stack Exchange! não dê respostas que sejam basicamente links únicos. se possível, deve parafrasear o material ao qual vinculou; caso contrário, copiar e colar é bom desde que você o atribua. e de novo, bem-vindo!
strugee