NetworkManager: 시스템을 절전 모드로 전환할 때 네트워킹 비활성화

NetworkManager: 시스템을 절전 모드로 전환할 때 네트워킹 비활성화

랩톱을 일시 중지하면 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도움이 되지 않습니다. 스크립트가 실행되면 네트워크가 이미 비활성화되어 있기 때문입니다.

답변1

표준인지는 모르겠지만 우분투에는 일시 중단 전/재개 후에 /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

스크립트가 일반 오류를 반환하면 일시 중지가 중단되므로 이 점에 유의하십시오(특히 저처럼 덮개를 닫고 노트북을 멀리 보관하는 경우...). 좀 더 복잡한 내용을 작성해 주신 Samuel Peter의 의견에 감사드립니다.

정의된 특수 값 "해당 없음", "비활성화" 및 "실행할 수 없음" /usr/lib/pm-utils/pm-functions중 하나를 반환하여 정지를 중단하지 않고 오류를 반환할 수 있습니다 . pm-functions 스크립트에서 함수 보기$NA$DX$NXhook_exit_status

자동 복구 후에 다시 설치할 수도 있습니다.여기내가 찾은 것 :

일시 중지 또는 최대 절전 모드 중에 설정과 관련된 작업을 수행하려면 /etc/pm/sleep.d에 자신만의 후크를 쉽게 넣을 수 있습니다. 이 디렉토리의 후크는 일시 중지 중에 알파벳 순서로 호출되고(순서를 명확하게 하기 위해 이름이 모두 2자리 숫자로 시작하는 이유입니다) 재개 중에는 역순으로 호출됩니다.

따라서 동일한 스크립트를 넣으면 작동 umount합니다 mount command(일시 중지 상태에서는 네트워크를 종료하기 전에 실행되고 재개 상태에서는 네트워크를 종료한 후 실행됩니다).

이것귀하의 질문에 링크 내 해석은 레벨 00-50의 스크립트가 실행되기 전에 NetworkManager가 네트워크를 종료하면 이는 버그라는 것입니다. 적어도 연결이 시스템 연결로 표시된 경우(네트워크 설정->옵션- >ID- > 다른 사용자가 사용할 수 있음).

답변2

@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최대 억제. 5초(기본값) 또는 block무기한 차단(첫 번째를 권장합니다. 스크립트가 중지되면 노트북은 절대 절전 모드로 전환되지 않습니다.)
    • 그러면 잠금을 "보유"하는 파일 설명자가 반환됩니다.
  2. 이제 당신은 신호를 듣습니다
    • PrepareForSleepTrue, 일시 중지하거나 최대 절전 모드로 전환하고 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()

존재하다이 점내 Pidgin 래퍼는 잠자기 및 종료 시 IM 계정 연결을 끊기 위해 정확히 동일한 방법을 사용한다는 것을 알 수 있습니다.

공식 freedesktop 문서도 참조하세요.억제제 잠금그리고logindD 버스 API.

답변3

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다른 프로세스의 신호도 차단합니다.

답변4

서비스를 일시 중단하기 전에 종료하고, 재개한 후 다시 시작해 보세요. 그렇게:

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

관련 정보