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 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中删除该行。
/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,记住“在早期启动”时的无线电状态应该是默认行为,这使我相信此组件已损坏。