Risposte:
Esistono almeno due processi Upstart che influiscono sullo stato wireless predefinito:
/etc/init/rfkill-restore.conf
ripristina lo stato di blocco software per tutte le radio a quello che erano all'ultimo spegnimento, come registrato /var/lib/rfkill/saved-state
./etc/init/network-manager.conf
avvia Network Manager che a sua volta ripristina la sua idea di stato wireless da /var/lib/NetworkManager/NetworkManager.state
.Se osservi queste due configurazioni di lavoro, scoprirai che non hanno alcuna relazione temporale , il che mi sembra un difetto di progettazione. Immagino che questa condizione di gara sia raramente un problema perché /etc/init/rfkill-restore.conf
è molto più semplice e ha meno condizioni di partenza.
Tutte le soluzioni per applicare un valore predefinito di disattivazione wireless che ho visto tentano di utilizzare /etc/rc.local
, inclusa la soluzione "moderna" che @Lekensteyn e @ rubo77 hanno messo a punto. Sfortunatamente, quella soluzione non funziona per me su nessuno dei due laptop che ho provato. Questo non è particolarmente sorprendente, perché /etc/rc.local
anche non ha alcuna relazione temporale che posso trovare a uno di /etc/init/rfkill-restore.conf
e /etc/init/network-manager.conf
. Gettare un lungo sonno /etc/rc.local
prima di emettere rfkill block wifi
è una brutta soluzione per questo disordine delle condizioni di gara, ma funziona se il ritardo è abbastanza lungo.
Una soluzione migliore sarebbe quella di imporre i nostri stati desiderati dentro /var/lib/rfkill/saved-state
e /var/lib/NetworkManager/NetworkManager.state
prima ancora che questi due lavori Upstart possano essere eseguiti. Possiamo raggiungere questo obiettivo creando il nostro lavoro Upstart. In realtà, avremo bisogno di due file di configurazione del lavoro per ottenere i tempi di cui abbiamo bisogno.
La nostra prima configurazione del lavoro esegue le modifiche ai file effettive necessarie. Funzionerà il più presto possibile e funzionerà solo una volta. Crea /etc/init/radio-silence.conf
con questo contenuto:
# 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
Poiché preferisco il silenzio radio totale all'avvio del mio laptop, blocco soft tutte le radio, non solo wireless, ma è possibile modificare la prima sed
sopra per limitare l'impatto di questo lavoro su qualsiasi dispositivo wireless che si desidera bloccare.
La nostra seconda configurazione di lavoro è responsabile di garantire che nessuno dei lavori rfkill-restore
e network-manager
inizierà prima che radio-silence
le modifiche al file siano state completate. Crea /etc/init/radio-silence-wait.conf
come segue:
# 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
Con questa soluzione non vedo più problemi di condizioni di gara, anche se non ho affrontato la razza teorica tra rfkill-restore
e network-manager
.
Per maggiori dettagli su come questi lavori lavorano insieme per raggiungere il nostro obiettivo temporale, fare riferimento alla mia domanda e risposta, "Come posso creare un lavoro Upstart a esecuzione singola garantito per il completamento prima che inizino altri due lavori?"
Soluzione "moderna" utilizzando Network Manager: deseleziona l' opzione Wireless abilitato nell'applet Network Manager (KDE: Gestione della rete). Il comando nmcli nm wifi off
è equivalente. Continua a leggere se abiliti sporadicamente il Wi-Fi, ma desideri ripristinarlo disabilitato al riavvio.
Lo stato wireless è ricordato nel file /var/lib/NetworkManager/NetworkManager.state
. Per disabilitare il Wi-Fi all'avvio, assicurarsi che la chiave WirelessEnabled
rimanga in false
. Puoi farlo modificando lo script init di Network Manager o usando il /etc/rc.local
trucco di seguito. Il comando che ti serve è:
sed s/^WirelessEnabled=true/WirelessEnabled=false/ -i /var/lib/NetworkManager/NetworkManager.state
rfkill block wifi
Metti questo prima exit 0
(come descritto di seguito). Il rfkill block wifi
comando è ancora necessario a causa di una gara con l'avvio di Network Manager (NM). Una volta avviato NM, le modifiche al file di stato non hanno alcun effetto.
(vecchia risposta che comporta la modifica del file /etc/rc.local
con una spiegazione del rfkill
comando)
Un po 'confuso, ma dovrebbe funzionare. Una scheda wireless può essere disabilitata usando il rfkill
comando. Tutti i dispositivi utilizzati da rfkill possono essere visualizzati utilizzando rfkill list
. Uscita campione:
0: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no
Hard blocked
dipende da un'impostazione hardware, ad esempio uno switch wireless su un notebook. Soft blocked
può essere controllato dal sistema operativo (Ubuntu).
Come funziona? Non ha una manpage, in esecuzione rfkill
fornisce un testo di aiuto in questo caso:
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
Ah, ora arriviamo da qualche parte. È necessario eseguire rfkill block wifi
come root per disabilitare il dispositivo wireless. (wlan è un alias di wifi, vedi il codice sorgente di rfkill ).
Ora, se si desidera disabilitare le funzioni wireless all'avvio, aggiungere il comando a /etc/rc.local eseguendo sudo nano /etc/rc.local
. Utilizzare i tasti freccia / pagina su / giù per spostarsi sulla riga precedente exit 0
e aggiungere rfkill block wifi
, in modo che il file termini in questo modo:
# By default, this script does nothing
rfkill block wifi
exit 0
Al termine, premere Ctrl+ X, quindi premere Yper salvarlo e premere Enterper accettare il nome file.
Se si decide di attivare il dispositivo in seguito, eseguire: sudo rfkill unblock wifi
. Non dimenticare di rimuovere la linea da /etc/rc.local se decidi di usare la scheda wireless.
/etc/rc.local
poiché lo script viene eseguito con i permessi di root. È molto improbabile che tu possa disabilitare il wifi senza permessi di root. Se provo rfkill block wifi
o rfkill unblock wifi
, ottengo "Impossibile aprire il dispositivo di controllo RFKILL: autorizzazione negata".
$ rfkill block wifi
fa sì che l'applet NetworkManager visualizzi "Wireless disabilitato" e $ iwconfig
visualizzi Tx-Power=off
. $ rfkill unblock wifi
annulla questo effetto.
/etc/rc.local
. Usa questo invece:/bin/sleep 10 && rfkill block wifi
/var/lib/NetworkManager/NetworkManager.state
file che persiste le impostazioni, WirelessEnabled=false
è uno di quelli.
Il modo più semplice per disabilitare la scheda wireless è fare clic con il pulsante destro del mouse sull'indicatore NetworkManager (piccola icona in alto a destra sul pannello) e deselezionare l'opzione Enable Wireless
. Questo porta giù ( ifconfig wlan0 down
) l'interfaccia e non esegue più la scansione.
tlp
, leggi l'intera risposta.Tutte le risposte a questa domanda sono piuttosto vecchie ora e non funzionano con le versioni più recenti di Ubuntu che usano systemd. La risposta di froage ha funzionato per me il 14.04 ma non funziona il 16.04.
Systemd utilizza systemd-rfkill.service
per salvare lo stato dell'interruttore rfkill durante l'arresto e ripristinarlo ad ogni avvio.
Devi passare un parametro della riga di comando del kernel per ripristinare lo stato dello switch rfkill ad ogni avvio.
/etc/default/grub
con il tuo editor di testo preferito.systemd.restore_state=1
come parametro a GRUB_CMDLINE_LINUX
. Quella riga dovrebbe ora leggere GRUB_CMDLINE_LINUX="systemd.restore_state=1"
. Puoi anche aggiungerlo a GRUB_CMDLINE_LINUX_DEFAULT
. Entrambi funzionano. Vedi questa domanda per maggiori dettagli.Questo assicurerà che lo stato di rfkill venga ripristinato ad ogni avvio. Assicurati di disattivare il bluetooth e il wifi prima di riavviare.
tlp
:tlp 0.8-1
disponibili nei repository 16.04. Dopo l'aggiornamento tlp 0.9-1
all'utilizzo di linrunner ppa, TUTTE le edizioni sono state risolte.Risposta originale:
tlp
maschera / disabilita systemd-rfkill.service
per "evitare conflitti e assicurare il corretto funzionamento delle opzioni di commutazione dei dispositivi radio TLP" . ( Fonte-1 , Fonte-2 )
Questo significa che passare il parametro del kernel non funzionerà per te.
Ecco un piccolo frammento (intorno alla riga 195) dal file di configurazione predefinito di 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"
Come puoi vedere, l'opzione RESTORE_DEVICE_STATE_ON_STARTUP
è disabilitata per impostazione predefinita. Abilitare questa opzione non aiuta.
Anche dopo aver abilitato l'opzione per RESTORE_DEVICE_STATE_ON_STARTUP
disabilitare wifi e bluetooth (usando rfkill block all
) e continuare a riavviare, in qualche modo WiFi viene abilitato ad ogni 2 ° o 3 ° avvio. Non è garantito che al prossimo avvio il WiFi sarà disabilitato. Sorprendentemente
tlp
riesce a mantenere il bluetooth disabilitato ad ogni avvio.
Lo stesso vale per la seconda opzione nello snippet, DEVICES_TO_DISABLE_ON_STARTUP
anch'essa disabilitata per impostazione predefinita. Abilitarlo non funziona neanche. Network Manger
mostra che il WiFi è disabilitato ma rfkill list
non mostra alcun soft-block sul WiFi.
Nota: ho letto la riga
"Hint: the parameters DEVICES_TO_DISABLE/ENABLE_ON_STARTUP/SHUTDOWN below are ignored when this is enabled!"
.Ho disabilitato
RESTORE_DEVICE_STATE_ON_STARTUP
prima di abilitareDEVICES_TO_DISABLE_ON_STARTUP
per evitare conflitti.
tlp-rdw
non funzionano come previsto.tlp
utenti:tlp 0.9-1
all'utilizzo di linrunner ppa.Risposta originale:
Abilitare DEVICES_TO_DISABLE_ON_STARTUP
e impostare per disabilitare Bluetooth e WiFi potrebbe funzionare per te. ( Ha funzionato per questa persona )
Questa domanda qui su askubuntu. È simile a una risposta precedente a questa domanda. Ma tieni presente che non l'ho provato da solo. Potrebbe funzionare oppure no.
Altre fonti: systemd-rfkill , tlp-configuration
GRUB_CMDLINE_LINUX
e GRUB_CMDLINE_LINUX_DEFAULT
più il sudo update-grub
comando (non menzionato) e non sono riuscito a farlo funzionare in Pop_OS! 19.10 (basato su Ubuntu 19.10). Secondo systemctl status systemd-rfkill
questo servizio è già in esecuzione ad ogni avvio e, dato che il valore predefinito è 1
, non dovrebbe essere necessario questo sforzo. Sulla base delle informazioni all'indirizzo man systemd-rfkill
, ricordare lo stato radio "all'avvio anticipato" dovrebbe essere il comportamento predefinito, il che mi porta a credere che questo componente sia in qualche modo rotto.
Potresti aggiungere
ifconfig wlan0 down
a /etc/rc.local
, ma prima,
assicurati che, se stai usando NetworkManager (ho la versione 0.8.4 ~ git.20110319t175609.d14809b-0ubuntu3), vai al menu " Modifica connessioni " -> scheda " Wireless ", fai clic sulla connessione, fai clic su " Modifica " e assicurati che, nella scheda " Wireless ", la casella di controllo " Connetti automaticamente " NON sia selezionata.
rfkill
.