Como posso manter o rádio de uma placa sem fio desligado por padrão?

11

A placa sem fio PCI da minha área de trabalho está sempre procurando por redes sem fio disponíveis, mas raramente a uso. Posso manter o rádio desligado até precisar dele?

ændrük
fonte

Respostas:

4

Existem pelo menos dois trabalhos iniciados que afetam o estado sem fio padrão:

  • /etc/init/rfkill-restore.confrestaura o estado do bloco flexível de todos os rádios para o que estavam no último desligamento, conforme registrado em /var/lib/rfkill/saved-state.
  • /etc/init/network-manager.confinicia o Network Manager, que por sua vez restaura sua idéia de estado sem fio /var/lib/NetworkManager/NetworkManager.state.

Se você observar essas duas configurações de trabalho, descobrirá que elas não têm relacionamento temporal , o que me parece uma falha de design. Acho que essa condição de corrida raramente é um problema, porque /etc/init/rfkill-restore.confé muito mais simples e tem menos condições de início.

Todas as soluções para impor um padrão de conexão sem fio que eu já tentei usar /etc/rc.local, incluindo a solução "moderna" que @Lekensteyn e @ rubo77 criaram. Infelizmente, essa solução não funciona para mim em nenhum dos dois laptops que tentei. Isso não é particularmente surpreendente, porque /etc/rc.local também não tem nenhuma relação temporal que eu possa encontrar com qualquer um de /etc/init/rfkill-restore.confe /etc/init/network-manager.conf. Lançar um sono prolongado /etc/rc.localantes de emitir um rfkill block wifié uma solução feia para essa bagunça de condição de corrida, mas funciona se o atraso for longo o suficiente.

Uma solução melhor seria impor nossos estados desejados antes/var/lib/rfkill/saved-state e /var/lib/NetworkManager/NetworkManager.state antes desses dois trabalhos iniciados. Podemos conseguir isso criando nosso próprio trabalho Upstart. De fato, precisaremos de dois arquivos de configuração de tarefas para atingir o tempo necessário.

Nossa primeira configuração de trabalho faz as modificações reais de arquivo necessárias. Ele será executado o mais cedo possível e será executado apenas uma vez. Crie /etc/init/radio-silence.confcom este conteúdo:

# 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

Como eu prefiro o silêncio total do rádio quando meu laptop é iniciado, bloqueio suavemente todos os rádios, não apenas os sem fio, mas você pode modificar o primeiro sedacima para limitar o impacto desse trabalho aos dispositivos sem fio que deseja bloquear.

Nossa segunda configuração de trabalho é responsável por garantir que nenhum dos trabalhos rfkill-restoree network-managerseja iniciado antes de radio-silenceconcluir as modificações no arquivo. Crie da /etc/init/radio-silence-wait.confseguinte maneira:

# 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

Com esta solução, não estou mais vendo problemas de condição de corrida, embora não tenha abordado a corrida teórica entre rfkill-restoree network-manager.

Para obter mais detalhes sobre como esses trabalhos funcionam juntos para alcançar nosso objetivo temporal, consulte minha pergunta e resposta: "Como crio um trabalho Upstart de execução única que deve ser concluído antes que outros dois trabalhos comecem?"

froage
fonte
7

Solução "moderna" usando o Network Manager: basta desmarcar a opção Wireless Enabled no miniaplicativo Network Manager (KDE: Network Management). O comando nmcli nm wifi offé equivalente. Continue lendo se você ativar esporadicamente o Wi-Fi, mas desejar revertê-lo para desativado na reinicialização.

O estado sem fio é lembrado no arquivo /var/lib/NetworkManager/NetworkManager.state. Para desativar Wi-Fi durante a inicialização, certifique-se de que a chave WirelessEnabledestadias false. Você pode fazer isso editando o script init do Network Manager ou usando o /etc/rc.localtruque abaixo. O comando que você precisa é:

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

Coloque isso antes exit 0(como descrito abaixo). O rfkill block wificomando ainda é necessário devido a uma corrida com a inicialização do Network Manager (NM). Depois que o NM é iniciado, as alterações no arquivo de estado não têm efeito.


(resposta antiga que envolve a edição de arquivo /etc/rc.localcom uma explicação do rfkillcomando)

Um pouco hacky, mas deve funcionar. Uma placa sem fio pode ser desativada usando o rfkillcomando Todos os dispositivos usados ​​pelo rfkill podem ser mostrados usando rfkill list. Saída de amostra:

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

Hard blockeddepende de uma configuração de hardware, por exemplo, um switch sem fio em um notebook. Soft blockedpode ser controlado pelo sistema operacional (Ubuntu).

Como funciona? Ele não possui uma página de manual, a execução rfkillfornece um texto de ajuda neste 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, agora chegamos a algum lugar. Você precisa executar rfkill block wificomo root para desativar o dispositivo sem fio. (wlan é um apelido de wifi, consulte o código fonte do rfkill ).

Agora, se você deseja desativar as funções sem fio em tempo de inicialização, adicione o comando ao /etc/rc.local executando sudo nano /etc/rc.local. Use as teclas de seta / teclas acima / abaixo da página para navegar até a linha anterior exit 0e adicionar rfkill block wifi, para que o arquivo termine assim:

# By default, this script does nothing

rfkill block wifi
exit 0

Quando terminar, pressione Ctrl+ X, pressione Ypara salvar e pressione Enterpara aceitar o nome do arquivo.

Se você decidir ativar o dispositivo mais tarde, execute: sudo rfkill unblock wifi. Não esqueça de remover a linha do /etc/rc.local se você decidir usar a placa sem fio.

Lekensteyn
fonte
Obrigado. Não entendo o porquê, mas parece que não preciso usar o sudo para que o rfkill funcione.
ændrük
1
Você não precisa do sudo, /etc/rc.localpois o script é executado com permissões de root. É muito improvável que você possa desativar o wifi sem permissões de root. Se eu tentar rfkill block wifiou rfkill unblock wifireceber, "Não é possível abrir o dispositivo de controle RFKILL: permissão negada".
Lekensteyn
Tanto no meu ThinkPad X60 quanto na minha área de trabalho com uma placa sem fio PCI, a execução $ rfkill block wififaz com que o miniaplicativo do NetworkManager exiba "A conexão sem fio está desativada" e $ iwconfiga exibição Tx-Power=off. $ rfkill unblock wifidesfaz esse efeito.
ændrük
1
Eu resolvi isso com um atraso: parece que no Ubuntu 14.04 você precisa esperar alguns segundos antes de desativar o wifi /etc/rc.local. Use isso:/bin/sleep 10 && rfkill block wifi
rubo77
1
@ rubo77 Aqui (Arch Linux, Network Manager 0.9.8.10-3), existe um /var/lib/NetworkManager/NetworkManager.statearquivo que persiste nas configurações, WirelessEnabled=falseé um deles. Vou postar na sua pergunta ..
Lekensteyn
1

A maneira mais fácil de desativar sua placa de rede sem fio é clicar com o botão direito do mouse no indicador NetworkManager (pequeno ícone no canto superior direito do painel) e desmarcar a Enable Wireless. Isso desativa ( ifconfig wlan0 down) a interface e não executa mais a verificação.

user4124
fonte
2
A verificação deste item de menu não afeta o comportamento padrão. Na próxima vez que ligo o computador, o rádio sem fio está ativo novamente.
ændrük
1
No meu Ubuntu 14.04 que permanece fora como desejado após uma reinicialização se eu transformá-lo de no gerenciador de rede de aplicação
rubo77
1

Nota: Se você usar tlp, leia a resposta completa.

Todas as respostas para esta pergunta são bem antigas agora e não funcionam em versões mais recentes do Ubuntu que usam systemd. A resposta de froage funcionou para mim em 14.04, mas não em 16.04.

O Systemd usa systemd-rfkill.servicepara salvar o estado do comutador rfkill durante o desligamento e restaurá-lo a cada inicialização.

Você precisa passar um parâmetro de linha de comando do kernel para restaurar o estado do switch rfkill em cada inicialização.

  1. abra /etc/default/grubcom o seu editor de texto preferido.
  2. adicione systemd.restore_state=1como um parâmetro para GRUB_CMDLINE_LINUX. Essa linha deve agora ler GRUB_CMDLINE_LINUX="systemd.restore_state=1". Você pode adicioná-lo GRUB_CMDLINE_LINUX_DEFAULTtambém. Qualquer um deles funciona. Veja esta pergunta para mais detalhes.

Isso garantirá que o estado rfkill seja restaurado em cada inicialização. Certifique-se de desligar o bluetooth e o wifi antes de reiniciar.


Problemas com tlp:

Atualização: Esses problemas estavam presentes nos tlp 0.8-1quais estão disponíveis nos repositórios 16.04. Após a atualização para o tlp 0.9-1uso do linrunner ppa, TODOS os isssues foram resolvidos.

Resposta original:

tlpmascara / desativa systemd-rfkill.servicepara "evitar conflitos e garantir o funcionamento adequado das opções de comutação de dispositivos de rádio do TLP" . ( Fonte-1 , Fonte-2 )

Isso significa que passar o parâmetro do kernel não funcionará para você.

Aqui está um pequeno trecho (em torno da linha nº 195) do arquivo de configuração padrão do 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"
  • Como você pode ver, a opção para RESTORE_DEVICE_STATE_ON_STARTUPestá desativada por padrão. Mas ativar essa opção não ajuda.

    Mesmo depois de ativar a opção RESTORE_DEVICE_STATE_ON_STARTUP , desativar o wifi e o bluetooth (usando rfkill block all) e continuar reiniciando, de alguma forma o WiFi é ativado a cada 2 ou 3 de inicialização. Não há garantia de que, na próxima inicialização, o WiFi seja desativado. Surpreendentemente, tlpconsegue manter o bluetooth desativado em cada inicialização.

  • O mesmo vale para a segunda opção no snippet DEVICES_TO_DISABLE_ON_STARTUP, que também é desativada por padrão. Ativá-lo também não funciona. Network Mangermostra que o Wi-Fi está desativado, mas rfkill listnão mostra nenhum bloco flexível no Wi-Fi.

    Nota: Eu li a linha "Hint: the parameters DEVICES_TO_DISABLE/ENABLE_ON_STARTUP/SHUTDOWN below are ignored when this is enabled!".

    Desativei RESTORE_DEVICE_STATE_ON_STARTUPantes de ativar DEVICES_TO_DISABLE_ON_STARTUPpara evitar conflitos.

  • Da mesma forma, as outras opções fornecidas tlp-rdwnão funcionam conforme o esperado.


Solução para tlpusuários:

Atualização: Atualize para tlp 0.9-1usar o linrunner ppa.

Resposta original:

  1. Ativá DEVICES_TO_DISABLE_ON_STARTUP-lo e configurá-lo para desativar o Bluetooth e o Wi-Fi pode funcionar para você. ( Funcionou para esta pessoa )

  2. Esta pergunta aqui no askubuntu. É semelhante a uma resposta mais antiga para esta pergunta. Mas observe que eu mesmo não tentei. Isto pode ou não funcionar.


Outras fontes: systemd-rfkill , tlp-configuration


Manoj
fonte
Eu tentei sua resposta envolvendo as modificações de ambos GRUB_CMDLINE_LINUXe GRUB_CMDLINE_LINUX_DEFAULTmais o sudo update-grubcomando (não mencionado) e não consegui fazê-lo funcionar no Pop_OS! 19.10 (que é baseado no Ubuntu 19.10). De acordo com systemctl status systemd-rfkill, esse serviço já está sendo executado em toda inicialização e, como o valor padrão é 1, não deve ser necessário esse esforço. Com base nas informações em man systemd-rfkill, lembrar o estado do rádio "na inicialização antecipada" deve ser o comportamento padrão, o que me leva a acreditar que esse componente está de alguma forma quebrado.
Patrick Dark
0

Pessoalmente, uso o applet de gerenciamento de energia Jupiter para desativar o wireless no meu laptop, pois ele é controlado por um botão especial. Eu não acho que no repositório principal eu precisei adicionar um ppa de Andrew no Webupd8 para obtê-lo.

Espero que isto ajude.

Allan
fonte
0

Você poderia adicionar

ifconfig wlan0 down

para /etc/rc.local, mas primeiro,

certifique-se de que, se você estiver usando o NetworkManager (tenho a versão 0.8.4 ~ git.20110319t175609.d14809b-0ubuntu3), vá ao menu " Editar conexões " -> guia " Sem fio ", clique na conexão, clique em " Editar " e verifique se, na guia " Sem fio ", a caixa de seleção " Conectar automaticamente " NÃO está marcada.

waltinator
fonte
1
Embora isso abaixe a interface, não economizará tanta energia quanto desativar o rádio usando rfkill.
precisa saber é o seguinte