NetworkManager: mạng bị vô hiệu hóa khi gửi hệ thống đi ngủ


11

Khi tôi tạm ngưng máy tính xách tay của mình, hãy NetworkManagertắt mạng không dây (trong nm-manager.c:do_sleep_wake).

Tuy nhiên, tôi vẫn muốn sử dụng mạng trong một thời gian rất ngắn (để ngắt cifskết nối , điều đó làm cho hệ thống của tôi không thể sử dụng được khi tiếp tục lại).

Làm thế nào tôi có thể làm cho NetworkManager không vô hiệu hóa mạng của tôi? Có thể đợi một vài giây (hoặc cho đến khi một cái gì đó được kích hoạt; hoặc một khóa được phát hành)?

Liên quan: pm-utils: Không có mạng trong các tập lệnh treo?

nhật ký gỡ lỗi:

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: Để làm cho nó rõ ràng, có các tập lệnh trong /etc/pm/sleep.dkhông giúp ích vì mạng đã bị vô hiệu hóa ngay khi tập lệnh được thực thi.


Hãy xem các tùy chọn quản lý năng lượng và tìm kiếm thứ gì đó có tác dụng "vô hiệu hóa mạng khi máy tính bị treo"
Joseph R.

Không có những điều như vậy. Tôi đang sử dụng xmonad với Gnome 3.
C-Otto

ý bạn là bạn đang thay thế Gnome Shell bằng xmonad, nhưng không thay đổi gì khác? nếu vậy, các tùy chọn nguồn nằm trong ngăn "Nguồn" của gnome-control-center.
strugee

Tôi biết. Không có những điều như bạn nói.
C-Otto

Q bạn đang yêu cầu là một chút của một vấn đề XY , Câu trả lời tôi cung cấp cho bạn năm ngoái, unix.stackexchange.com/questions/62157/... , wrt tạo móc công việc tùy chỉnh gắn với quản lý điện năng suspend / resume là cách để đi đến đây Cố gắng đẩy mạng lên lâu hơn một chút không phải là cách đúng đắn để tiếp cận vấn đề này.
slm

Câu trả lời:


4

Tôi không biết nó có chuẩn không, nhưng trong Ubuntu có tập lệnh được chạy trước khi tạm dừng / sau khi tiếp tục vào /etc/pm/sleep.dvà vào /usr/lib/pm-utils/sleep.d. Trong hệ thống của tôi dường như mạng bị tắt /usr/lib/pm-utils/sleep.d/60_wpa_supplicant.

Bạn có thể viết một kịch bản ví dụ /etc/pm/sleep.d/10-umountđể ngắt kết nối cổ phiếu của bạn trước khi tạm dừng. Cấu trúc của các kịch bản này là như thế:

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

Lưu ý rằng nếu tập lệnh trả về một lỗi chung thì việc tạm dừng bị hủy bỏ, vì vậy hãy cẩn thận với điều này (đặc biệt là bạn, như tôi, sử dụng để đóng nắp và cất laptop đi ...). Để kịch bản những điều phức tạp hơn, cảm ơn Samuel Peter cho nhận xét của mình:

bạn có thể trả về lỗi mà không hủy bỏ tạm ngưng bằng cách trả về một trong các giá trị đặc biệt được xác định trong /usr/lib/pm-utils/pm-functions: $NA là "không áp dụng", $DXlà "bị vô hiệu hóa" và $NX"không thể thực thi". Xem hook_exit_statuschức năng trong tập lệnh pm-tests

Bạn thậm chí có thể kể lại chúng sau khi tiếp tục tự động; từ đây tôi thấy rằng:

Nếu bạn muốn làm một cái gì đó cụ thể cho thiết lập của bạn trong thời gian tạm dừng hoặc ngủ đông, thì bạn có thể dễ dàng đặt móc của riêng mình vào /etc/pm/s ngủ.d. Các hook trong thư mục này sẽ được gọi theo thứ tự chữ cái trong khi tạm ngưng (đó là lý do tên của chúng bắt đầu bằng 2 chữ số, để làm cho thứ tự rõ ràng) và theo thứ tự ngược lại trong quá trình tiếp tục.

Vì vậy, đưa vào cùng một kịch bản umountmount commandnên hoạt động (tạm dừng nó được thực thi trước khi tắt mạng và tiếp tục sau đó).

Các liên kết trong câu hỏi của bạn là tiết lộ; Theo cách hiểu của tôi, nếu NetworkManager tắt mạng trước khi các kịch bản ở cấp 00-50 được chạy thì đó là một lỗi --- ít nhất là nếu kết nối được đánh dấu là kết nối hệ thống (trong Cài đặt mạng -> Tùy chọn -> Nhận dạng - > Cung cấp cho người dùng khác).


+1 pm-utilsnên có sẵn trên tất cả các phân phối chính và có thể được cài đặt theo mặc định.
goldilocks

1
Lưu ý rằng bạn có thể trả về lỗi mà không hủy bỏ tạm ngưng bằng cách trả về một trong các giá trị đặc biệt được xác định trong / usr / lib / pm-utils / pm-Hàm: $NAlà "không áp dụng", $DX"bị vô hiệu hóa" và $NX"không thể thực thi" . Xem hook_exit_statuschức năng trong tập lệnh chức năng pm
Samuel Peter

LƯU Ý: Câu trả lời này được cung cấp thêm cho OP trên Q này: unix.stackexchange.com/questions/62157/ nam Tôi nghĩ rằng anh ta đang tìm kiếm thứ gì đó không tồn tại.
slm

Như tôi đã nói trong câu hỏi được tham chiếu, tôi không có bất kỳ mạng nào trong các tập lệnh (tức là 10-umount). Ngay khi bất kỳ tập lệnh nào thực thi, mạng đã ngừng hoạt động.
C-Otto

1
Tôi sẽ điều tra system connectiontài sản. EDIT: Nó đã là một system connection.
C-Otto

3

Dựa trên những gì @ensc đã nói, thay vào đó bạn có thể lắng nghe tín hiệu D-Bus (phiên hệ thống) đó. Quy trình làm việc chung với org.freedesktop.login1.Managergiao diện sẽ là:

  1. ức chế giấc ngủ hệ thống (cũng có thể tắt máy) với Inhibit(what, who, why, mode)
    • what: sleephoặcshutdown:sleep
    • who: unmount_cifshoặc bất cứ điều gì bạn sẽ gọi kịch bản của bạn
    • why: unmounting cifs X before suspend ...hoặc tương đương
    • mode: delayđể ức chế tối đa. trong 5 giây (mặc định) hoặc blockchặn vô thời hạn (tôi sẽ đề xuất đầu tiên. Nếu tập lệnh của bạn bị trì hoãn, sổ ghi chép của bạn sẽ không bao giờ đi ngủ.)
    • cái này trả về một bộ mô tả tập tin 'giữ' khóa
  2. bây giờ bạn lắng nghe tín hiệu
    • PrepareForSleep, sẽ trả về Truekhi sắp tạm dừng hoặc ngủ đông và Falsekhi tiếp tục và tan băng)
    • PrepareForShutdown, sẽ trả về Truekhi sắp tắt máy và sẽ quay lại Falsekhi bật lại (thay vào đó, nó cũng trả về Falsecùng lúc nó trả về True, điều này không có ý nghĩa gì với tôi, vì vậy tôi sẽ bỏ qua Falsephần này ở đây; có lẽ bạn đã có một loại kịch bản tự động hóa trên hệ thống bắt đầu bằng mọi cách, phải không?)
  3. ngay khi bạn xử lý xong Truetín hiệu (tức là ngắt kết nối), bạn giải phóng khóa bằng cách đóng bộ mô tả tệp (được trả về Inhibit(...)), để máy có thể chuyển sang chế độ ngủ hoặc tắt máy nhanh nhất có thể mà không cần chờ cả 5s ( hoặc thậm chí vô thời hạn khi ở blockchế độ)
  4. bạn có thể xử lý Falsetín hiệu (tiếp tục / tan băng) bằng cách lặp lại (có thể trước tiên đợi mạng hoạt động trở lại) và sau đó tạo một khóa mới với Inhibit(...)(cho lần ngủ tiếp theo hoặc tắt máy)

Trong Python (2.7), điều này có thể trông giống như:

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

Trong Gist này, bạn sẽ tìm thấy trình bao bọc của tôi xung quanh Pidgin để ngắt kết nối tài khoản IM khi ngủ và tắt máy, sử dụng chính xác cùng một phương pháp.

Xem thêm tài liệu freedesktop chính thức về Khóa ức chếlogindAPI D-Bus .


Tôi đang xem xét làm một cái gì đó tương tự (đối với unix.stackexchange.com/q/337853 ). Điều này nghe có vẻ hứa hẹn, nhưng chắc chắn nó đang chạy đua với NetworkManager đang làm điều tương tự? Điều gì xảy ra nếu tập lệnh phụ thuộc vào mạng của tôi mất nhiều thời gian hơn so với NetworkManager để dừng mạng?
David

Đã thử nó ( github.com/davidn/av ) và nó dường như hoạt động!
David

1

Bạn có thể thử tìm hiểu tại sao nmtắt thiết bị:

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

Khi (như trong trường hợp của tôi (Fedora 20)), systemdđang kích hoạt tín hiệu, bạn có thể từ chối phân phối của nó trong cấu hình 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>

Thật không may, các quy tắc này không được xử lý tốt và nó cũng sẽ chặn PrepareForSleeptín hiệu cho các quá trình khác.


0

Cố gắng tắt dịch vụ trước khi tạm dừng và bắt đầu lại sau khi tiếp tục. Như thế

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


Ý anh là gì? Tôi có nên dừng dịch vụ quản lý mạng? Tôi không hiểu làm thế nào sẽ giúp.
C-Otto

Chào mừng đến với Stack Exchange! xin vui lòng không đưa ra câu trả lời về cơ bản là các liên kết đơn. nếu có thể, bạn nên diễn giải các tài liệu bạn liên kết đến, nếu không, sao chép và dán là tốt miễn là bạn quy nó. và một lần nữa, chào mừng!
strugee
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.