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.

そのようなことはない。私はGnome 3でxmonadを使用しています
C-Otto

GNOME Shellをxmonadに置き換えるが、他には何も変更しないということですか?その場合、電源オプションはの[電源]ペインにありgnome-control-centerます。
Strugee 2013年

知っている。あなたが言ったようなものはありません。
C-Otto

あなたが尋ねているQは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

スクリプトが一般的なエラーを返した場合、サスペンドは中止されるので注意してください(特に、私のように、ふたを閉じてラップトップを保管するために使用します...)。より複雑なことをスクリプト化するために、コメントを提供してくれたSamuel Peterに感謝します。

で定義されている特別な値の1つを返すことで、サスペンドを中止せずにエラーを返すことができます/usr/lib/pm-utils/pm-functions$NA 「適用外」、$DX「無効」、$NX「実行不可能」です。hook_exit_statuspm-functionsスクリプトの関数を参照してください

再開後に自動的に再マウントすることもできます。ここから私はそれを見つけました:

サスペンドまたはハイバネート中に特定の設定を行う場合は、独自のフックを/etc/pm/sleep.dに簡単に配置できます。このディレクトリ内のフックは、サスペンド中にアルファベット順に呼び出され(そのため、名前がすべて2桁で始まるため、順序が明確になります)、再開時には逆の順序で呼び出されます。

したがって、同じスクリプトを入力するumountと、mount commandが機能するはずです(サスペンドでは、ネットワークをシャットダウンする前に実行され、その後、再開します)。

あなたの質問リンク は明らかにしています。レベル00-50のスクリプトが実行される前にNetworkManagerがネットワークをシャットダウンした場合、それはバグです---少なくとも、接続がシステム接続としてマークされている場合(ネットワーク設定->オプション-> ID- >他のユーザーが利用できるようにします)。


+1 pm-utilsはすべての主流のディストリビューションで利用可能であり、おそらくデフォルトでインストールされます。
goldilocks 2013年

1
/ usr / lib / pm-utils / pm-functionsで定義されている特別な値の1つを返すことで、サスペンドを中止せずにエラーを返すことができることに注意してください。$NA「適用外」、$DX「無効」、$NX「実行不可能」 。hook_exit_statuspm-functionsスクリプトの関数を参照してください
Samuel Peter

注:この回答は、このQのOPにさらに提供されました: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)
    • whatsleepまたはshutdown:sleep
    • whounmount_cifsまたは、スクリプトと呼ぶものは何でも
    • whyunmounting cifs X before suspend ...または同等のもの
    • modedelay最大抑制します。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()

、この骨子あなたはIMはまったく同じアプローチを使用して、睡眠やシャットダウン時にアカウント切断するピジンの周りに私のラッパーを見つけることができます。

禁止ロックlogindD-Bus APIに関する公式のfreedesktopドキュメントも参照してください。


私は同じようなことをしているのを見ています(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、他のプロセスのシグナルもブロックします。


0

一時停止する前にサービスをシャットダウンし、再開後に再開してください。そのように:

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


どういう意味ですか?ネットワークマネージャーサービスを停止する必要がありますか?それがどのように役立つかわかりません。
C-Otto

Stack Exchangeへようこそ!基本的に単一のリンクである答えを与えないでください。可能であれば、リンク先のマテリアルを言い換える必要があります。言い換えると、コピーと貼り付けは、それが帰属する限り問題ありません。再び、ようこそ!
Strugee 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.