NetworkManager: sistemi uyku moduna gönderirken ağ devre dışı


11

Dizüstü bilgisayarımı askıya aldığımda NetworkManagerkablosuz ağı (in nm-manager.c:do_sleep_wake) devre dışı bırakır .

Ancak, ağı çok kısa bir süre için kullanmak isterim ( cifsbağları sökmek için, aksi takdirde sistemimi devam ettirirken kullanılamaz hale getirir).

Nasıl bir hale getirebilir NetworkManager değil benim ağı devre dışı bırakmak? Birkaç saniye beklemek (veya bir şey tetiklenene kadar veya bir kilit açılana kadar) mümkün mü?

İlgili: pm-utils: Askıya alma komut dosyalarında ağ yok mu?

hata ayıklama günlüğü:

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

DÜZENLEME: Netleştirmek için, komut dosyaları /etc/pm/sleep.dyürütüldüğünde ağ zaten devre dışı bırakıldığı için komut dosyalarının bulunması yardımcı olmaz.


Güç yönetimi seçeneklerine bir göz atın ve "bilgisayar askıya alındığında ağ bağlantısını devre dışı bırak" etkisine bir şey arayın
Joseph R.

Öyle bir şey yok. Gnome 3 ile xmonad kullanıyorum
C-Otto

yani GNOME Kabuğunu xmonad ile değiştiriyorsunuz, ancak başka bir şeyi değiştirmiyor musunuz? öyleyse, güç seçenekleri "Güç" bölmesinde bulunur gnome-control-center.
strugee

Biliyorum. Söylediğin gibi bir şey yok.
C-Otto

Sorduğunuz Q bir XY problemi , Geçen yıl size verdiğim cevap, unix.stackexchange.com/questions/62157/… , wrt güç yönetimi askıya alma / devam ettirmeye bağlı özel iş kancaları oluşturma yoludur buraya gitmek için. Ağı biraz daha uzatmaya çalışmak, bu soruna yaklaşmanın doğru yolu değildir.
slm

Yanıtlar:


4

Standart olup olmadığını bilmiyorum, ancak Ubuntu'da, askıya alma / devam ettirme /etc/pm/sleep.dve başlatma işleminden önce çalıştırılan komut dosyası var /usr/lib/pm-utils/sleep.d. Sistemimde ağ tarafından kapatılmış gibi görünüyor /usr/lib/pm-utils/sleep.d/60_wpa_supplicant.

/etc/pm/sleep.d/10-umountAskıya almadan önce paylaşımlarınızı kaldırmak için bir komut dosyası yazabilirsiniz . Bu scriptlerin yapısı şöyledir:

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

Komut dosyası genel bir hata döndürürse askıya almanın iptal edildiğine dikkat edin, bu yüzden buna dikkat edin (özellikle benim gibi, kapağı kapatmak ve dizüstü bilgisayarı saklamak için kullanın ...). Daha karmaşık şeyler yazmak için Samuel Peter'a yaptığı açıklama için teşekkürler:

şu şekilde tanımlanan özel değerlerden birini döndürerek askıya alma işlemini iptal etmeden bir hata döndürebilirsiniz /usr/lib/pm-utils/pm-functions: $NA "uygulanabilir değil", $DX"devre dışı" ve $NX"yürütülebilir" değil. hook_exit_statusPm-functionlar komut dosyasındaki işleve bakın

Hatta otomatik olarak devam ettikten sonra onları yeniden monte edebilirsiniz; dan burada bunu buldum:

Askıya alma veya hazırda bekletme sırasında kurulumunuza özgü bir şey yapmak istiyorsanız, kolayca kendi kancalarınızı /etc/pm/sleep.d içine koyabilirsiniz. Bu dizindeki kancalar, askıya alma sırasında alfabetik sırayla (siparişlerinin açık hale getirilmesi için adlarının 2 basamakla başlamasının nedeni budur) ve özgeçmiş sırasında ters sırayla çağrılacaktır.

Bu yüzden aynı komut dosyasını koymak umountve mount commandçalışması gerekir (askıya alındığında ağ kapatılmadan önce yürütülür ve bundan sonra devam eder).

Sorunuzdaki bağlantı ortaya çıkıyor; benim yorumum, NetworkManager 00-50 seviyesindeki komut dosyaları çalıştırılmadan önce ağı kapatırsa bir hatadır - en azından bağlantı bir sistem bağlantısı olarak işaretlenmişse (Ağ Ayarları -> Seçenekler -> Kimlik - > Diğer kullanıcılar için kullanılabilir yap).


+1 pm-utilstüm ana dağıtımlarda kullanılabilir olmalıdır ve muhtemelen varsayılan olarak yüklenir.
goldilocks

1
/ Usr / lib / pm-utils / pm-function: içinde tanımlanmış özel değerlerden birini döndürerek askıya alma işlemini iptal etmeden hata döndürebileceğinizi unutmayın: $NA"uygulanamaz", $DX"devre dışı" ve $NX"yürütülebilir" değil . hook_exit_statusPm-fonksiyonlar senaryosundaki fonksiyonu görün
Samuel Peter

NOT: Bu cevap bu Q'da OP'ye daha fazla sağlanmıştır: unix.stackexchange.com/questions/62157/… NetworkManager'da mevcut olmayan başka bir şey aradığını düşünüyorum.
slm

Referanslı soruda zaten söylediğim gibi, komut dosyalarında (yani 10 umount) herhangi bir ağım yok. Herhangi bir komut dosyası yürütülür yürütülmez, ağ zaten kapalıdır.
C-Otto

1
system connectionMülkü araştıracağım . EDIT: Zaten bir system connection.
C-Otto

3

@Ensc'in söylediklerine dayanarak, bu D-Bus (sistem oturumu) sinyalini kendiniz dinleyebilirsiniz. org.freedesktop.login1.ManagerArayüz ile genel iş akışı şu şekildedir:

  1. ile sistem uyku engelleme (belki de kapatma) ile Inhibit(what, who, why, mode)
    • what: sleepveyashutdown:sleep
    • who: unmount_cifsveya senaryonuza ne derseniz
    • why: unmounting cifs X before suspend ...veya eşdeğeri
    • mode: delaymaks. (varsayılan) veya blocksüresiz olarak engellemek için (ilkini öneririm. Betiğiniz durursa, dizüstü bilgisayarınız asla uyku moduna geçmez.)
    • bu, kilidi 'tutan' bir dosya tanımlayıcı döndürür
  2. şimdi sinyalleri dinliyorsun
    • PrepareForSleepTrueaskıya alınmaya veya hazırda bekletme moduna Falsegeçtiğinde ve devam ve çözdürme sırasında geri döner )
    • PrepareForShutdown, Truene Falsezaman kapanmak üzereyken döner Falseve tekrar açıldığında geri dönmelidir (bunun yerine aynı zamanda geri döner , bu da Truebana mantıklı gelmez, bu yüzden Falseburada parçayı görmezden gelirim ; muhtemelen bir tür otomatik montaj komut dosyanız var yine de sistem başlangıcında değil mi?)
  3. Truesinyali işlemeyi bitirir bitirmez (örn. ayırma), dosya tanımlayıcısını (geri döndürerek) kapatarak kilidi serbest bırakırsınız Inhibit(...), böylece makine tüm 5'leri beklemeden mümkün olduğunca hızlı uyku veya kapanmaya gidebilir ( veya blockmoddayken süresiz olarak )
  4. Falsesinyali yeniden bağlayarak (devam / çözülme) (belki önce ağın tekrar açılmasını bekleyebilir ) ve ardından Inhibit(...)(bir sonraki uyku veya kapatma için) ile yeni bir kilit oluşturabilirsiniz.

Python'da (2.7) şöyle görünebilir:

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

Gelen bu Gist'e ayırma IM aynı yaklaşımı kullanarak, uyku ve kapatma hesabını sen Pidgin etrafında sarıcı bulacaksınız.

Ayrıca, İnhibitör Kilitleri ve logindD-Bus API'sı ile ilgili resmi freedesktop belgelerine bakın .


Benzer bir şey yapmayı arıyorum ( unix.stackexchange.com/q/337853 için ). Bu umut vericidir, ancak kesinlikle aynı şeyi yapan NetworkManager ile yarışıyor mu? Ağa bağlı komut dosyamın çalışması, NetworkManager'ın ağı durdurmaktan daha uzun sürmesi durumunda ne olur?
David

Denedim ( github.com/davidn/av ) ve işe yarıyor gibi görünüyor!
David

1

nmCihazları neden kapattığınızı öğrenmeye çalışabilirsiniz :

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

(Benim durumumda olduğu gibi (Fedora 20)), systemdsinyali tetiklerken, dbus yapılandırmasında dağıtımını reddedebilirsiniz:

---- /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>

Ne yazık ki, bu kurallar çok ince taneli değildir ve PrepareForSleepdiğer işlemler için de sinyali engelleyecektir .


0

Askıya almadan önce hizmeti kapatmayı deneyin ve devam ettikten sonra yeniden başlatın. Bunun gibi:

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


Ne demek istiyorsun? Ağ yöneticisi hizmetini durdurmalı mıyım? Bunun nasıl yardımcı olacağını anlamıyorum.
C-Otto

Stack Exchange'e hoş geldiniz! lütfen temel olarak tek bağlantılar olan cevaplar vermeyin. mümkünse, bağlandığınız malzemeyi yorumlamanız gerekir, aksi takdirde, atıfta bulunduğunuz sürece kopyalama ve yapıştırma iyidir. ve tekrar hoş geldiniz!
Strugee
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.