银河麒麟与Windows双系统免重复配对需同步蓝牙bonding密钥:先确认两系统识别同一蓝牙硬件地址,再导出麒麟密钥并严格按格式注入Windows注册表,同时在麒麟中启用StrictBonding=true禁用密钥刷新,最终实现跨系统自动连接。

在银河麒麟与其他操作系统(如Windows、Ubuntu)共存的双系统环境中,蓝牙设备每次切换系统都需重新配对,是因为各系统独立存储配对密钥且不共享bonding信息。要实现跨系统免重复配对,必须让多个系统读取并写入同一套蓝牙密钥文件,同时确保密钥格式兼容、权限可控、服务行为一致。
确认各系统使用相同蓝牙硬件与地址
这是前提——若两系统识别出不同hci设备(如Windows用hci0,麒麟用hci1),或蓝牙芯片MAC地址不一致(常见于USB蓝牙适配器热插拔后编号变动),后续所有同步操作都将失效。
在银河麒麟终端中执行:hciconfig -a | grep "BD Address",记录下BD Address值(如 AA:BB:CC:DD:EE:FF)。
重启进入Windows,打开“设备管理器”→“蓝牙”→右键你的蓝牙适配器→“属性”→“详细信息”→“属性”下拉选“蓝牙地址”,比对是否完全一致。若不一致,说明硬件被系统识别为不同实体,【此时无法实现跨系统密钥复用,必须更换为固定PCIe内置蓝牙或原生USB口直连的适配器】。
导出银河麒麟当前配对密钥
配对密钥实际存储在/var/lib/bluetooth/[ADAPTER_MAC]/[DEVICE_MAC]/info中,其中包含Key、PIN、LinkKey等关键字段。
先确认适配器MAC:执行ls /var/lib/bluetooth/,你会看到一个类似AA:BB:CC:DD:EE:FF的文件夹名,这就是你的hci0地址。
进入该目录,再执行ls,找到目标设备MAC子目录(如11:22:33:44:55:66),然后运行:sudo cat info | grep -E "^(Key|PIN|LinkKey|Auth|IOCap)"。
将输出内容完整复制保存为文本文件(如key_backup.txt),注意保留原始大小写与冒号分隔格式——Windows蓝牙栈对大小写敏感,错一位会导致连接失败。
在Windows中注入密钥(需管理员权限)
Windows不提供图形界面导入bonding密钥的功能,必须通过注册表修改。此操作有风险,务必提前备份注册表。
按Win+R输入regedit,定位到:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BTHPORT\Parameters\Keys。
在Keys项下,新建与设备MAC同名的项(如112233445566,全部小写、无冒号);在该项下新建字符串值:Key、LinkKey、AuthReq、IOCap,其数据内容严格对应上一步从麒麟导出的值。
特别注意:Key和LinkKey值必须为32位十六进制小写字符串(如a1b2c3d4e5f678901234567890abcdef),不能带空格或前缀0x;AuthReq通常为0x01(表示MITM保护启用),IOCap一般为0x04(表示键盘显示)。【若填错AuthReq或IOCap,Windows会拒绝使用该密钥,直接发起新配对】。
修改完成后,重启Windows蓝牙服务:以管理员身份运行CMD,执行net stop bthserv && net start bthserv。
在银河麒麟中锁定密钥不被覆盖
默认情况下,每次connect成功后,bluez可能根据协商结果更新LinkKey,导致与Windows保存的密钥不一致,下次切回Windows就又断连。
编辑/etc/bluetooth/main.conf,在[General]段落下添加一行:Enable=Source,Sink,Media,Socket;再添加PairingTimeout=0和AutoEnable=true。
最关键的是禁用自动密钥刷新:在[Policy]段落下添加StrictBonding=true,并确保RememberDeviceTimeout=0已存在(若无则手动添加)。
保存后执行:sudo systemctl restart bluetooth。这会强制bluez始终使用首次配对生成的LinkKey,不再因A2DP重协商而改写。
验证跨系统免配对效果
方法一(推荐):在银河麒麟中保持耳机已连接并播放音频,重启进入Windows,观察任务栏蓝牙图标是否立即显示该耳机为“已连接”状态,并能直接播放声音;
方法二:在Windows中断开耳机,关机,再开机进入银河麒麟,无需任何操作,耳机应自动重连并出现在声音设置的输出设备列表中;
方法三:若任一系统提示“需要配对码”,说明密钥未生效或格式错误,立即检查Windows注册表中Key值是否为32字符小写十六进制,以及银河麒麟/var/lib/bluetooth/.../info中LinkKey是否与之完全一致。


















