한 PC에서 여러 OS 사용시 블루투스 기기 공유 설정

예를 들어, 한 PC 에서 리눅스 배포판 여러개, MS 윈도우, macOS 등을 사용한다고 가정한다. 각각 OS 에 동일한 블루투스 기기(예를 들어 마우스)를 연결해야 한다고 하면, 이때 한가지 아주 껄끄러운 문제가 발생하게 된다.

OS A에서 마우스/이어셋등을 짝짓기 한 뒤, OS B에서 다시 그 기기를 짝짓기를 하고나서 다시 OS A 로 돌아가면, 이전에 행했던 페어링이 무시되어 버린다.
이건 페어링 할 때마다 블루투스 기기의 키(BT4)나, 키와 주소(BT5)가 바뀌기 때문이다.
따라서 OS 간 이동을 한다면, 할 때 마다 새롭게 짝짓기(Pairing)을 해줘야만 한다. 이거 저거 자주 써야 하는 경우엔 이게 꽤 귀찮은 문제가 된다. 이렇게 자꾸 하다가 예전 로지텍 동글처럼 더이상 페어링이 안되는 경우가 있을 수도 있고..

아무튼, 원래 이렇게 써야만 하는 걸로만 알고 있었는데, 내 무식함이 또 한번 드러나버렸던 경우였다고 밖에. 이른바 無知發露.
해법이 있었다.


늘 그렇듯, 위대한 아치 문서에서 도움을 얻었다.

MS 윈도우, macOS, Linux 모두 할 수 있긴 한데, MS 윈도우는 얼핏 봐도 설정법이 꽤 복잡해 보인다. 다행인건 MS 윈도우는 쓸 일이 거의 없기에..
macOS 와 Linux 간 설정은, 방법만 알면 매우 간단하다. Linux 배포판 간은 더 말할 필요도 없고.

Linux 간 공유

첫째로, 리눅스 배포판 마다 각각 짝짓기를 해준다. (예. 우분투/쿠분투/KDE Neon/ArchLinux/Tumbleweed 등등)
단, 맨 처음에 설치한 배포판이 ‘원본’이라 생각하고, 거기에 설치된 ‘키’를 다른 배포판으로 옮겨주는 작업을 해야 한다.

이 ‘키’는 다음 위치에 있다. 다만, 여기는 root 로만 접근 가능하므로, sudo -i 가 필요하다.

# cd /var/lib/bluetooth/BT-Adapter-MAC-address

저 디렉토리는 블루투스 어댑터의 주소고, 안으로 들어가면 각각 연결된 기기의 주소들이 역시 디렉토리로 구분돼 있다. 이 디렉토리로 들어가면 info 라는 파일이 있는데, 이 파일을 열면 [General] 의 Name 항목에서 어떤 기기인지 확인할 수 있다.

이름을 확인했으면, [LinkKey] 항목에서 Key 를 확인한다. 이 키를 다른 리눅스 배포판마다 동일하게 붙여넣어주면 된다.
디렉토리 위치는, 적어도 우분투 계열과 ArchLinux 는 동일했다.

작업을 완료했다면, 그냥 속시원하게 재부팅. 블루투스 서비스와 펄스를 재시작하면 된다고는 하는데.. 그냥 재부팅!


그런데!

위 방식은 BT 4.x 에 해당한다. BT5 에는 LinkKey 가 아니고, LongTermKey 가 있는데, 이것도 그대로 복사하면 될런지는 안해봐서 모르겠다. 될 듯은 한데.. 아마도 아래 Linux / macOS 간 공유에 설명한 방식대로 하면 되지 않을까?

Linux / macOS 간 공유

일단은, Linux 에서 먼저 짝짓기를 한다. 그리고 macOS 에서도 마찬가지로 짝짓기. 이 순서가 중요한데, 이래야 macOS 정보를 Linux 에 입력할 수가 있다.
이 순서가 바뀌면 Linux 정보를 macOS 에 입력해야 하는데, plist 를 수정해야 하기 때문에 조금 복잡해진다.

macOS 에서 블루투스 정보 얻기

리눅스, 맥, 모두 페어링이 끝났으면, 맥으로 이동하여 다음 정보를 얻는다. (High Sierra 이상)

$ sudo defaults read /private/var/root/Library/Preferences/com.apple.bluetoothd.plist > ~/bt_keys.txt

아치 문서에서는 bluetoothd.plist 에서 LinkKeys 부분만 추출했는데, BT4 라면 그걸로 충분하지만 BT5 일 경우는 그것만으론 정보가 부족하다. 따라서 전체를 출력할 필요가 있다.

LinkKey 만 있는 경우(BT4)

LinkKey 만 있다면 그냥 리눅스끼리 공유할 때 처럼 키만 넣어주면 되지만, 그대로는 아니고 한가지 손을 봐줘야 한다. 리눅스 끼리일 때는 그냥 넣어줬지만, macOS ➙ Linux 라면, 키를 반전(Reverse bytes of a Hexadecimal Number)시켜줘야 한다.

예를 들자면, 키가 ‘e3a4755a……d5ff’ 라면, 이걸 바이트 단위로, ‘ffd5….5a75a4e3’ 식으로 바꿔서 입력해줘야 한다.
그리고 입력시에는 모두 대문자로 넣어줘야 한다.
python 으로 간단하게 구할 수 있다.

key = ' 63 02 84 b8 5d 40 44 df '.upper()
revkey = list(reversed(key.strip().split()))
print("".join(revkey))
DF44405DB8840263

이런 식으로 값을 구한 뒤 넣어주면 된다. 주소는 com.apple.bluetoothd.plist 에 나와있으므로, 동일한 주소(디렉토리)에 있는 info 파일을 편집한다.
BT5 는 페어링때마다 주소값이 바뀌지만, BT4 는 주소가 바뀌지 않는다. (키만 바뀐다.)

vim /var/lib/bluetooth/BT-Adapter-MAC-address/aa:bb:cc:dd:ee:01/info

LinkKey 만 있으면 이런 식으로 간단하지만, LTK 가 있다면 조금 복잡해진다.

LTK 가 있는 경우(BT5)

com.apple.bluetoothd.plist 파일에 있는 정보로 BT5 설정을 시작한다. 필요한 것은 총 네가지. 첫줄에 있는 주소값, 그리고 EDIV, LTK, RAND.

   "aa-bb-cc-dd-ee-01" =             {
                Address = {length = 6, bytes = 0xd507c8c2ed1b};
                AddressType = 1;
                EDIV = {length = 2, bytes = 0xab53};
                IRK = {length = 16, bytes = 0x6d8f1d4b35588bab3d4d33f5130aa6ba};
                LTK = {length = 16, bytes = 0xe10304ce418abcf13daf0c2a816d28f0};
                LTKLength = {length = 1, bytes = 0x10};
                MITMProtection = 0;
                OriginalAddressType = 1;
                RAND = {length = 8, bytes = 0x90b269464457b6ad};
            };

먼저 신경써야 할 부분은 주소다. 위의 경우는 aa-bb-cc-dd-ee-01.

** 주소??
당연히 주소를 바꿔야 한다고 생각해서 바꿔주긴 했는데.. 혹시나, 주소는 바꾸지 않고 LTK/EDIV/RAND 만 넣어줘도 될까?? 안된다는 데 한표.
그렇다고 다시 실험해보긴 싫다. 다음에 이럴 일이 있다면 그 때에나..

리눅스에서 먼저 페어링하고, 그 다음에 macOS 에서 페어링했으므로, 이 주소는 1만큼 차이가 난다. (아닐 수도 있겠지만, 내 경우는 몇번 실험해본 결과 다 그랬다.) 1만큼 차이가 나든 어쨌든, 리눅스에 정의돼 있는 주소를 맥에서 얻어온 주소로 바꿔준다.

예를 들어, 리눅스의 주소는 aa-bb-cc-dd-ee-00 이고, 맥에서 주소는 aa-bb-cc-dd-ee-01 이다. macOS 정보를 Linux 로 가져와야 하므로, 리눅스 주소값을 맥 주소값으로 바꿔줘야 한다.

이 정보는 리눅스에서 /var/lib/bluetooth/BT-Adapter-MAC-address/aa-bb-cc-dd-ee-00 에 저장돼 있다.
이제 여기로 이동하여, 두군데를 고쳐야 한다.

먼저, 디렉토리명을 바꾼다.

mv /var/lib/bluetooth/BT-Adapter-MAC-address/aa:bb:cc:dd:ee:00 /var/lib/bluetooth/BT-Adapter-MAC-address/aa:bb:cc:dd:ee:01

그리고, 여기엔 cache 라는 디렉토리가 있는데, 이 안에 있는 파일명도 바꾼다.

mv /var/lib/bluetooth/BT-Adapter-MAC-address/cache/aa:bb:cc:dd:ee:00 /var/lib/bluetooth/BT-Adapter-MAC-address/cache/aa:bb:cc:dd:ee:01

이제, 드디어 설정파일을 수정해야 한다. 이 파일은 이름 바꾼 디렉토리 안에 있다.

vim /var/lib/bluetooth/BT-Adapter-MAC-address/aa:bb:cc:dd:ee:01/info

입력할 정보는 모두 3개. [LongTermKey] 항목 아래에 있다.

  • LTK : bluetoothd.plist 의 LTK 항목을 그대로 넣되, 모두 대문자로 바꾼다. 위 예라면, E10304CE418ABCF13DAF0C2A816D28F0
  • RAND : bluetoothd.plist 의 RAND 값을 10진수로 변경하여 넣는다. 즉, 90b269464457b6ad 을 10진수로 변경.
  • EDIV : bluetoothd.plist 의 EDIV 값을, 뒤집은 뒤(reverse) 10진수로 변경하여 넣는다. (아래에서 다시 설명)

인터넷에서 찾은 대부분 문서가 MS Windows/macOS 간 설정에만 집중돼 있어서, macOS/Linux 는 그야말로 Brute Force(!)로 풀어낼 수 밖에 없었다. 아무튼..

위에서 bluetoothd.plist 의 EDIV 값은 0x9332 이다. 이걸 reverse 하면 0x3293 이 되고, 이걸 10진수로 변경하면 12947 이 된다. 이 값을 info 에 넣어주면 된다.

설정은 끝.
블루투스 서비스 재실행으로는 성공하지 못했다. 재부팅하니 제대로 작동한다.

뭔가 뿌듯한데?

Author: 아무도안

안녕하세요. 글 남겨주셔서 고맙습니다.