NetworkManager: jaringan yang dinonaktifkan saat mengirim sistem ke mode tidur

11

Ketika saya menangguhkan buku catatan saya, NetworkManagermenonaktifkan jaringan nirkabel (dalam nm-manager.c:do_sleep_wake).

Namun, saya ingin tetap menggunakan jaringan untuk waktu yang sangat singkat (untuk melepas cifsmount, yang jika tidak membuat sistem saya tidak dapat digunakan saat melanjutkan).

Bagaimana saya bisa membuat NetworkManager tidak menonaktifkan jaringan saya? Apakah mungkin untuk menunggu beberapa detik (atau sampai sesuatu dipicu; atau kunci dilepaskan)?

Terkait: pm-utils: Tidak ada jaringan dalam skrip yang ditangguhkan?

log debug:

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

EDIT: Untuk membuatnya lebih jelas, memiliki skrip dalam /etc/pm/sleep.dtidak membantu karena jaringan sudah dinonaktifkan segera setelah skrip dieksekusi.

C-Otto
sumber
Lihatlah opsi manajemen daya dan cari sesuatu yang efeknya "menonaktifkan jaringan saat komputer ditangguhkan"
Joseph R.
Tidak ada hal seperti itu. Saya menggunakan xmonad dengan Gnome 3.
C-Otto
Anda berarti Anda mengganti GNOME Shell dengan xmonad, tetapi tidak mengubah apa pun? jika demikian, opsi daya ada di panel "Daya" dari gnome-control-center.
strugee
Aku tahu. Tidak ada yang Anda katakan.
C-Otto
Q yang Anda tanyakan adalah sedikit masalah XY , Jawaban yang saya berikan kepada Anda tahun lalu, unix.stackexchange.com/questions/62157/… , wrt membuat kait pekerjaan khusus yang terkait dengan penangguhan / resume manajemen daya adalah caranya untuk pergi ke sini. Mencoba menopang jaringan sedikit lebih lama bukanlah cara yang tepat untuk mendekati masalah ini.
slm

Jawaban:

4

Saya tidak tahu apakah itu standar, tetapi di Ubuntu ada skrip yang dijalankan sebelum menunda / setelah melanjutkan masuk /etc/pm/sleep.ddan masuk /usr/lib/pm-utils/sleep.d. Dalam sistem saya tampaknya jaringan dimatikan /usr/lib/pm-utils/sleep.d/60_wpa_supplicant.

Anda dapat menulis skrip misalnya /etc/pm/sleep.d/10-umountuntuk meng-unmount saham Anda sebelum ditangguhkan. Struktur skrip ini adalah seperti itu:

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

Perhatikan bahwa jika skrip mengembalikan kesalahan umum, penangguhan dibatalkan, jadi berhati-hatilah (terutama Anda, seperti saya, gunakan untuk menutup penutup dan menyimpan laptop ...). Untuk menulis hal-hal yang lebih kompleks, terima kasih kepada Samuel Peter untuk komentarnya:

Anda dapat mengembalikan kesalahan tanpa membatalkan penangguhan dengan mengembalikan salah satu nilai khusus yang didefinisikan dalam /usr/lib/pm-utils/pm-functions: $NA "tidak berlaku", $DX"dinonaktifkan", dan $NX"tidak dapat dieksekusi". Lihat hook_exit_statusfungsi di skrip pm-functions

Anda bahkan dapat mengirim ulang setelah resume secara otomatis; dari sini saya menemukan bahwa:

Jika Anda ingin melakukan sesuatu yang spesifik untuk pengaturan Anda selama penangguhan atau hibernasi, maka Anda dapat dengan mudah memasukkan hook Anda ke /etc/pm/sleep.d. Kait dalam direktori ini akan dipanggil dalam urutan abjad selama penangguhan (itulah sebabnya nama mereka semua dimulai dengan 2 digit, untuk membuat urutan eksplisit) dan dalam urutan terbalik selama resume.

Jadi memasukkan skrip yang sama umountdan mount commandharus bekerja (dalam menangguhkan itu dijalankan sebelum mematikan jaringan, dan melanjutkan setelah itu).

The link dalam pertanyaan Anda adalah mengungkapkan; itu adalah interpretasi saya bahwa jika NetworkManager mematikan jaringan sebelum skrip pada level 00-50 dijalankan itu adalah bug --- setidaknya jika koneksi ditandai sebagai koneksi sistem (dalam Pengaturan Jaringan -> Pilihan -> Identitas - > Jadikan tersedia untuk pengguna lain).

Rmano
sumber
+1 pm-utilsharus tersedia di semua distro utama dan mungkin diinstal secara default.
goldilocks
1
Perhatikan bahwa Anda dapat mengembalikan kesalahan tanpa membatalkan penangguhan dengan mengembalikan salah satu nilai khusus yang didefinisikan dalam / usr / lib / pm-utils / pm-functions: $NA"tidak berlaku", $DX"dinonaktifkan", dan $NX"tidak dapat dieksekusi" . Lihat hook_exit_statusfungsi dalam skrip pm-function
Samuel Peter
CATATAN: Jawaban ini lebih banyak diberikan kepada OP pada Q ini: unix.stackexchange.com/questions/62157/... Saya pikir dia mencari sesuatu yang lain yang tidak ada di NetworkManager.
slm
Seperti yang sudah saya katakan dalam pertanyaan yang direferensikan, saya tidak memiliki jaringan dalam skrip (yaitu 10-umount). Segera setelah skrip dijalankan, jaringan sudah mati.
C-Otto
1
Saya akan menyelidiki system connectionproperti. EDIT: Itu sudah a system connection.
C-Otto
3

Berdasarkan apa yang dikatakan @ensc, Anda bisa mendengarkan sendiri sinyal D-Bus (sesi sistem). Alur kerja umum dengan org.freedesktop.login1.Managerantarmuka adalah:

  1. menghambat tidur sistem (mungkin juga shutdown) dengan Inhibit(what, who, why, mode)
    • what: sleepataushutdown:sleep
    • who: unmount_cifsatau apa pun yang Anda sebut skrip Anda
    • why: unmounting cifs X before suspend ...atau setara
    • mode: delayuntuk menghambat secara maksimal. 5s (default) atau blockuntuk memblokir tanpa batas waktu (saya akan merekomendasikan yang pertama. Jika skrip Anda berhenti, notebook Anda tidak akan pernah tidur.)
    • ini mengembalikan deskriptor file yang 'memegang' kunci
  2. sekarang Anda mendengarkan sinyal
    • PrepareForSleep, yang kembali Truesaat akan ditangguhkan atau hibernasi dan Falsesaat melanjutkan dan mencairkan)
    • PrepareForShutdown, yang kembali Trueketika hendak dimatikan dan harus kembali Falseketika dinyalakan kembali (sebagai gantinya juga kembali Falsepada saat yang sama ia kembali Trueyang tidak masuk akal bagi saya, jadi saya hanya akan mengabaikan Falsebagian di sini; Anda mungkin sudah memiliki beberapa jenis skrip automounting pada sistem mulai, bukan?)
  3. segera setelah Anda selesai menangani Truesinyal (mis. unmount) Anda melepaskan kunci dengan menutup file descriptor (dikembalikan oleh Inhibit(...)), sehingga mesin dapat tidur atau mati secepat mungkin tanpa menunggu 5s keseluruhan ( atau bahkan tanpa batas waktu dalam blockmode)
  4. Anda dapat menangani Falsesinyal (melanjutkan / mencairkan) dengan remounting (mungkin pertama-tama menunggu jaringan kembali) dan kemudian membuat kunci baru dengan Inhibit(...)(untuk sleep atau shutdown berikutnya)

Dalam Python (2.7) ini bisa terlihat seperti:

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

Dalam Gist ini Anda akan menemukan pembungkus saya di sekitar Pidgin untuk memutuskan hubungan akun IM saat tidur dan mati, menggunakan pendekatan yang persis sama.

Lihat juga dokumentasi resmi freedesktop tentang Inhibitor Locks dan logindD-Bus API .

ste-fan
sumber
Saya melihat melakukan sesuatu yang serupa (untuk unix.stackexchange.com/q/337853 ). Ini kedengarannya menjanjikan, tetapi tentunya berpacu dengan NetworkManager yang melakukan hal yang sama? Apa yang terjadi jika skrip yang tergantung pada jaringan saya membutuhkan waktu lebih lama untuk dijalankan daripada NetworkManager untuk menghentikan jaringan?
David
Sudah mencoba ( github.com/davidn/av ) dan sepertinya berhasil!
David
1

Anda bisa mencoba mencari tahu mengapa nmmematikan perangkat:

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

Ketika (seperti dalam kasus saya (Fedora 20)), systemdmemicu sinyal, Anda dapat menolak pengirimannya dalam konfigurasi 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>

Sayangnya, aturan ini tidak berbutir halus dan akan memblokir PrepareForSleepsinyal untuk proses lain juga.

ENC
sumber
0

Cobalah untuk mematikan layanan sebelum menangguhkan dan mulai lagi setelah melanjutkan. Seperti itu:

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

ipeacocks
sumber
Maksud kamu apa? Haruskah saya menghentikan layanan manajer jaringan? Saya tidak mengerti bagaimana itu akan membantu.
C-Otto
selamat datang di Stack Exchange! tolong jangan berikan jawaban yang pada dasarnya adalah tautan tunggal. jika mungkin, Anda harus memparafrasekan materi yang Anda tautkan, jika tidak, menyalin dan menempel tidak masalah selama Anda mengaitkannya. dan lagi, selamat datang!
strugee