如何默认关闭无线网卡的无线电?

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

至少有两个影响默认无线状态的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 没有我可以在/etc/init/rfkill-restore.conf/etc/init/network-manager.conf找到的时间关系 。 在发布rfkill block wifi之前在/etc/rc.local中长时间睡眠是这种竞争条件混乱的一个丑陋的解决方法,但是如果延迟足够长则它可以工作。

这两个Upstart作业甚至被允许运行之前 ,我们可以在/var/lib/rfkill/saved-state/var/lib/NetworkManager/NetworkManager.state强制使用我们想要的状态。 我们可以通过创建自己的Upstart工作来实现这一目标。 实际上,我们需要两个作业配置文件来实现我们需要的时间。

我们的第一个作业配置执行我们需要的实际文件修改。 它会尽早运行,只运行一次。 使用以下内容创建/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 

当我的笔记本电脑启动时,我更喜欢完全无线电静音,我软禁止所有无线电,而不仅仅是无线,但您可以修改上面的第一个sed ,以限制此作业对您希望软阻塞的无线设备的影响。

我们的第二个作业配置负责确保在radio-silence完成文件修改之前, rfkill-restorenetwork-manager作业都不会启动。 创建/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 

有了这个解决方案,我不再看到竞争条件问题,虽然我没有解决rfkill-restorenetwork-manager之间的理论竞争。

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

使用网络管理器的“现代”解决方案:只需取消选中网络管理器小程序(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 

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


(旧答案涉及编辑文件/etc/rc.local并附有rfkill命令的说明)

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

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

Hard blocked取决于硬件设置,例如笔记本电脑上的无线开关。 Soft blocked可以由OS(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:  all wifi wlan bluetooth uwb ultrawideband wimax wwan gps fm 

啊,现在我们到了某个地方。 您需要以root身份运行rfkill block wifi以禁用无线设备。 (wlan是wifi的别名,请参阅rfkill 的源代码 )。

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

 # By default, this script does nothing rfkill block wifi exit 0 

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

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

禁用无线网卡的最简单方法是右键单击NetworkManager指示灯(面板右上角的小图标),然后取消选中“ Enable Wireless 。 这降低了( ifconfig wlan0 down )接口,它不再执行扫描。

注意:如果您使用tlp ,请阅读完整的答案。

这个问题的所有答案现在都很老了,并且不适用于使用systemd的较新的Ubuntu版本。 froage的回答在14.04对我有用 ,但在16.04没有用。

systemd-rfkill.service使用systemd-rfkill.service在关机期间保存rfkill开关状态,并在每次启动时恢复它。

您必须传递内核命令行参数以在每次启动时恢复rfkill开关状态。

  1. 使用首选文本编辑器打开/etc/default/grub
  2. systemd.restore_state=1作为参数添加到GRUB_CMDLINE_LINUX 。 该行现在应该读取GRUB_CMDLINE_LINUX="systemd.restore_state=1" 。 您也可以将它添加到GRUB_CMDLINE_LINUX_DEFAULT 。 他们中的任何一个都有效。 有关详细信息, 请参阅此问题 。

这将确保在每次启动时恢复rfkill状态。 确保在重新启动之前关闭蓝牙和wifi。


tlp问题:

更新:这些问题出现在tlp 0.8-1 ,可在16.04存储库中找到。 在使用linrunner ppa更新到tlp 0.9-1后,解决了所有问题。

原始答案:

tlp屏蔽/禁用systemd-rfkill.service“避免冲突并确保TLP无线电设备切换选项的正常运行” 。 ( Source-1 , Source-2 )

这意味着传递内核参数将不适合您。

这是来自tlp默认配置文件( /etc/default/tlp )的一小段代码(大约195行)。

 # 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" 
  • 如您所见,默认情况下禁用RESTORE_DEVICE_STATE_ON_STARTUP选项。 但启用该选项并没有帮助。

    即使你启用了RESTORE_DEVICE_STATE_ON_STARTUP选项,禁用wifi和蓝牙(使用rfkill block all )并继续重启,不知何故WiFi在每次第二次或第三次启动时都启用。 无法保证在下次启动时将禁用WiFi。 令人惊讶的是, tlp设法在每次启动时都禁用蓝牙function。

  • 同样适用于代码段中的第二个选项DEVICES_TO_DISABLE_ON_STARTUP ,默认情况下也会禁用该选项。 启用它也不起作用。 Network Manger显示WiFi已禁用,但rfkill list未在WiFi上显示任何软块。

    注意:我已阅读"Hint: the parameters DEVICES_TO_DISABLE/ENABLE_ON_STARTUP/SHUTDOWN below are ignored when this is enabled!"

    我在启用DEVICES_TO_DISABLE_ON_STARTUP之前禁用了RESTORE_DEVICE_STATE_ON_STARTUP以避免冲突。

  • 同样,提供的其他选项tlp-rdw不能按预期工作。

tlp用户的解决方案:

更新:使用linrunner ppa更新到tlp 0.9-1

原答案:

  1. 启用DEVICES_TO_DISABLE_ON_STARTUP并将其设置为禁用蓝牙和WiFi可能对您DEVICES_TO_DISABLE_ON_STARTUP 。( 适用于此人 )

  2. 这个问题在askubuntu上。 它类似于这个问题的旧答案。 但请注意,我自己没有尝试过。 它可能会也可能不会奏效。


其他来源: systemd-rfkill , tlp-configuration


我个人使用Jupiter电源管理小程序来禁用我的笔记本电脑上的无线,因为它是由一个特殊按钮控制的。 我不认为在主要的回购中我必须在Webupd8上添加安德鲁的ppa来获得它。

希望这可以帮助。

你可以添加

ifconfig wlan0 down

/etc/rc.local ,但首先,

确保,如果您使用的是NetworkManager(我的版本为0.8.4~git.20110319t175609.d14809b-0ubuntu3),则进入菜单“ 编辑连接 ” – >“ 无线 ”选项卡,单击连接,单击“ 编辑 ” ,并确保在“ 无线 ”选项卡中,未选中“ 自动连接 ”复选框。