NetworkManager: wyłączono sieć podczas wysyłania systemu do uśpienia

11

Kiedy zawieszam komputer, NetworkManagerwyłącza sieć bezprzewodową (w nm-manager.c:do_sleep_wake).

Chciałbym jednak nadal używać sieci przez bardzo krótki czas (do odmontowywania cifsmontowań, które w przeciwnym razie uniemożliwiłyby mój system po wznowieniu).

Jak mogę NetworkManager nie wyłączać mojej sieci? Czy można poczekać kilka sekund (lub dopóki coś się nie uruchomi lub zamek zostanie zwolniony)?

Powiązane: pm-utils: Brak sieci w zawieszonych skryptach?

dziennik debugowania:

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

EDYCJA: Aby to wyjaśnić, posiadanie skryptów /etc/pm/sleep.dnie pomaga, ponieważ sieć jest już wyłączona, gdy tylko skrypt zostanie wykonany.

C-Otto
źródło
Spójrz na opcje zarządzania energią i poszukaj czegoś, co może skutkować „wyłączeniem sieci, gdy komputer jest zawieszony”
Joseph R.
Nie ma takiej rzeczy. Korzystam z Xmonada z Gnome 3.
C-Otto,
masz na myśli zamianę GNOME Shell na xmonad, ale nic nie zmieniasz? jeśli tak, opcje zasilania znajdują się w okienku „Zasilanie” gnome-control-center.
strugee
Wiem. Nie ma czegoś takiego jak powiedziałeś.
C-Otto,
Pytanie, które zadajesz , to trochę problem XY . Odpowiedź, którą ci dałem w zeszłym roku, unix.stackexchange.com/questions/62157/... , wt. Tworzenie niestandardowych haków zadań związanych z zawieszaniem / wznawianiem zarządzania energią jest sposobem iść tutaj. Próba podtrzymania sieci trochę dłużej nie jest dobrym sposobem na rozwiązanie tego problemu.
slm

Odpowiedzi:

4

Nie wiem, czy jest to standard, ale w Ubuntu istnieją skrypty, które są uruchamiane przed zawieszeniem / po wznowieniu do /etc/pm/sleep.di od /usr/lib/pm-utils/sleep.d. W moim systemie wydaje się, że sieć jest zamknięta przez /usr/lib/pm-utils/sleep.d/60_wpa_supplicant.

Możesz napisać skrypt na przykład, /etc/pm/sleep.d/10-umountaby odmontować swoje udziały przed zawieszeniem. Struktura tych skryptów jest taka:

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

Zauważ, że jeśli skrypt zwróci ogólny błąd, zawieszenie zostanie przerwane, więc zadbaj o to (zwłaszcza, że ​​ty, podobnie jak ja, używasz do zamykania pokrywy i przechowywania laptopa z dala ...). Aby napisać scenariusz do bardziej złożonych rzeczy, dziękuję Samuelowi Peterowi za jego komentarz:

możesz zwrócić błąd bez przerywania zawieszenia, zwracając jedną ze specjalnych wartości zdefiniowanych w /usr/lib/pm-utils/pm-functions: $NA nie ma zastosowania, $DXjest wyłączony i $NXnie można go wykonać. Zobacz hook_exit_statusfunkcję w skrypcie funkcji pm

Możesz nawet zamontować je ponownie po wznowieniu automatycznie; od tutaj znalazłem, że:

Jeśli chcesz zrobić coś specyficznego dla konfiguracji podczas zawieszenia lub hibernacji, możesz łatwo umieścić swój hak w /etc/pm/sleep.d. Haki w tym katalogu będą wywoływane w kolejności alfabetycznej podczas zawieszenia (to dlatego ich nazwy zaczynają się od 2 cyfr, aby wyraźne było porządkowanie) oraz w odwrotnej kolejności podczas wznawiania.

Więc umieszczenie tego samego skryptu umounti mount commandpowinno działać (w trybie zawieszenia jest wykonywane przed zamknięciem sieci, a następnie wznowione).

Ogniwo w swoim pytaniu jest jednoznaczne; z mojej interpretacji wynika, że ​​jeśli NetworkManager wyłączy sieć przed uruchomieniem skryptów na poziomie 00-50, jest to błąd --- przynajmniej jeśli połączenie jest oznaczone jako połączenie systemowe (w Ustawieniach sieci -> Opcje -> Tożsamość - > Udostępnij innym użytkownikom).

Rmano
źródło
+1 pm-utilspowinien być dostępny we wszystkich dystrybucjach głównego nurtu i prawdopodobnie jest domyślnie instalowany.
goldilocks
1
Zauważ, że możesz zwrócić błąd bez przerywania zawieszenia, zwracając jedną ze specjalnych wartości zdefiniowanych w / usr / lib / pm-utils / pm-functions: $NAjest „nie dotyczy”, $DXjest „wyłączony” i $NX„nie jest wykonywalny” . Zobacz hook_exit_statusfunkcję w skrypcie funkcji pm
Samuel Peter,
UWAGA: Ta odpowiedź została jeszcze dostarczona OP w tym pytaniu : unix.stackexchange.com/questions/62157/... Myślę, że on szuka czegoś innego, co nie istnieje wrt NetworkManager.
slm
Jak już powiedziałem w cytowanym pytaniu, nie mam żadnej sieci w skryptach (tj. 10-umount). Po uruchomieniu dowolnego skryptu sieć jest już wyłączona.
C-Otto,
1
Zbadam system connectionnieruchomość. EDYCJA: To już było system connection.
C-Otto,
3

Opierając się na tym, co powiedział @ensc, możesz zamiast tego samodzielnie nasłuchiwać tego sygnału D-Bus (sesji systemowej). Ogólny przepływ pracy z org.freedesktop.login1.Managerinterfejsem byłby następujący:

  1. hamować uśpienie systemu (być może także wyłączenie) za pomocą Inhibit(what, who, why, mode)
    • what: sleeplubshutdown:sleep
    • who: unmount_cifslub jakkolwiek nazwiesz swój skrypt
    • why: unmounting cifs X before suspend ...lub równoważny
    • mode: delaywstrzymać na maks. 5s (domyślnie) lub blockdo blokowania na czas nieokreślony (polecam pierwszy. Jeśli twój skrypt się zatrzyma, twój notebook nigdy nie położy się spać.)
    • zwraca deskryptor pliku, który „blokuje” blokadę
  2. teraz nasłuchujesz sygnałów
    • PrepareForSleep, która powraca, Truegdy ma się zawiesić lub hibernować, a także Falsewznowić i rozmrozić
    • PrepareForShutdown, który powraca, Truegdy ma się zamknąć i powinien powrócić Falsepo ponownym włączeniu (zamiast tego powraca również Falsew tym samym czasie, co wraca, Trueco nie ma dla mnie sensu, więc zignorowałbym tę Falseczęść tutaj; prawdopodobnie masz już jakiś skrypt automatyczny) i tak przy starcie systemu, prawda?)
  3. jak tylko skończysz z obsługą Truesygnału (tj. odmontowaniem), zwalniasz blokadę, zamykając deskryptor pliku (zwracany przez Inhibit(...)), aby maszyna mogła przejść w tryb uśpienia lub zamknięcia tak szybko, jak to możliwe, bez oczekiwania na całe 5 sekund ( lub nawet na czas nieokreślony w blocktrybie)
  4. możesz poradzić sobie z Falsesygnałem (wznawianie / rozmrażanie) przez ponowne zamontowanie (być może najpierw czekanie na powrót sieci), a następnie utworzenie nowej blokady za pomocą Inhibit(...)(na następny sen lub wyłączenie)

W Pythonie (2.7) może to wyglądać następująco:

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

W tej Gist znajdziesz moje opakowanie wokół Pidgin, aby rozłączyć konta IM podczas uśpienia i zamknięcia, stosując dokładnie to samo podejście.

Zobacz także oficjalną dokumentację freedesktop na temat Blokad Inhibitorów i logindAPI D-Bus .

Ste-Fan
źródło
Chcę zrobić coś podobnego (dla unix.stackexchange.com/q/337853 ). Brzmi obiecująco, ale na pewno ściga się z NetworkManagerem, który robi to samo? Co się stanie, jeśli mój skrypt zależny od sieci uruchomi się dłużej niż NetworkManager zatrzyma sieć?
David
Wypróbowałem ( github.com/davidn/av ) i wydaje się, że działa!
David
1

Możesz spróbować dowiedzieć się, dlaczego nmwyłącza się urządzenia:

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

Kiedy (jak w moim przypadku (Fedora 20)) systemdwyzwala sygnał, możesz odmówić jego dostarczenia w konfiguracji 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>

Niestety, zasady te nie są zbyt szczegółowe i będą blokować PrepareForSleepsygnał również dla innych procesów.

ensc
źródło
0

Spróbuj zamknąć usługę przed zawieszeniem i uruchom ponownie po wznowieniu. Tak:

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

ipeacocks
źródło
Co masz na myśli? Czy powinienem zatrzymać usługę menedżera sieci? Nie rozumiem, jak to by pomogło.
C-Otto,
Witamy w Stack Exchange! nie udzielaj odpowiedzi, które są w zasadzie pojedynczymi linkami. jeśli to możliwe, należy sparafrazować materiał, z którym się łączysz, w przeciwnym razie kopiowanie i wklejanie jest w porządku, o ile je przypisujesz. i jeszcze raz witamy!
strugee