如何在默认情况下保持无线网卡的无线电关闭?

ænd*_*rük 12 wireless power-management

我台式机的 PCI 无线网卡一直在扫描可用的无线网络,但我很少使用它。我可以关闭收音机直到我需要它吗?

Lek*_*eyn 7

使用网络管理器的“现代”解决方案:只需在网络管理器小程序(KDE:网络管理)中取消选中无线启用选项。命令nmcli nm wifi off是等效的。如果您偶尔启用 Wi-Fi,但希望在重新启动时将其恢复为禁用状态,请继续阅读。

文件中会记住无线状态/var/lib/NetworkManager/NetworkManager.state。要在启动时禁用 Wi-Fi,请确保密钥WirelessEnabled保持在false。您可以通过编辑网络管理器的 init 脚本或使用/etc/rc.local下面的技巧来做到这一点。你需要的命令是:

sed s/^WirelessEnabled=true/WirelessEnabled=false/ -i /var/lib/NetworkManager/NetworkManager.state
rfkill block wifi
Run Code Online (Sandbox Code Playgroud)

把它放在前面exit 0(如下所述)。rfkill block wifi由于与网络管理器 (NM) 的启动竞争,仍然需要该命令。NM 启动后,对状态文件的更改将无效。


(旧答案涉及编辑文件/etc/rc.local并解释rfkill命令)

有点hacky,但它应该工作。可以使用该rfkill命令禁用无线网卡。rfkill 使用的所有设备都可以使用rfkill list. 示例输出:

0: phy0: Wireless LAN
        Soft blocked: no
        Hard blocked: no
Run Code Online (Sandbox Code Playgroud)

Hard blocked取决于硬件设置,例如笔记本电脑上的无线开关。Soft blocked可以由操作系统(Ubuntu)控制。

它是如何工作的?它没有联机帮助页,rfkill在这种情况下运行会提供帮助文本:

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
Run Code Online (Sandbox Code Playgroud)

啊,现在我们到了某个地方。您需要以rfkill block wifiroot身份运行才能禁用无线设备。(WLAN是无线网络的一个别名,看到的源代码rfkill)。

现在,如果您想在启动时禁用无线功能,请通过运行将命令添加到 /etc/rc.local sudo nano /etc/rc.local。使用箭头键/向上/向下翻页键导航到之前的行exit 0并添加rfkill block wifi,以便文件以这样的方式结束:

# By default, this script does nothing

rfkill block wifi
exit 0
Run Code Online (Sandbox Code Playgroud)

完成后,按Ctrl+ X,然后按Y保存并按Enter接受文件名。

如果您决定以后激活设备,运行:sudo rfkill unblock wifi。如果您决定使用无线网卡,请不要忘记从 /etc/rc.local 中删除该行。


fro*_*age 4

至少有两个 Upstart 作业会影响默认无线状态:

  • /etc/init/rfkill-restore.conf将所有无线电的软块状态恢复到上次关闭时的状态,如 中记录的那样/var/lib/rfkill/saved-state
  • /etc/init/network-manager.conf启动网络管理器,网络管理器又从 恢复其无线状态的概念/var/lib/NetworkManager/NetworkManager.state

如果你看看这两个工作配置,你会发现它们没有时间关系,这对我来说似乎是一个设计缺陷。我猜这种竞争条件很少成为问题,因为/etc/init/rfkill-restore.conf它更简单并且启动条件更少。

我见过的所有强制执行无线关闭默认设置的解决方案都尝试使用/etc/rc.local,包括@Lekensteyn 和@rubo77 提出的“现代”解决方案。不幸的是,该解决方案在我尝试过的两台笔记本电脑中都不适用于我。这并不特别令人惊讶,因为我可以找到与和中的任何/etc/rc.local 一个都没有时间关系。在发出 an 之前进行长时间的睡眠对于这种竞争条件混乱来说是一个丑陋的解决方法,但如果延迟足够长,它就有效。/etc/init/rfkill-restore.conf/etc/init/network-manager.conf/etc/rc.localrfkill block wifi

更好的解决方案是我们在这两个 Upstart 作业被允许运行之前/var/lib/rfkill/saved-state以及之前强加我们想要的状态。我们可以通过创建自己的 Upstart 工作来实现这一目标。事实上,我们需要两个作业配置文件来实现我们需要的计时。/var/lib/NetworkManager/NetworkManager.state

我们的第一个作业配置执行我们需要的实际文件修改。它将尽早运行并且仅运行一次。/etc/init/radio-silence.conf使用此内容创建:

# 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
Run Code Online (Sandbox Code Playgroud)

由于我更喜欢​​在笔记本电脑启动时完全保持无线电静默,因此我会软阻止所有无线电,而不仅仅是无线无线电,但您可以修改sed上面的第一个无线电,以限制此作业对您希望软阻止的任何无线设备的影响。

我们的第二个作业配置负责确保rfkill-restore和作业都不会在完成文件修改network-manager之前启动。radio-silence创建/etc/init/radio-silence-wait.conf如下:

# 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
Run Code Online (Sandbox Code Playgroud)

通过这个解决方案,我不再看到竞争条件问题,尽管我还没有解决rfkill-restore和之间的理论竞争network-manager

有关这些作业如何协同工作以实现我们的临时目标的更多详细信息,请参阅我的问题和答案:“如何创建一个保证在其他两项作业开始之前完成的单执行 Upstart 作业?”