启动时禁用蓝牙

启动时禁用蓝牙

我试图在启动时禁用蓝牙,而不将内核模块列入黑名单。

我在 中评论了以下两行/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.drc6.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
[...]

这正是我的机器加载的内容。您的驱动程序可能看起来不同,甚至使用不同的驱动程序。

我们可以看到我的机器上有几个蓝牙驱动程序正在运行。btusbbtrtlbtbcmbtintel, 和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,所有这些文件都将被读取和使用。

相关内容