前言
在上一篇文章「在雙系統同步已配對的藍牙裝置」中,我分享了怎麼在 Windows 和 Linux 系統之間共享藍牙配對關係的方法。 但其實這是針對 Bluetooth 5.1 以前的裝置的解法,Bluetooth 5.1 以後的裝置,驗證的機制變得比較複雜,也就多了一些欄位要複製。 由於這個坑讓我卡了一個下午,我決定把它寫下來,除了可以供未來的我參考外,或許也可以幫到其他人。
解法
基本上流程和之前大同小異,就是先在 Linux 上配對,再到 Windows 上配對,最後再回到 Linux 把 Windows 的金鑰值複製過去。 上次我是在 Windows 那邊從「登錄編輯程式」找到金鑰值的,這次我改成從 Linux 端直接使用指令工具來查找。 兩個方法我覺得都算好操作,就看個人喜好了。
1. 從 Windows 端讀取金鑰值
- 安裝 NTFS driver (
ntfs-3g) 和讀取登錄檔的工具 (chntpw)- 我查過各大 Linux distro 的套件庫都有這兩個套件
- 掛載 Windows 的磁區
sudo mount /dev/your/windows/partition /mnt - 進入登錄檔的目錄
cd /mnt/Windows/System32/config - 使用
chntpw查閱登錄檔chntpw -e SYSTEM - 進到藍牙相關的目錄
cd \ControlSet001\Services\BTHPORT\Parameters\Keys - 進到本機藍牙接收器的目錄,這邊應該只會有一個
cd xxxxxxxxxxxx - 找到自己配對的藍牙裝置,不同裝置會有自己的目錄
- 要注意的是,有些藍牙裝置會在某次配對成功後將自己的 MAC 位址加一,所以會和 Windows 上的位址不一樣
- 照理說同個裝置的 MAC 位址在 Windows 上的會比 Linux 上的還大,因為是後配對的
cd xxxxxxxxxxxx - 列出當前目錄的內容時,應該會看到如下的資訊:
我們會需要記下的是Node has 0 subkeys and 9 values size type value name [value if type DWORD] 16 3 REG_BINARY <LTK> 4 4 REG_DWORD <KeyLength> 16 [0x10] 8 b REG_QWORD <ERand> 4 4 REG_DWORD <EDIV> 0 [0x0] 16 3 REG_BINARY <IRK> 8 b REG_QWORD <Address> 4 4 REG_DWORD <AddressType> 1 [0x1] 4 4 REG_DWORD <CEntralIRKStatus> 1 [0x1] 4 4 REG_DWORD <AuthReq> 45 [0x2d]<LTK>、<IRK>、<ERand>和<EDIV>的值
Hint
在 chntpw 的 shell 裡面有這些指令可以用:
cd:切換目錄ls:列出目錄內容cat:印出某個 key 的值hex:以 16 進位表示,印出某個 key 的值q:退出
2. 複製金鑰值到 Linux
接下來提供的解法只會提到 <ERand> 和 <EDive> 皆為 0 的情況。
如果非 0 的話,要經過一些轉換,詳細請參考 [Archlinux Wiki] 上的說明。
除此之外,上面也整理了一些常見的裝置應該要複製哪些值,個人很推薦自己上去看一遍。
- 以 root 的身份執行接下來的指令 (為了方便進入
/var/lib/bluetooth)sudo su - 進到本機藍牙接收器的目錄
cd /var/lib/bluetooth/XX:XX:XX:XX:XX:XX - 找到要同步的裝置的目錄,如果和 Windows 上看到的 MAC 位址不同,記得要把目錄名稱改成和 Windows 上的 MAC 位址相同
- 進到該裝置的目錄後,修改
info... [IdentityResolvingKey] Key=<IRK> ... [PeripheralLongTermKey] Key=<LTK> ... [SlaveLongTermKey] Key=<LTK> ...<IRK>和<LTK>的格式記得要仿照原本值的格式
3. 重新啟動藍牙服務
最後只要重啟藍牙服務就大功告成了,如果重啟沒有用的話,可以試試重新開機。
sudo systemctl restart bluetooth
結語
我就是被 MAC 位址在兩個系統上不同搞到。 我在比對 MAC 位址的時候,只有看前幾個字就判定是相同的,試了好久之後才發現最後面是長不一樣的。 把 Linux 上的目錄名稱改成符合 Windows 上看到的 MAC 位址果然就通了。