Macに接続するUSB機器と通信するプログラムを開発するときに、OSのバージョンによってコードやバイナリが異なるときにデバッグ環境をどうするかというお話しです。
デバッグ環境の用意
OSのバージョンによってデバイスと通信する方法が異なることがあります。macOS 11 Big Sur未満であれば、KEXT (Kernel Extension) をシステムにインストールするが、macOS 11 Big Sur以降はDEXT (DriverKit Extension)を使うというケースや、macOS 10.11未満の対応をまだ行っているという場合には、古いバージョンの環境でビルドしたKEXTが必要というケースもあります。
これらのデバッグ環境を用意する方法には次のような方法があります。
- 一つのマシンに複数のOSをインストールしてブート時に切り替える
- 複数のマシンを用意して、それぞれ別々のOSをインストールして、マシンを切り替える
- 仮想マシンを使って複数のOSを仮想化して使用する
ブート時に切り替える方法
複数のOSをインストールして切り替える方法は、まず、候補に挙がる方法でしょう。
そのマシンが対応しているOSに限定はされますが、若干、古いマシンを用意すれば困らないでしょう。macOS 10.13 HighSierra以降は起動ディスクにAPFSが選択できるので、ボリュームを増やす・減らすも簡単ですし、ディスクの空き容量を効率的に使用できます。
デメリットはデバッグ対象を切り替えるために、マシンの再起動を伴うので効率が悪いことです。
複数のマシンを使い分ける方法
この方法も最初の方法と並んで候補に挙がる方法でしょう。通信相手のデバイスも複数用意できれば、効率良くデバッグすることができます。
デメリットはマシンを複数使用するので、物理的なスペースが多く必要になることです。また、対象デバイスを抜き差ししてマシンのところまで移動するという手間が、細かくデバッグするときには少し面倒になるところです。
仮想マシンを使う方法
私がよく使う方法は仮想マシンを使う方法です。複数のバージョンのOSを全て仮想化しておき、仮想マシンにUSB機器を接続します。
物理的なマシンは1台で間に合うので、物理的なスペースも少なくても間に合います。通信対象のデバイスも1台で間に合います。
複数の仮想マシンを同時に起動しておけば、複数のOSで動作を確認するときも素早くOSを切り替えられます。
デメリットは、あくまで仮想マシンなので、デバッグには使えても、最終的なテストにするには若干不安があることです。また、USB機器の仮想化(というよりも仮想マシンからダイレクトに通信できるか)の性能も仮想化ソフトに依存してしまうところです。
仮想化ソフトはどれが良いか?
macOSでmacOSをゲストOSとして仮想化できるソフトはOSSから商用まで含めて複数あります。どれが良いかというのは判断基準が使用目的によって異なるので難しいところです。
USB通信プログラムのデバッグという目的であれば、私はParalleles Desktopがこの記事執筆時点では最も優れいていると思います。
私は以下の接続方法に対応したプログラムの開発経験がありますが、Parallels Desktopではどちらも仮想マシンの中で実機と同様に動作しました。
- MSC (Mass Storage Class) デバイス
- MTP/PTP デバイス
他社の商用の仮想化ソフトではMSCデバイスは動いても、MTP/PTPデバイスは認識もされないという動作でした。
Parallels Desktopも古いバージョンではMTP/PTPデバイスを認識しなかったのですが、Parallels Desktop 17時点では問題なく動きます。14くらいのときには動いていたように思いますが、記憶が定かではありません。できるだけ新しいものを使った方が良いでしょう。
Apple Silicon版は?
残念なことに、本記事を執筆している時点(2022年1月4日。Parallels Desktop 17.1)ではApple Silicon版のゲストmacOSにはUSB機器を接続できません。今後に期待です。