hnwの日記

マルチブート環境の全OSで同じBluetoothデバイスを使う

マルチブート環境(デュアルブート・トリプルブートなど)でBluetoothバイスを使う際の話題です。


Bluetoothバイスを利用する際は通常「ペアリング」という作業が必要です。これは、初回接続時に128bitのリンクキーを発行して両者で共有し、通信相手のBDアドレスに紐付けておく仕組みです。これにより、次回接続時は同じリンクキーを使ってお互いを認証することができますから、面倒な手続きなしに利用することができます。


ところで、この仕組みはマルチブート環境ではうまく働きません。マルチブート環境ではそれぞれのOSが同じBluetoothアダプタを共有するため、Bluetoothバイスからは各OSを区別できないのです。


もう少し具体的に説明します。マルチブート環境で1つのOSからデバイスをペアリングしたあとで別のOSを起動した状況を考えてみましょう。このとき、デバイス側から見るとペアリングが済んでいるはずのBDアドレスなのに、OS側ではペアリングしていないためリンクキーがわかりません。再ペアリングをすれば新たなリンクキーが発行されて接続できるようになりますが、今度は最初のOSがリンクキーを共有していない状況になってしまいます。別のOSを起動するたびに毎回ペアリングすれば使えるものの、これではせっかくのBluetoothの利便性が台無しです。


これを解決するには、OSの管理しているリンクキーの情報を書き換えてやるしかありません。本稿ではMacOSXWindowsLinuxのトリプルブート環境でリンクキーを揃える方法を紹介します。


この内容はApple Support Communitiesの「Dual pairing in OS X and Windows」がベースになっていますが、僕は正解にたどり着くのに苦労したのでまとめ直してみました。

Macのマルチブート環境

Macに他のOSをインストールするということではBoot Campが有名ですね。本稿の情報はそうしたMacOSXWindowsデュアルブート環境でも活用できるかと思います。


ちなみに僕はBoot Campを使わずにMacBook Air(2010 Late)にMacOSX 10.9、Windows 7(32bit)、Ubuntu 14.04LTS(64bit)の3つをインストールしています*1。先日SSDを256GBに換装したので試しにインストールしてみたのですが、思ったより実用的だと感じています。


今回の作業で、これら3つのOSすべてで同じNexus5経由のBluetoothテザリングができるようになりました。

BDアドレスを調べておく

作業の前に、Bluetoothバイスに固有のIDであるBDアドレスを確認しておきましょう。


MacOSXBluetoothバイスのペアリングを行った上で、「このMacについて」「詳しい情報」「システムレポート」「ハードウェア」「Bluetooth」からペアリング済みデバイスのBDアドレスを調べることができます。これをメモっておきましょう。

MacOSXからリンクキーを読み出す

以降、リンクキーを揃える具体的な方法を説明していきます。概要としては、MacOSXでペアリングして、そのリンクキーを他OSにコピーするような流れになります。


では、さっそく手順を紹介していきます。

  • MacOSX以外のOSでBluetoothバイスのペアリングを済ませておく
  • MacOSXでペアリングする(以降、他OSではペアリングしない)
  • 次のコマンドでリンクキーを取り出す
$ sudo defaults read /private/var/root/Library/Preferences/blued.plist


このコマンドを打つと次のような出力が得られます。

{
    LinkKeys =     {
        "00-00-5e-00-53-11" =         {
            "00-00-5e-00-53-aa" = <98542ff9 88e19449 475250e1 3943255b>;
        };
    };
}


最初の6つのオクテットがMacBluetoothアダプタのBDアドレスです。次の行にペアリングしたBluetoothバイスのBDアドレスとリンクキーの組が表示されています。


これをいったんテキストファイルなどに保存しましょう。ただし、この情報が漏れてしまうとセキュリティ上のリスクになりますので、取り扱いには十分注意してください*2

リンクキーのバイトオーダーを変える

MacOSXで取り出したリンクキーはWindowsとは逆順になっています。そこで、16進文字列を2文字(=1バイト)ずつ逆順に取り出した文字列も作っておきましょう。具体的には次のようになります。

98542ff9 88e19449 475250e1 3943255b (MacOSXでの表示)
5B254339 E1505247 4994E188 F92F5498 (Windowsで入力する内容)


これを改めてテキストファイルに保存し、Windowsでの作業時に見える状態にしておきます。

Windowsのリンクキーを書き換える

Windows上での作業は多少下準備が必要です。また、Windowsのバージョンによって多少内容が変わるかもしれません。

  • PsExecをダウンロード・展開しておく
  • 「コントロール パネル」「システムとセキュリティ」「アクションセンター」「ユーザーアカウント制御の設定」を開き、「通知しない」設定にする
    • それまで他の設定になっていた場合、OSを再起動する
  • PowerShellなりcmd.exeなりを利用して、PsExec.exeがあるディレクトリまで移動する
  • 「.\psexec -s -i regedit」でレジストリエディタを起動
  • HKEY_LOCAL_MACHINE\System\CurrentControlSet\services\BTHPORT\Parameters\Keys\ を開く
  • キー名がBDアドレスになっているREG_BINARY型の値がリンクキーなので、書き換える
    • 先ほどのテキストファイルを見ながら16バイトを打ち込む
  • 必要であれば、「ユーザーアカウント制御の設定」を元に戻してから再起動する


ここで書き換えるレジストリ情報は通常の方法で閲覧・編集できないため、PsExecを利用しているようです。このあたりは僕もよくわかっていません。

Ubuntuのリンクキーを書き換える

Ubuntuのリンクキーはテキストファイルに16進文字列で書かれていますので、これを編集するだけです。

$ sudo vi /var/lib/bluetooth/00:00:5E:00:53:11/linkkeys
$ sudo cat /var/lib/bluetooth/00:00:5E:00:53:11/linkkeys
00:00:5E:00:53:AA 5B254339E15052474994E188F92F5498 5 0
$


複数デバイスでペアリングしている場合はファイルが複数行になっていますので、適切な行のみ編集してください。1カラム目がBDアドレス、2カラム目がリンクキー(Windowsと同じ順序)です。残りの2カラムが何なのかわかりませんが、おそらく変更の必要は無いでしょう。

補足など

念のため補足しておくと、マルチブート環境の構築はマゾい作業なので普通の人にはオススメしません。良いMacやPCを買ってバーチャルマシンで他OSを動かす方がトータルで考えれば安い気がします。

*1:興味がある方は「refind macbook」などのキーワードでググってください

*2:ここで例示しているBDアドレス・リンクキーは実際の値ではありません、念のため