当双启动 Windows 和 Linux Mint/Ubuntu 时,您可能会发现自己必须一次又一次地重新配对蓝牙设备。每次切换操作系统时都会发生这种情况。
现在,你如何防止这种情况发生?
我正在用以下指南回答我自己的问题,该指南已经过测试:
- 乌班图14.4
- 乌班图20.04
- 乌班图22.10
- Linux 薄荷 17.X
- Linux 薄荷 18.X
- Linux 薄荷 21.X
- 软呢帽25
在 Windows 端,这适用于 7、10 和 11。
答案1
为什么会出现这种情况?
基本上,当您配对设备时,蓝牙服务会生成一组唯一的配对密钥。首先,您的计算机存储蓝牙设备的 MAC 地址和配对密钥。其次,您的蓝牙设备存储计算机的 MAC 地址和匹配密钥。这通常工作正常,但蓝牙端口的 MAC 地址在 Linux 和 Windows 上都是相同的(它是在硬件级别设置的)。因此,当您在 Windows 或 Linux 中重新配对设备并生成新密钥时,该密钥将覆盖蓝牙设备上之前存储的密钥。 Windows 会覆盖 Linux 密钥,反之亦然。
蓝牙 LE 设备:这些可能会以不同的方式配对。我还没有调查过自己,但这可能会有所帮助双启动蓝牙 LE(低功耗)设备配对
怎么修
按照下面的说明,我们将首先将您的蓝牙设备与 Ubuntu/Linux Mint 配对,然后再与 Windows 配对。然后我们将返回 Linux 系统并将 Windows 生成的配对密钥复制到 Linux 系统中。
- 将所有设备与 Mint/Ubuntu 配对
- 将所有设备与 Windows 配对
- 通过以下两种方式之一复制 Windows 配对密钥:
psexec -s -i regedit.exe
从 Windows使用(较难)。您需要psexec
正常的 regedit 没有足够的权限来显示此值。- 转至控制面板中的“设备和打印机”,然后转至蓝牙设备的属性。然后,在蓝牙部分,您可以找到唯一标识符。复制它(稍后您将需要它)。笔记:在较新版本的 Windows 上,访问设备属性的途径是通过“设置”->“蓝牙和设备”->“设备”->更多设备和打印机设置
- 从以下位置下载 PsExechttp://technet.microsoft.com/en-us/sysinternals/bb897553.aspx。
- 解压您下载的 zip 并使用提升的权限打开 cmd 窗口。 (单击开始菜单,搜索
cmd
,然后右键单击 CMD 并单击“以管理员身份运行”。) - cd 进入您解压下载的文件夹。
- 跑步
psexec -s -i regedit.exe
- 导航至 找到密钥
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\BTHPORT\Parameters\Keys
。如果没有CurrentControlSet
,请尝试ControlSet001
。 - 您应该会看到一些带有 MAC 地址的按键标签 - 记下与您之前复制的唯一标识符关联的 MAC 地址。笔记:如果有没有可见的钥匙配对后,您可能需要添加读取权限(右键->权限)
Keys\
- 为了方便起见,将其导出为文本文件。单击文件 -> 导出 -> 作为文本并将其保存到共享分区/云。
从您的 Linux 发行版使用
chntpw
(更简单)。然后在终端中启动:sudo apt-get install chntpw
以读写模式挂载 Windows 系统驱动器
- 找到驱动器使用
sudo lsblk -o NAME,FSTYPE,SIZE,MOUNTPOINT,LABEL
。根据双启动的设置方式,它通常ntfs
是驱动器上的第一个分区/boot/efi
。请注意NAME
. sudo mkdir /mnt/c
sudo mount --read-only /dev/<NAME> /mnt/c
- 安全卸载驱动器
sudo umount /mnt/c
- 如果您需要尝试不同的驱动器或完成所有这些说明后
- 找到驱动器使用
cd /[WindowsSystemDrive]/Windows/System32/config
- 在 Windows 10 上,根文件夹是“Windows”,在 Windows 7 上,根文件夹是“WINDOWS”
chntpw -e SYSTEM
打开控制台在该控制台中运行这些命令:
> # If there is no ControlSet001, then try CurrentControlSet > # on Windows 7, "services" below is lowercased. > cd ControlSet001\Services\BTHPORT\Parameters\Keys > ls # shows you your Bluetooth port's MAC address Node has 1 subkeys and 0 values key name <aa1122334455> > cd aa1122334455 # cd into the folder > ls # lists the existing devices' MAC addresses Node has 0 subkeys and 1 values size type value name [value if type DWORD] 16 REG_BINARY <001f20eb4c9a> > # Get the value of the REG_BINARY entry > hex 001f20eb4c9a => :00000 XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX ...ignore..chars.. # ^ the XXs are the pairing key
记下哪个蓝牙设备 MAC 地址与哪个配对密钥匹配。 Mint/Ubuntu 不需要中间的空格。忽略
:00000
.
- 返回 Linux(如果不在 Linux 中)并将 Windows 密钥添加到 Linux 配置条目中。请注意,从 Windows 迁移到 Linux 时,蓝牙端口的 MAC 地址格式有所不同 - 在上面的示例中,Windows 中引用为 aa1122334455。 Linux 版本将全部大写,并在每两个字符后用“:”标点 - 例如 AA:11:22:33:44:55。根据您的 Linux 版本,您可以执行以下操作之一:
- 铸币前 18/16.04你可以这样做:
sudo edit /var/lib/bluetooth/[MAC address of Bluetooth]/linkkeys
- [蓝牙的MAC地址]应该是该蓝牙文件夹中的唯一文件夹。该文件应如下所示:
[Bluetooth MAC] [Pairing key] [digits in pin] [0] AA:11:22:33:44:55 XXXXXXXXxxXXxXxXXXXXXxxXXXXXxXxX 5 0 00:1D:D8:3A:33:83 XXXXXXXXxxXXxXxXXXXXXxxXXXXXxXxX 4 0
将 Linux 配对密钥更改为 Windows 配对密钥,减去空格。
- 在 Mint 18(和 Ubuntu 16.04)及更高版本中你可能必须这样做:
切换到root:(
sudo -i
在旧版本的Ubuntu中,“su -”)cd 到您的蓝牙配置位置
/var/lib/bluetooth/[bth port MAC addresses]
您将在此处找到已配对的每台设备的文件夹。文件夹名称是蓝牙设备的 MAC 地址,并包含单个文件
info
。在这些文件中,您将看到需要替换为 Windows 链接密钥的链接密钥,如下所示:[LinkKey] Key=B99999999FFFFFFFFF999999999FFFFF
- 铸币前 18/16.04你可以这样做:
- 一旦更新,重新启动您的蓝牙服务通过以下方式之一,然后就可以了!
Ubuntu、Mint、Arch:
sudo systemctl restart bluetooth
或者,将计算机重新启动至 Linux。
- 重新启动进入 Windows - 它可以工作了!
答案2
[linkKey]
首先,许多答案建议替换文件部分中的密钥/var/lib/bluetooth/<ADAPTOR_MAC_ADDRESS>/<DEVICE_MAC_ADDRESS>/info
。这一段现在好像叫[LongTermKey]
。而且,[LocalSignatureKey]
现在看来是[IdentityResolvingKey]
。有些答案只提到更改 key in [linkKey]
,但您还需要Enc
和Ediv
条目Rand
以及 key for [IdentityResolvingKey]
。
其次,设备的mac地址可能不是恒定的。就我的 Logitech G604 而言,每次配对时它都会增加 1。我更新了这些脚本这里来解决这个问题。
指示
- 启动进入 Linux 并配对蓝牙设备。您将需要新生成的
info
和.attributes
/var/lib/bluetooth/<ADAPTOR_MAC_ADDRESS>/<DEVICE_MAC_ADDRESS>/
- 重新启动进入 Windows 并配对蓝牙设备。
- 下载执行程序并从在管理员模式下运行的命令提示符运行以下命令:
PsExec64.exe -s -i regedit /e C:\BTKeys.reg HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\BTHPORT\Parameters\Keys
- 将
C:\BTKeys.reg
文件复制到 USB 闪存盘(C:
如果可以从 Linux 操作系统访问该文件,则将其保留在驱动器上)。 - 关闭蓝牙设备并重新启动至 Linux。不要在 Linux 中再次配对设备。它可能会生成一个新的 MAC 地址,这将破坏 Windows 配对。 (我不知道这是否正常,但我的 Logitech G604 就是这样)。
- 将文件复制
BTKeys.reg
到您的 Linux 文件系统。 - 运行
clean_reg_file.py --file_path BTKeys.reg --output clean.reg
以清理文件(将编码转换为 UTF8 并去除引号)。 - 跑步
bluetooth_fix.py --reg_path clean.reg
。 - 从带有 的终端
sudo
,导航至/var/lib/bluetooth/<ADAPTOR_MAC_ADDRESS>/
。 - 创建一个与设备 mac 地址对应的新目录
BTKeys.reg
。 info
将和attributes
从旧的 mac 地址目录复制到新的目录。/var/lib/bluetooth/<ADAPTOR_MAC>/<NEW_DEVICE_MAC>/info
根据步骤 8 的输出打开并修改值。- 使用 重新启动蓝牙
sudo systemctl restart bluetooth
。