Come posso mantenere la radio di una scheda wireless spenta per impostazione predefinita?


11

La scheda wireless PCI del mio desktop è sempre alla ricerca di reti wireless disponibili, ma la uso solo raramente. Posso tenere la radio spenta fino a quando non ne ho bisogno?

Risposte:


4

Esistono almeno due processi Upstart che influiscono sullo stato wireless predefinito:

  • /etc/init/rfkill-restore.confripristina 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.confavvia 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.confe /etc/init/network-manager.conf. Gettare un lungo sonno /etc/rc.localprima 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-statee /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.confcon 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 sedsopra 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-restoree network-managerinizierà prima che radio-silencele modifiche al file siano state completate. Crea /etc/init/radio-silence-wait.confcome 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-restoree 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?"


7

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 WirelessEnabledrimanga in false. Puoi farlo modificando lo script init di Network Manager o usando il /etc/rc.localtrucco 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 wificomando è 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.localcon una spiegazione del rfkillcomando)

Un po 'confuso, ma dovrebbe funzionare. Una scheda wireless può essere disabilitata usando il rfkillcomando. 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 blockeddipende da un'impostazione hardware, ad esempio uno switch wireless su un notebook. Soft blockedpuò essere controllato dal sistema operativo (Ubuntu).

Come funziona? Non ha una manpage, in esecuzione rfkillfornisce 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 wificome 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 0e 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.


Grazie. Non capisco perché, ma sembra che non abbia bisogno di usare sudo perché rfkill funzioni.
ændrük,

1
Non è necessario sudo in /etc/rc.localpoiché 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 wifio rfkill unblock wifi, ottengo "Impossibile aprire il dispositivo di controllo RFKILL: autorizzazione negata".
Lekensteyn,

Sia sul mio ThinkPad X60 che sul mio desktop con una scheda wireless PCI, l'esecuzione $ rfkill block wififa sì che l'applet NetworkManager visualizzi "Wireless disabilitato" e $ iwconfigvisualizzi Tx-Power=off. $ rfkill unblock wifiannulla questo effetto.
ændrük,

1
L'ho risolto con un ritardo: sembra che in Ubuntu 14.04 sia necessario attendere alcuni secondi prima di disabilitare il wifi /etc/rc.local. Usa questo invece:/bin/sleep 10 && rfkill block wifi
rubo77

1
@ rubo77 Qui (Arch Linux, Network Manager 0.9.8.10-3), esiste un /var/lib/NetworkManager/NetworkManager.statefile che persiste le impostazioni, WirelessEnabled=falseè uno di quelli.
Pubblicherò la

1

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.


2
Il controllo di questa voce di menu non influisce sul comportamento predefinito. La prossima volta che accendo il computer, la radio wireless è di nuovo attiva.
ændrük,

1
Sul mio Ubuntu 14.04 rimane spento come desiderato dopo un riavvio se lo
spengo

1

Nota: se lo usi 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.serviceper 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.

  1. apri /etc/default/grubcon il tuo editor di testo preferito.
  2. aggiungi systemd.restore_state=1come 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.


Problemi con tlp:

Aggiornamento: erano presenti questi problemi, tlp 0.8-1disponibili nei repository 16.04. Dopo l'aggiornamento tlp 0.9-1all'utilizzo di linrunner ppa, TUTTE le edizioni sono state risolte.

Risposta originale:

tlpmaschera / disabilita systemd-rfkill.serviceper "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 tlpriesce a mantenere il bluetooth disabilitato ad ogni avvio.

  • Lo stesso vale per la seconda opzione nello snippet, DEVICES_TO_DISABLE_ON_STARTUPanch'essa disabilitata per impostazione predefinita. Abilitarlo non funziona neanche. Network Mangermostra che il WiFi è disabilitato ma rfkill listnon 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_STARTUPprima di abilitare DEVICES_TO_DISABLE_ON_STARTUPper evitare conflitti.

  • Allo stesso modo le altre opzioni fornite tlp-rdwnon funzionano come previsto.


Soluzione per gli tlputenti:

Aggiornamento: aggiornamento tlp 0.9-1all'utilizzo di linrunner ppa.

Risposta originale:

  1. Abilitare DEVICES_TO_DISABLE_ON_STARTUPe impostare per disabilitare Bluetooth e WiFi potrebbe funzionare per te. ( Ha funzionato per questa persona )

  2. 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



Ho provato la tua risposta coinvolgendo le modifiche di entrambi GRUB_CMDLINE_LINUXe GRUB_CMDLINE_LINUX_DEFAULTpiù il sudo update-grubcomando (non menzionato) e non sono riuscito a farlo funzionare in Pop_OS! 19.10 (basato su Ubuntu 19.10). Secondo systemctl status systemd-rfkillquesto 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.
Patrick Dark,

0

Personalmente uso Jupiter l'applet di gestione dell'alimentazione per disabilitare il wireless sul mio laptop in quanto è controllato da un pulsante speciale. Non penso che sia nel repository principale che ho dovuto aggiungere un ppa da Andrew a Webupd8 per ottenerlo.

Spero che questo ti aiuti.


0

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.


1
Anche se questo ridurrà l'interfaccia, non risparmierà la stessa energia che disabilita la radio rfkill.
gertvdijk,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.