默认情况下,如何使无线卡的无线电保持关闭状态?


11

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

Answers:


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 没有时间上的关系,我可以找到任何的/etc/init/rfkill-restore.conf/etc/init/network-manager.conf。对于此竞态条件混乱,/etc/rc.local在发出之前先睡一会rfkill block wifi是一个丑陋的解决方法,但如果延迟时间足够长,它就可以工作。

更好的解决方案是让我们在甚至允许运行这两个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上面的第一个无线电,以将此项工作的影响限制在希望软屏蔽的任何无线设备上。

我们的第二个作业配置负责确保rfkill-restorenetwork-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

通过这种解决方案,尽管我尚未解决rfkill-restore和之间的理论竞赛,但我不再看到竞赛条件问题network-manager

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


7

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

文件中会记住无线状态/var/lib/NetworkManager/NetworkManager.state。要在启动时禁用Wi-Fi,请确保密钥WirelessEnabled保持在false。您可以通过编辑Network Manager的初始化脚本或使用以下/etc/rc.local技巧来实现。您需要的命令是:

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

将此放在前面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

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

啊,现在我们到了某个地方。您需要以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

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

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


谢谢。我不明白为什么,但是看起来我不需要使用sudo来使rfkill正常工作。
ændrük

1
您不需要sudo,/etc/rc.local因为脚本是使用root权限运行的。没有root用户权限,几乎不可能禁用wifi。如果尝试rfkill block wifirfkill unblock wifi,则显示“无法打开RFKILL控制设备:权限被拒绝”。
Lekensteyn'2

在我的ThinkPad X60和带有PCI无线卡的台式机上,运行$ rfkill block wifi都会导致NetworkManager小程序显示“无线已禁用”并$ iwconfig显示Tx-Power=off$ rfkill unblock wifi取消此效果。
ændrük

1
我延迟解决了它:似乎在Ubuntu 14.04中,您需要等待几秒钟才能在中禁用wifi /etc/rc.local。使用它代替:/bin/sleep 10 && rfkill block wifi
rubo77

1
@ rubo77这里(Arch Linux,网络管理器0.9.8.10-3)中存在一个保存/var/lib/NetworkManager/NetworkManager.state设置的文件,这WirelessEnabled=false就是其中之一。我会后在你的问题..
Lekensteyn

1

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


2
选中此菜单项不会影响默认行为。下次打开计算机时,无线电将再次启用。
ændrük

1
在我的Ubuntu 14.04中,如果我在网络管理器小程序
中将

1

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

该问题的所有答案现在都已经很老了,不适用于使用systemd的较新Ubuntu版本。froage的答案在14.04上对我有用,但在16.04上不起作用。

Systemd用于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存储库中可用。更新为tlp 0.9-1使用linrunner ppa之后,解决了所有问题。

原始答案:

tlp掩模/禁用systemd-rfkill.service“避免冲突和保证的TLP的无线电装置的开关选项正确操作”。(Source-1Source-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,默认情况下禁用选项to 。但是启用该选项无济于事。

    即使您启用的选项RESTORE_DEVICE_STATE_ON_STARTUP ,禁用wifi和蓝牙(使用rfkill block all)并继续重新启动,每隔2或3次启动也会以某种方式启用WiFi。无法保证下次启动时会禁用WiFi。令人惊讶的是 tlp,每次启动时都使蓝牙保持禁用状态。

  • 片段中的第二个选项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!"

    我禁用RESTORE_DEVICE_STATE_ON_STARTUP启用前 DEVICES_TO_DISABLE_ON_STARTUP,以避免冲突。

  • 同样,提供的其他选项tlp-rdw也不起作用。


tlp用户解决方案:

更新:更新为tlp 0.9-1使用linrunner ppa。

原始答案:

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

  2. 这个问题在askubuntu上。这类似于该问题的较早答案。但是请注意,我自己还没有尝试过。它可能会或可能不会。


其他来源:systemd-rfkilltlp配置



我尝试了您的答案,其中涉及到GRUB_CMDLINE_LINUX以及GRUB_CMDLINE_LINUX_DEFAULT以及(未提及的)sudo update-grub命令的修改,但我无法在Pop_OS中使用它!19.10(基于Ubuntu 19.10)。根据systemctl status systemd-rfkill,此服务已在每次引导时运行,并且由于默认值为1,因此无需进行此操作。根据的信息man systemd-rfkill,记住“在早期启动”时的无线电状态应该是默认行为,这使我相信此组件已损坏。
帕特里克·达克

0

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

希望这可以帮助。


0

您可以添加

ifconfig wlan0 down

/etc/rc.local,但首先

确保使用的是NetworkManager(我的版本为0.8.4〜git.20110319t175609.d14809b-0ubuntu3),请转到菜单“ 编辑连接 ”->“ 无线 ”选项卡,单击连接,再单击“ 编辑 ” ,并确保未选中“ 无线 ”标签中的“ 自动连接 ”复选框。


1
虽然这将使接口关闭,但不会节省与禁用无线电相同的功耗rfkill
gertvdijk
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.