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스크립트가 실행되는 즉시 네트워크가 이미 비활성화되어 있으므로 스크립트를 넣는 것이 도움이되지 않습니다.


전원 관리 옵션을 살펴보고 "컴퓨터가 일시 중단 된 경우 네트워킹 비활성화"효과에 영향을주는 항목을 찾으십시오.
Joseph R.

그와 같은 일은 없다. 나는 그놈 3과 함께 xmonad를 사용하고 있습니다.
C-Otto

그놈 쉘을 xmonad로 바꾸고 있지만 다른 것을 바꾸지 않습니까? 그렇다면 전원 옵션은의 "전원"패널에 gnome-control-center있습니다.
strugee

알아. 당신이 말한 것은 없습니다.
C-Otto

질문 당신이있는 거 물어은 약간이다 XY 문제 , 작년에 귀하에게 제공 대답, unix.stackexchange.com/questions/62157/... , 정지 전력 관리에 묶여 사용자 정의 작업 후크를 만드는 WRT / 이력서는 방법입니다 여기로 네트워크를 조금 더 길게 올리려고 시도하는 것이이 문제에 접근하는 올바른 방법이 아닙니다.
slm

답변:


4

표준인지는 모르겠지만 우분투에는 일시 중지 / 재개 /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. $NA "적용되지 않음", $DX"비활성화 됨"및 $NX"실행 가능하지 않음" hook_exit_statuspm-functions 스크립트에서 함수를 참조하십시오

자동으로 다시 시작한 후에 다시 마운트 할 수도 있습니다. 에서 여기에 내가 발견 :

일시 중지 또는 최대 절전 모드에서 설정에 특정한 작업을 수행하려는 경우 자신 만의 후크를 /etc/pm/sleep.d에 쉽게 넣을 수 있습니다. 이 디렉토리의 훅은 일시 중단 (알파벳 순서로 명시하기 위해 이름이 모두 2 자리로 시작하는 이유) 및 재개 동안 역순으로 알파벳순으로 호출됩니다.

따라서 동일한 스크립트에 넣어 umountmount command(그 후이 네트워크를 종료하기 전에 실행되는 일시 정지 및 재개에) 작동합니다.

귀하의 질문에 있는 링크 가 드러납니다. 00-50 레벨의 스크립트가 실행되기 전에 NetworkManager가 네트워크를 종료하면 버그입니다.-최소한 연결이 시스템 연결로 표시되어 있으면 (네트워크 설정-> 옵션-> ID- > 다른 사용자에게 제공).


+1 pm-utils은 모든 주류 배포판에서 사용할 수 있어야하며 아마도 기본적으로 설치되어있을 것입니다.
goldilocks

1
/ usr / lib / pm-utils / pm-functions에 정의 된 특수 값 중 하나를 반환하여 일시 중단을 중단하지 않고 오류를 반환 할 수 있습니다. $NA"적용되지 않음", $DX"비활성화 됨"및 $NX"실행 가능하지 않음" . hook_exit_statuspm-functions 스크립트 의 기능 참조
Samuel Peter

참고 :이 답변은이 Q의 OP에 더 많이 제공되었습니다 : unix.stackexchange.com/questions/62157/… Network Manager 에는 존재하지 않는 다른 것을 찾고 있다고 생각합니다.
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최대 억제 5 초 (기본값) 또는 block무기한 차단 (첫 번째 방법을 권장합니다. 스크립트가 중단되면 노트북은 절대 절전 모드로 전환되지 않습니다.)
    • 이것은 잠금을 '유지'하는 파일 디스크립터를 리턴합니다.
  2. 지금 당신은 신호를들을
    • PrepareForSleepTrue일시 중지 또는 최대 절전 모드로 돌아가 거나 False재개 및 해동 할 때 반환 됩니다.
    • PrepareForShutdown, True종료하려고 할 때 반환 하고 False전원을 다시 켤 때 반환해야합니다 (대신 나에게 의미가없는 False반환과 동시에 반환 True되므로 False여기서는 무시할 것입니다. 아마도 자동 마운트 스크립트가 있습니다. 어쨌든 시스템 시작시?)
  3. True신호 처리 (예 : 마운트 해제)를 마치고 나면 파일 설명자를 닫아 ()로 잠금을 해제하여 Inhibit(...)5 초 동안 기다리지 않고 가능한 빨리 기계가 절전 모드 또는 종료 될 수 있습니다. 또는 block모드에 있을 때 무한정 )
  4. 당신은 처리 할 수 있습니다 False(첫번째 어쩌면 네트워크에 돌아 오기를 기다리는) 다시 마운트 한 다음에 새로운 잠금 생성에 의해 신호 (이력서 / 해동) Inhibit(...)(다음 수면 또는 종료를 들어)

파이썬 (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 계정의 연결을 끊습니다.

Inhibitor LockslogindD-Bus API 에 대한 공식 freedesktop 설명서를 참조하십시오 .


비슷한 일을하고 있습니다 ( unix.stackexchange.com/q/337853 ). 이것은 유망한 것처럼 들리지만 분명히 동일한 일을하는 NetworkManager와 경주하고 있습니까? NetworkManager가 네트워크를 중지하는 데 걸리는 것보다 네트워크 종속 스크립트를 실행하는 데 시간이 오래 걸리면 어떻게됩니까?
David

그것을 시도했지만 ( github.com/davidn/av ) 작동하는 것 같습니다!
David

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


0

일시 중단하기 전에 서비스를 종료하고 다시 시작한 후 다시 시작하십시오. 그렇게 :

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


무슨 소리 야? 네트워크 관리자 서비스를 중지해야합니까? 나는 그것이 어떻게 도움이 될지 이해하지 못한다.
C-Otto

Stack Exchange에 오신 것을 환영합니다! 기본적으로 단일 링크 인 답변은 제공하지 마십시오. 가능하면 링크 한 자료를 역언으로 표현해야하며, 그렇지 않은 경우에는 자료의 특성에 따라 복사 및 붙여 넣기를해도됩니다. 그리고 다시, 환영합니다!
strugee
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.