我试图在启动时禁用蓝牙,而不将内核模块列入黑名单。
我在 中评论了以下两行/etc/init/bluetooth.conf
:
start on started dbus
stop on stopping dbus
然后我补充道:
stop on runlevel [0123456]
在文件 中/etc/init.d/bluetooth
,在 之前exit 0
,我添加了以下行:
rfkill block bluetooth
这些尝试都没有成功。
我在网上看到要在/etc/rc.local
文件中添加最后一条命令。但我没有这个文件,而是有rc0.d
和rc6.d
文件rcS.d
夹,其中充满了脚本的符号链接。
我在 Ubuntu-Mate 17.04 下运行,内核为 4.10.0。
答案1
以防万一其他人需要答案;)
如果用户正在运行 systemd(许多发行版中默认),则可以使用以下命令禁用该服务
systemctl disable bluetooth.service
答案2
接受的解决方案完全禁用蓝牙,直到服务(重新)启动。如果您想暂时禁用 BT,直到需要为止,您的问题可能是 bluez 或 blueman-applet 分别在启动和/或登录时启用蓝牙。
前者可以通过AutoEnable=false
在[Policy]
部分中进行设置来禁用/etc/bluetooth/main.conf
。
在 Debian(基于)发行版上,最有可能的是设置为真并可以通过以下方式禁用:
sudo sed -i -e 's/^AutoEnable=true/AutoEnable=false/' /etc/bluetooth/main.conf
后者可以在“PowerManager”下的 GUI 插件设置中禁用,或者通过以下命令(来自https://askubuntu.com/a/923539/244648):
gsettings set org.blueman.plugins.powermanager auto-power-on false
(这个答案在两年内都不完整,因为缺少 bluez 位。感谢多赫德提出这个问题。)
答案3
在启动时停用蓝牙问题
sudo systemctl disable bluetooth.service
那么下次重新启动时,蓝牙将不会处于活动状态...查看状态问题
sudo systemctl status bluetooth.service
要在启动时激活蓝牙,请执行以下操作
sudo systemctl enable bluetooth.service
答案4
还有几个解决方案!
射频杀伤
rfkill
在 2.6 中被合并到 Linux 内核中,是管理无线设备的简单方法。
例如,通过rfkill
不带参数调用来查看无线设备:
cat@rt~ $ rfkill
ID TYPE DEVICE SOFT HARD
0 wlan phy0 unblocked unblocked
1 bluetooth hci0 blocked unblocked
然后(使用 sudo/root)阻止设备rfkill block $TYPE
:
cat@rt~ $ sudo rfkill block bluetooth
cat@rt~ $ sudo rfkill block wlan
现在rfkill
再次检查他们的新状态:
cat@rt~ $ rfkill
ID TYPE DEVICE SOFT HARD
0 wlan phy0 blocked unblocked
1 bluetooth hci0 blocked unblocked
请注意,我禁用的设备列blocked
在下面SOFT
,但没有列出HARD
。这意味着我们已经通过软件禁用了该设备(并且可以通过软件重新启用该设备)。
被阻止的设备HARD
表示无线设备被硬件阻止。这可能是一个硬件终止开关(某些笔记本电脑有一个关闭无线的开关),或者该设备可能被 BIOS 禁用,或者可能没有软件与之交互的驱动程序(请仔细检查我的情况)不过最后一张)。
模组探针
您可能想告诉内核根本不要加载这些无线设备的驱动程序。这意味着您的操作系统和内核将不知道如何与这些设备交互,并且它们将保持断电状态。
首先,检查当前加载了哪些内核模块lsmod
:
cat@rt~ $ sudo lsmod
Module Size Used by
btusb 57344 0
btrtl 20480 1 btusb
btbcm 16384 1 btusb
btintel 28672 1 btusb
bluetooth 577536 5 btrtl,btintel,btbcm,btusb
ecdh_generic 16384 1 bluetooth
ecc 32768 1 ecdh_generic
[...]
这正是我的机器加载的内容。您的驱动程序可能看起来不同,甚至使用不同的驱动程序。
我们可以看到我的机器上有几个蓝牙驱动程序正在运行。btusb
,btrtl
,btbcm
,btintel
, 和bluetooth
。
btusb
是其他每个模块所依赖的通用驱动程序。只需卸载就足够了btusb
,但由于我知道其他驱动程序也不会被使用,所以我喜欢彻底并确保这些驱动程序都不会加载。
我们将modprobe
通过使用命令告诉其配置文件忽略这些内核模块来做到这一点blacklist
。这将进入/etc/modprobe.conf
[^1]。
如果您不存在该文件,请不用担心,您只需创建该文件并进行编辑即可。如果它已经存在,只需将这些行添加到底部。
cat@rt~ $ sudo vim /etc/modprobe.conf
# In the editor vim, I added these lines to the bottom of the file:
blacklist btusb
blacklist btrtl
blacklist btbcm
blacklist btintel
blacklist bluetooth
这要等到您下次重新启动后才会生效。启动时,modprobe
将使用此文件来了解有关要加载哪些内核模块的更多信息,并且当它看到blacklist
此文件中的命令时,它将知道忽略具有这些名称的模块。
脚注
[^1]:您可以在 中定义它/etc/modprobe.conf
,或者如果您愿意,您可以使用该目录/etc/modprobe.d/
并在其中放置许多以 结尾的文件.conf
,所有这些文件都将被读取和使用。