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.


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).


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 .


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.


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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.