Jak mogę domyślnie wyłączyć radio karty bezprzewodowej?

11

Bezprzewodowa karta PCI mojego pulpitu zawsze skanuje w poszukiwaniu dostępnych sieci bezprzewodowych, ale rzadko z niej korzystam. Czy mogę wyłączyć radio, dopóki go nie potrzebuję?

ændrük
źródło

Odpowiedzi:

4

Istnieją co najmniej dwa zadania Upstart, które wpływają na domyślny stan sieci bezprzewodowej:

  • /etc/init/rfkill-restore.confprzywraca stan miękkiego blokowania dla wszystkich radiotelefonów do tego, w którym zostały one ostatnio zamknięte, jak zapisano w /var/lib/rfkill/saved-state.
  • /etc/init/network-manager.confuruchamia Network Managera, który z kolei przywraca ideę stanu sieci bezprzewodowej /var/lib/NetworkManager/NetworkManager.state.

Jeśli spojrzysz na te dwie konfiguracje zadań, zauważysz, że nie mają one żadnego związku czasowego , co wydaje mi się wadą projektową. Zgaduję, że ten stan wyścigu rzadko stanowi problem, ponieważ /etc/init/rfkill-restore.confjest znacznie prostszy i ma mniej warunków startowych.

Próbowałem użyć wszystkich rozwiązań służących do wymuszenia domyślnego wyłączenia sieci /etc/rc.local, w tym „nowoczesnego” rozwiązania, które wymyślili @Lekensteyn i @ rubo77. Niestety to rozwiązanie nie działa na żadnym z dwóch laptopów, których wypróbowałem. Nie jest to szczególnie zaskakujące, ponieważ /etc/rc.local również ma żadnego czasową zależność , że mogę znaleźć jednego z /etc/init/rfkill-restore.confi /etc/init/network-manager.conf. Wrzucanie długiego snu /etc/rc.localprzed wydaniem rfkill block wifijest brzydkim obejściem tego bałaganu w wyścigu, ale działa, jeśli opóźnienie jest wystarczająco długie.

Lepszym rozwiązaniem byłoby nam narzucać nasze stany w pożądanych /var/lib/rfkill/saved-statei /var/lib/NetworkManager/NetworkManager.state zanim te dwa zadania dorobkiewicz są jeszcze dopuszczone do ruchu. Możemy to osiągnąć, tworząc własną pracę Upstart. W rzeczywistości będziemy potrzebować dwóch plików konfiguracji zadania, aby osiągnąć potrzebny czas.

Nasza pierwsza konfiguracja zadania wykonuje potrzebne modyfikacje plików. Będzie działał jak najwcześniej i będzie działał tylko raz. Utwórz za /etc/init/radio-silence.confpomocą tej zawartości:

# radio-silence - Ensure radio silence on startup
#
# Override default startup behaviour of radios to ensure they are all
# disabled until the user deliberately enables them. This job requires
# radio-silence-wait to delay start of any services that may depend on
# resources manipulated by this job.

description "Disable all radios by default"

start on local-filesystems

pre-start script
  sed -i -re "s/^(.+[[:space:]]+)[01][[:space:]]*\$/\11/" /var/lib/rfkill/saved-state
  sed -i -re "s/^(WirelessEnabled=).*\$/\1false/" /var/lib/NetworkManager/NetworkManager.state
end script

Ponieważ wolę całkowitą ciszę radiową po uruchomieniu laptopa, miękko blokuję wszystkie radia, nie tylko bezprzewodowe, ale możesz zmodyfikować pierwszy sedz powyższych, aby ograniczyć wpływ tego zadania na dowolne urządzenia bezprzewodowe, które chcesz miękko zablokować.

Nasza druga konfiguracja zadania jest odpowiedzialna za zapewnienie, że żadne z zadań rfkill-restorei network-managernie uruchomi się przed radio-silencezakończeniem modyfikacji pliku. Utwórz /etc/init/radio-silence-wait.confw następujący sposób:

# radio-silence-wait - Helper task for radio-silence
#
# Delays the start of all jobs that may depend on resources manipulated
# by radio-silence job. Avoids the need to modify job configuration of
# those other jobs.

description "Assist radio-silence by delaying jobs it affects"

start on (starting rfkill-restore or starting network-manager)
stop on (started radio-silence or stopped radio-silence)

instance $JOB
normal exit 0 2
task

script
  status radio-silence | grep -q "start/running" && exit 0
  start radio-silence || true
  sleep infinity
end script

Dzięki temu rozwiązaniu nie widzę już problemów z warunkami wyścigu, chociaż nie zająłem się teoretycznym wyścigiem pomiędzy rfkill-restorei network-manager.

Aby uzyskać więcej informacji na temat tego, jak te zadania współpracują ze sobą, aby osiągnąć nasz cel doczesny, zapoznaj się z moim pytaniem i odpowiedzią: „Jak utworzyć zadanie Upstart pojedynczego wykonania z gwarancją ukończenia przed rozpoczęciem dwóch innych zadań?”

froage
źródło
7

„Nowoczesne” rozwiązanie za pomocą Network Managera: po prostu odznacz opcję Wireless Enabled w aplecie Network Managera (KDE: Network Management). Polecenie nmcli nm wifi offjest równoważne. Kontynuuj czytanie, jeśli sporadycznie włączasz Wi-Fi, ale chcesz przywrócić go do wyłączonego podczas ponownego uruchamiania.

Stan połączenia bezprzewodowego jest zapamiętywany w pliku /var/lib/NetworkManager/NetworkManager.state. Aby wyłączyć Wi-Fi podczas uruchamiania, upewnij się, że klucz WirelessEnabledpozostaje w pozycji false. Możesz to zrobić, edytując skrypt startowy Menedżera sieci lub korzystając z /etc/rc.localponiższej sztuczki. Potrzebne polecenie to:

sed s/^WirelessEnabled=true/WirelessEnabled=false/ -i /var/lib/NetworkManager/NetworkManager.state
rfkill block wifi

Umieść to wcześniej exit 0(jak opisano poniżej). rfkill block wifiKomenda jest nadal potrzebne ze względu na rasę z uruchomieniem Network Manager (NM). Po uruchomieniu NM zmiany w pliku stanu nie mają wpływu.


(stara odpowiedź, która obejmuje edycję pliku /etc/rc.localz wyjaśnieniem rfkillpolecenia)

Trochę zuchwały, ale powinien działać. Kartę bezprzewodową można wyłączyć za pomocą rfkillpolecenia. Wszystkie urządzenia używane przez rfkill mogą być wyświetlane za pomocą rfkill list. Przykładowe dane wyjściowe:

0: phy0: Wireless LAN
        Soft blocked: no
        Hard blocked: no

Hard blockedzależy od ustawień sprzętowych, np. przełącznika bezprzewodowego w notebooku. Soft blockedmoże być kontrolowany przez system operacyjny (Ubuntu).

Jak to działa? Nie ma strony podręcznej, uruchomienie rfkillzapewnia tekst pomocy w tym przypadku:

Usage:  rfkill [options] command
Options:
        --version       show version (0.4)
Commands:
        help
        event
        list [IDENTIFIER]
        block IDENTIFIER
        unblock IDENTIFIER
where IDENTIFIER is the index no. of an rfkill switch or one of:
        <idx> all wifi wlan bluetooth uwb ultrawideband wimax wwan gps fm

Ach, teraz gdzieś się znajdujemy. Musisz uruchomić rfkill block wifijako root, aby wyłączyć urządzenie bezprzewodowe. (WLAN jest alias WiFi, patrz kod źródłowy z rfkill ).

Teraz, jeśli chcesz wyłączyć funkcje bezprzewodowe w czasie postoju, dodaj polecenie do /etc/rc.local, uruchamiając sudo nano /etc/rc.local. Użyj klawiszy strzałek / klawiszy stron w górę / w dół, aby przejść do wiersza przed exit 0i dodać rfkill block wifi, aby plik kończył się w następujący sposób:

# By default, this script does nothing

rfkill block wifi
exit 0

Po zakończeniu naciśnij Ctrl+ X, następnie naciśnij, Yaby zapisać i naciśnij, Enteraby zaakceptować nazwę pliku.

Jeśli zdecydujesz się aktywować urządzenie później, uruchom: sudo rfkill unblock wifi. Nie zapomnij usunąć linii z /etc/rc.local, jeśli zdecydujesz się na użycie karty bezprzewodowej.

Lekensteyn
źródło
Dzięki. Nie rozumiem dlaczego, ale wygląda na to, że nie muszę używać sudo, aby rfkill działał.
ændrük
1
Nie potrzebujesz sudo, /etc/rc.localponieważ skrypt jest uruchamiany z uprawnieniami administratora. Jest bardzo mało prawdopodobne, abyś mógł wyłączyć Wi-Fi bez uprawnień roota. Jeśli spróbuję rfkill block wifilub pojawi rfkill unblock wifisię komunikat „Nie można otworzyć urządzenia sterującego RFKILL: Odmowa uprawnień”.
Lekensteyn
Zarówno na moim ThinkPad X60, jak i na pulpicie z kartą bezprzewodową PCI, uruchomienie $ rfkill block wifipowoduje, że aplet NetworkManager wyświetla komunikat „Sieć bezprzewodowa jest wyłączona” i $ iwconfigwyświetla się Tx-Power=off. $ rfkill unblock wificofa ten efekt.
ændrük
1
Rozwiązałem to z opóźnieniem: Wygląda na to, że w Ubuntu 14.04 musisz odczekać kilka sekund, zanim wyłączysz Wi-Fi /etc/rc.local. Zamiast tego użyj tego:/bin/sleep 10 && rfkill block wifi
rubo77
1
@ rubo77 Tutaj (Arch Linux, Network Manager 0.9.8.10-3) istnieje /var/lib/NetworkManager/NetworkManager.stateplik, który zachowuje ustawienia, WirelessEnabled=falsejest jednym z nich.
Odpowiem
1

Najłatwiejszym sposobem wyłączenia karty sieci bezprzewodowej jest kliknięcie prawym przyciskiem myszy wskaźnika NetworkManager (mała ikona w prawym górnym rogu panelu) i odznaczenie Enable Wireless. Sprowadza ifconfig wlan0 downto interfejs ( ) i nie wykonuje już skanowania.

użytkownik4124
źródło
2
Zaznaczenie tego elementu menu nie wpływa na zachowanie domyślne. Przy następnym włączeniu komputera radio bezprzewodowe jest ponownie aktywne.
ændrük
1
W moim Ubuntu 14.04 pozostaje wyłączony po ponownym uruchomieniu, jeśli wyłączę go w aplecie menedżera sieci
rubo77
1

Uwaga: Jeśli używasz tlp, przeczytaj całą odpowiedź.

Wszystkie odpowiedzi na to pytanie są teraz dość stare i nie działają na nowszych wersjach Ubuntu, które używają systemd. odpowiedź froage zadziałała dla mnie 14.04, ale nie działa 16.04.

Systemd używa systemd-rfkill.servicedo zapisywania stanu przełącznika rfkill podczas zamykania i przywracania go przy każdym uruchomieniu.

Musisz przekazać parametr wiersza poleceń jądra, aby przywrócić stan przełącznika rfkill przy każdym uruchomieniu.

  1. otwórz za /etc/default/grubpomocą preferowanego edytora tekstu.
  2. dodaj systemd.restore_state=1jako parametr do GRUB_CMDLINE_LINUX. Ta linia powinna teraz brzmieć GRUB_CMDLINE_LINUX="systemd.restore_state=1". Możesz to również dodać GRUB_CMDLINE_LINUX_DEFAULT. Każda z nich działa. Zobacz to pytanie, aby uzyskać więcej informacji.

Zapewni to przywrócenie stanu rfkill przy każdym uruchomieniu. Przed ponownym uruchomieniem wyłącz Bluetooth i Wi-Fi.


Problemy z tlp:

Aktualizacja: te problemy występowały w tlp 0.8-1repozytoriach 16.04. Po aktualizacji do tlp 0.9-1korzystania z linrunner ppa WSZYSTKIE problemy zostały rozwiązane.

Oryginalna odpowiedź:

tlpmaskuje / wyłącza, systemd-rfkill.serviceaby „uniknąć konfliktów i zapewnić prawidłowe działanie opcji przełączania urządzeń radiowych TLP” . ( Źródło-1 , Źródło-2 )

Oznacza to, że przekazanie parametru jądra nie będzie dla ciebie działać.

Oto mały fragment (wokół linii nr 195) z domyślnego pliku konfiguracyjnego tlp ( /etc/default/tlp).

# Restore radio device state (Bluetooth, WiFi, WWAN) from previous shutdown
# on system startup: 0=disable, 1=enable.
# Hint: the parameters DEVICES_TO_DISABLE/ENABLE_ON_STARTUP/SHUTDOWN below
#   are ignored when this is enabled!
RESTORE_DEVICE_STATE_ON_STARTUP=0

# Radio devices to disable on startup: bluetooth, wifi, wwan.
# Separate multiple devices with spaces.
#DEVICES_TO_DISABLE_ON_STARTUP="bluetooth wifi wwan"

# Radio devices to enable on startup: bluetooth, wifi, wwan.
# Separate multiple devices with spaces.
#DEVICES_TO_ENABLE_ON_STARTUP="wifi"
  • Jak widać opcja RESTORE_DEVICE_STATE_ON_STARTUPjest domyślnie wyłączona. Ale włączenie tej opcji nie pomaga.

    Nawet po włączeniu opcji RESTORE_DEVICE_STATE_ON_STARTUP wyłączenia Wi-Fi i Bluetooth (za pomocą rfkill block all) i ponownym uruchomieniu, w jakiś sposób WiFi włącza się przy każdym drugim lub trzecim rozruchu. Nie ma gwarancji, że przy następnym uruchomieniu WiFi zostanie wyłączone. Zaskakująco tlpudaje się utrzymać bluetooth wyłączone przy każdym uruchomieniu.

  • To samo dotyczy drugiej opcji we fragmencie DEVICES_TO_DISABLE_ON_STARTUP, która również jest domyślnie wyłączona. Włączenie tego też nie działa. Network Mangerpokazuje, że Wi-Fi jest wyłączone, ale rfkill listnie pokazuje żadnych bloków programowych w Wi-Fi.

    Uwaga: przeczytałem wiersz "Hint: the parameters DEVICES_TO_DISABLE/ENABLE_ON_STARTUP/SHUTDOWN below are ignored when this is enabled!".

    Wyłączyłem RESTORE_DEVICE_STATE_ON_STARTUPprzed włączeniem, DEVICES_TO_DISABLE_ON_STARTUPaby uniknąć konfliktów.

  • Podobnie inne dostarczone opcje tlp-rdwnie działają zgodnie z oczekiwaniami.


Rozwiązanie dla tlpużytkowników:

Aktualizacja: Zaktualizuj do tlp 0.9-1używania linrunner ppa.

Oryginalna odpowiedź:

  1. Włączenie DEVICES_TO_DISABLE_ON_STARTUPi ustawienie wyłączenia Bluetooth i Wi-Fi może działać dla Ciebie ( działało dla tej osoby )

  2. To pytanie tutaj na askubuntu. Jest podobny do starszej odpowiedzi na to pytanie. Pamiętaj jednak, że sam tego nie próbowałem. To może, ale nie musi działać.


Inne źródła: systemd-rfkill , konfiguracja TLP


Manoj
źródło
Wypróbowałem twoją odpowiedź obejmującą modyfikacje obu GRUB_CMDLINE_LINUXoraz GRUB_CMDLINE_LINUX_DEFAULTplus (niewymienione) sudo update-grubpolecenie i nie mogłem zmusić go do działania w Pop_OS! 19.10 (oparty na Ubuntu 19.10). Zgodnie z systemctl status systemd-rfkilltym, usługa ta jest już uruchamiana przy każdym rozruchu, a ponieważ wartością domyślną jest 1, wysiłek ten nie powinien być potrzebny. Opierając się na informacjach z man systemd-rfkill, zapamiętywanie stanu radia „przy wczesnym rozruchu” powinno być zachowaniem domyślnym, co prowadzi mnie do przekonania, że ​​ten komponent jest w jakiś sposób uszkodzony.
Patrick Dark
0

Osobiście używam Jupitera do zarządzania energią, aby wyłączyć sieć bezprzewodową na moim laptopie, ponieważ jest ona kontrolowana przez specjalny przycisk. Nie sądzę, że w głównym repozytorium musiałem dodać ppa od Andrew z Webupd8, aby go zdobyć.

Mam nadzieję że to pomoże.

Allan
źródło
0

Możesz dodać

ifconfig wlan0 down

do /etc/rc.local, ale po pierwsze,

upewnij się, że jeśli korzystasz z NetworkManager (mam wersję 0.8.4 ~ git.20110319t175609.d14809b-0ubuntu3), przejdź do menu „ Edytuj połączenia ” -> karta „ Bezprzewodowe ”, kliknij połączenie, kliknij „ Edytuj ” i upewnij się, że na karcie „ Bezprzewodowe ” pole wyboru „ Połącz automatycznie ” NIE jest zaznaczone.

waltinator
źródło
1
Chociaż to obniży interfejs, nie oszczędza tyle energii, co wyłączenie radia za pomocą rfkill.
gertvdijk