Answers:
至少有两个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-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
通过这种解决方案,尽管我尚未解决rfkill-restore
和之间的理论竞赛,但我不再看到竞赛条件问题network-manager
。
有关这些作业如何协同工作以实现我们的暂时目标的更多详细信息,请参阅我的问题和答案:“如何创建可以确保在另外两个作业开始之前完成的单执行Upstart作业?”
使用网络管理器的“现代”解决方案:只需在网络管理器小程序(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 wifi
root用户身份运行才能禁用无线设备。(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中删除该行。
/etc/rc.local
因为脚本是使用root权限运行的。没有root用户权限,几乎不可能禁用wifi。如果尝试rfkill block wifi
或rfkill unblock wifi
,则显示“无法打开RFKILL控制设备:权限被拒绝”。
$ rfkill block wifi
都会导致NetworkManager小程序显示“无线已禁用”并$ iwconfig
显示Tx-Power=off
。$ rfkill unblock wifi
取消此效果。
/etc/rc.local
。使用它代替:/bin/sleep 10 && rfkill block wifi
/var/lib/NetworkManager/NetworkManager.state
设置的文件,这WirelessEnabled=false
就是其中之一。我会后在你的问题..
tlp
,请阅读完整答案。该问题的所有答案现在都已经很老了,不适用于使用systemd的较新Ubuntu版本。froage的答案在14.04上对我有用,但在16.04上不起作用。
Systemd用于systemd-rfkill.service
在关机期间保存rfkill开关状态,并在每次引导时将其还原。
您必须传递内核命令行参数以在每次引导时恢复rfkill开关状态。
/etc/default/grub
用您喜欢的文本编辑器打开。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-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
,默认情况下禁用选项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。原始答案:
启用DEVICES_TO_DISABLE_ON_STARTUP
并将其设置为禁用蓝牙和WiFi可能对您有用。(此人有用)
这个问题在askubuntu上。这类似于该问题的较早答案。但是请注意,我自己还没有尝试过。它可能会或可能不会。
其他来源:systemd-rfkill,tlp配置
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
,记住“在早期启动”时的无线电状态应该是默认行为,这使我相信此组件已损坏。