NetworkManager: отключение сети при отправке системы в спящий режим

11

Когда я приостанавливаю свой ноутбук, NetworkManagerотключает беспроводную сеть (в nm-manager.c:do_sleep_wake).

Тем не менее, я хотел бы по-прежнему использовать сеть в течение очень короткого времени (для размонтирования cifsмонтировок, которые в противном случае делают мою систему непригодной к использованию при возобновлении работы).

Как я могу сделать так, чтобы NetworkManager не отключить мою сеть? Можно ли подождать несколько секунд (или пока что-то не сработает или не будет снята блокировка)?

Связанный: pm-utils: Нет сети в сценариях приостановки?

журнал отладки:

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

РЕДАКТИРОВАТЬ: чтобы прояснить, наличие сценариев /etc/pm/sleep.dне помогает, так как сеть уже отключена, как только сценарий выполняется.

С-Отто
источник
Взгляните на варианты управления питанием и найдите что-то с эффектом «отключение сети, когда компьютер приостановлен»
Джозеф Р.
Там нет такой вещи. Я использую xmonad с Gnome 3.
C-Otto
Вы имеете в виду, что вы заменяете оболочку GNOME на xmonad, но не меняете ничего другого? в этом случае параметры питания находятся на панели «Питание» gnome-control-center.
стружка
Я знаю. Там нет такой вещи, как вы сказали.
C-Otto
Вопрос, который вы спрашиваете, представляет собой небольшую проблему XY . Ответ, который я дал вам в прошлом году, unix.stackexchange.com/questions/62157/… , заключается в создании пользовательских хуков заданий, связанных с управлением питанием. пойти сюда. Попытка поддержать сеть немного дольше не является правильным способом решения этой проблемы.
slm

Ответы:

4

Я не знаю , если это стандарт, но в Ubuntu есть сценарий, выполняется до приостановки / после возобновления в /etc/pm/sleep.dи в /usr/lib/pm-utils/sleep.d. В моей системе кажется, что сеть закрыта /usr/lib/pm-utils/sleep.d/60_wpa_supplicant.

Например, вы можете написать скрипт для /etc/pm/sleep.d/10-umountразмонтирования ваших акций перед приостановкой. Структура этих скриптов такая:

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

Обратите внимание, что если скрипт возвращает общую ошибку, приостановка прерывается, поэтому позаботьтесь об этом (особенно если вы, как и я, используете, чтобы закрыть крышку и убрать ноутбук ...). Чтобы написать более сложные вещи, спасибо Сэмюэлю Питеру за его комментарий:

вы можете вернуть ошибку, не прерывая приостановку, вернув одно из специальных значений, определенных в /usr/lib/pm-utils/pm-functions: $NA «не применимо», $DX«отключено» и $NX«не выполнимо». Смотрите hook_exit_statusфункцию в скрипте pm-functions

Вы можете даже перемонтировать их после возобновления автоматически; из здесь я обнаружил , что:

Если вы хотите сделать что-то особенное для вашей настройки во время приостановки или спящего режима, то вы можете легко поместить свой собственный хук в /etc/pm/sleep.d. Хуки в этом каталоге будут вызываться в алфавитном порядке во время приостановки (по этой причине все имена начинаются с 2 цифр, чтобы сделать порядок явным) и в обратном порядке во время возобновления.

Таким образом, вставка в тот же сценарий umountи mount commandдолжна работать (в режиме ожидания он выполняется до выключения сети, а в резюме после этого).

Ссылка на ваш вопрос показательна; я понимаю, что если NetworkManager завершает работу сети перед запуском сценариев уровня 00-50, это ошибка - по крайней мере, если подключение помечено как системное подключение (в «Параметры сети» -> «Параметры» -> «Идентификация» - > Сделать доступным для другого пользователя).

Rmano
источник
+1 pm-utilsдолжен быть доступен на всех основных дистрибутивах и, вероятно, установлен по умолчанию.
Златовласка
1
Обратите внимание, что вы можете вернуть ошибку, не прерывая приостановку, вернув одно из специальных значений, определенных в / usr / lib / pm-utils / pm-functions: $NAэто «не применимо», $DX«отключено» и $NX«не выполнимо» , Смотрите hook_exit_statusфункцию в скрипте pm-functions
Сэмюэль Питер
ПРИМЕЧАНИЕ. Этот ответ был дополнительно предоставлен ОП на этот вопрос: unix.stackexchange.com/questions/62157/… Я думаю, он ищет что-то еще, чего не существует в NetworkManager.
slm
Как я уже сказал в указанном вопросе, у меня нет скриптов в сети (т. Е. 10-umount). Как только любой скрипт выполняется, сеть уже не работает.
C-Otto
1
Я буду исследовать system connectionсобственность. РЕДАКТИРОВАТЬ: Это уже было system connection.
C-Otto
3

Основываясь на том, что сказал @ensc, вы могли бы вместо этого прослушивать сигнал D-Bus (системный сеанс) самостоятельно. Общий рабочий процесс с org.freedesktop.login1.Managerинтерфейсом будет:

  1. запретить системный сон (возможно, также выключение) с Inhibit(what, who, why, mode)
    • what: sleepилиshutdown:sleep
    • who: unmount_cifsили как ты назовешь свой сценарий
    • why: unmounting cifs X before suspend ...или эквивалент
    • mode: delayдля торможения макс. 5s (по умолчанию) или blockблокировать на неопределенный срок (я бы порекомендовал первый. Если ваш скрипт остановится, ваш ноутбук просто никогда не заснет.)
    • это возвращает файловый дескриптор, который «держит» блокировку
  2. теперь вы слушаете сигнал (ы)
    • PrepareForSleep, который возвращается, Trueкогда собирается приостановить или в спящем режиме и Falseпри возобновлении и оттаивании)
    • PrepareForShutdown, который возвращает, Trueкогда собирается завершить работу, и должен возвращаться Falseпри включении питания (вместо этого он также возвращает Falseв то же время, что и возврат, Trueчто не имеет смысла для меня, так что я просто проигнорировал бы эту Falseчасть здесь; у вас, вероятно, уже есть какой-то скрипт автоподключения в любом случае, на старте системы?)
  3. как только вы закончите с обработкой Trueсигнала (то есть отключением), вы снимаете блокировку, закрывая файловый дескриптор (возвращаемый Inhibit(...)), чтобы машина могла перейти в спящий режим или выключиться как можно быстрее, не дожидаясь целых 5 секунд ( или даже на неопределенный срок в blockрежиме)
  4. Вы можете обработать Falseсигнал (возобновить / разморозить), перемонтировав (возможно, сначала дождавшись, пока сеть снова включится), а затем создав новую блокировку с помощью Inhibit(...)(для следующего спящего режима или выключения)

В Python (2.7) это может выглядеть так:

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

В этом Gist вы найдете мою оболочку вокруг Pidgin для отключения учетных записей IM в спящем и выключенном состоянии, используя точно такой же подход.

Смотрите также официальную документацию freedesktop о блокировках ингибиторов и logindD-Bus API .

STE-вентилятор
источник
Я смотрю на что-то подобное (для unix.stackexchange.com/q/337853 ). Это звучит многообещающе, но, конечно, это гонка с NetworkManager, который делает то же самое? Что произойдет, если мой зависимый от сети скрипт займет больше времени, чем NetworkManager, чтобы остановить сеть?
Дэвид
Пробовал ( github.com/davidn/av ) и похоже на работу!
Дэвид
1

Вы можете попытаться выяснить, почему nmпроисходит отключение устройств:

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

Когда (как в моем случае (Fedora 20)) systemdзапускается сигнал, вы можете запретить его доставку в конфигурации 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>

К сожалению, эти правила не очень детализированы, и это будет блокировать PrepareForSleepсигнал и для других процессов.

ensc
источник
0

Попробуйте отключить службу, прежде чем приостановить и запустить снова после возобновления. Как это:

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

ipeacocks
источник
Что вы имеете в виду? Стоит ли останавливать службу диспетчера сети? Я не понимаю, как это поможет.
C-Otto
добро пожаловать в Stack Exchange! пожалуйста, не дайте ответов, которые в основном одиночные ссылки. если возможно, вам следует перефразировать материал, на который вы ссылаетесь, в противном случае копирование и вставка в порядке, если вы его присваиваете. и снова добро пожаловать!
стружка