Odpowiedzi:
Istnieją co najmniej dwa zadania Upstart, które wpływają na domyślny stan sieci bezprzewodowej:
/etc/init/rfkill-restore.conf
przywraca 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.conf
uruchamia 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.conf
jest 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.conf
i /etc/init/network-manager.conf
. Wrzucanie długiego snu /etc/rc.local
przed wydaniem rfkill block wifi
jest 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-state
i /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.conf
pomocą 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 sed
z 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-restore
i network-manager
nie uruchomi się przed radio-silence
zakończeniem modyfikacji pliku. Utwórz /etc/init/radio-silence-wait.conf
w 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-restore
i 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 off
jest 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 WirelessEnabled
pozostaje w pozycji false
. Możesz to zrobić, edytując skrypt startowy Menedżera sieci lub korzystając z /etc/rc.local
poniż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 wifi
Komenda 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.local
z wyjaśnieniem rfkill
polecenia)
Trochę zuchwały, ale powinien działać. Kartę bezprzewodową można wyłączyć za pomocą rfkill
polecenia. 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 blocked
zależy od ustawień sprzętowych, np. przełącznika bezprzewodowego w notebooku. Soft blocked
może być kontrolowany przez system operacyjny (Ubuntu).
Jak to działa? Nie ma strony podręcznej, uruchomienie rfkill
zapewnia 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 wifi
jako 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 0
i 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.local
ponieważ 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 wifi
lub pojawi rfkill unblock wifi
się komunikat „Nie można otworzyć urządzenia sterującego RFKILL: Odmowa uprawnień”.
$ rfkill block wifi
powoduje, że aplet NetworkManager wyświetla komunikat „Sieć bezprzewodowa jest wyłączona” i $ iwconfig
wyświetla się Tx-Power=off
. $ rfkill unblock wifi
cofa ten efekt.
/etc/rc.local
. Zamiast tego użyj tego:/bin/sleep 10 && rfkill block wifi
/var/lib/NetworkManager/NetworkManager.state
plik, który zachowuje ustawienia, WirelessEnabled=false
jest 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 down
to 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.service
do 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/grub
pomocą preferowanego edytora tekstu.systemd.restore_state=1
jako 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-1
repozytoriach 16.04. Po aktualizacji do tlp 0.9-1
korzystania z linrunner ppa WSZYSTKIE problemy zostały rozwiązane.Oryginalna odpowiedź:
tlp
maskuje / wyłącza, systemd-rfkill.service
aby „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_STARTUP
jest 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
tlp
udaje 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 Manger
pokazuje, że Wi-Fi jest wyłączone, ale rfkill list
nie 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_STARTUP
przed włączeniem,DEVICES_TO_DISABLE_ON_STARTUP
aby uniknąć konfliktów.
tlp-rdw
nie działają zgodnie z oczekiwaniami.tlp
użytkowników:tlp 0.9-1
używania linrunner ppa.Oryginalna odpowiedź:
Włączenie DEVICES_TO_DISABLE_ON_STARTUP
i 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_LINUX
oraz GRUB_CMDLINE_LINUX_DEFAULT
plus (niewymienione) sudo update-grub
polecenie i nie mogłem zmusić go do działania w Pop_OS! 19.10 (oparty na Ubuntu 19.10). Zgodnie z systemctl status systemd-rfkill
tym, 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
.