Odpowiedzi:
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ń?”
„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.
/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ń”.
$ 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.
/etc/rc.local. Zamiast tego użyj tego:/bin/sleep 10 && rfkill block wifi
/var/lib/NetworkManager/NetworkManager.stateplik, który zachowuje ustawienia, WirelessEnabled=falsejest jednym z nich.
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.
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.
/etc/default/grubpomocą preferowanego edytora tekstu.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.
tlp: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.
tlp-rdwnie działają zgodnie z oczekiwaniami.tlpużytkowników:tlp 0.9-1używania linrunner ppa.Oryginalna odpowiedź:
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 )
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
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.
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.
rfkill.