kobar9568のブログ

技術的なメモやその他諸々

ESXi 7.0上のLinuxからUSB赤外線リモコンアドバンスを使った話

忙しい人向け

この記事に倣い、USBアービトレータの設定でADIR01Pのパススルーを許可するように設定し、ブートオプションでADIR01PがVMkernelにHIDデバイスとして認識されることを防ぐことで仮想マシンへパススルー可能となる。
なお、記事では最初に仮想マシンの設定ファイル(vmx)を直接編集してデバイスを追加する手順があるが、ここは不要だった。 vmxを編集していない仮想マシンでも、ESXiに対する設定2つを行えばパススルー設定を行うことが出来た。

概要

ビット・トレード・ワンUSB赤外線リモコンアドバンス ADIR01P(以下 ADIR01P)をESXi 7.0上のLinuxから扱った話。

ADIR01PはUSBインターフェースを持つ学習リモコンで、非公式のUNIX/Linux向けのコマンドラインプログラムであるbto_ir_advanced_cmdが公開されており、これを利用していた。
自宅鯖をESXiに移行するタイミングで、他のデバイスと同じ様にADIR01Pも仮想マシンにパススルーしようとしたのだが、少し面倒な手順を踏む必要があった。

面倒な理由

ESXi Shell(に限らず)でlsusb -vするとわかるのだが、ADIR01PはHIDクラスのキーボードやマウスとして振る舞う様にそれらをInterfaceとして実装しており、ESXiはHIDクラスのデバイスをパススルーすることが出来ない。

f:id:kobar9568:20210217041349p:plain
f:id:kobar9568:20210217041602p:plain
f:id:kobar9568:20210217041615p:plain

USBホストコントローラごと引き渡してみる(失敗)

ESXiで仮想マシンにHIDクラスのデバイスを引き渡したい場合、USBホストコントローラごと引き渡すという手法がよく取られるらしい。
PCIやPCIeのUSB拡張カードでUSBホストコントローラを増設し、PCIeデバイスとしてUSBホストコントローラを仮想マシンにパススルーすることでVMからHIDデバイスを扱える。
VMとしてWindowsを使ってゲーム機を作る人がゲームコントローラやマウス・キーボードを渡す時によく使われる手法らしい。

当初はこれに倣い、Amazonで安かったUSB3.0x4ポートのPCIe x1拡張カードを増設してそこにADIR01Pを挿し、USBホストコントローラごとパススルーした。
しかし実際にこの環境でbto_ir_advanced_cmdを使ってみると赤外線の受信開始と受信停止は出来たものの、データの取得や赤外線パターンの送信を行おうとするとerror -3と関数の戻り値がそのまま表示されるような厄介なエラーになってしまい、ソースをチラッと見たのだがlibusbを通したUSBデバイスとの会話でエラーが出ているようで、私の知識ではよくわからなかった。

仮想マシンからlsusbしてみると22ea:003aのデバイスUSB2.0のハブとして表示されており、ネイティブで繋いだ場合はデバイスの説明に何も表示されないのでその違いが気になった。

ESXiの方で無理矢理なんとかする(成功)

↑の手法はbto_ir_advanced_cmdの情報の少なさと、私がソースを理解してパッチを作れるだけの知識が無いので別の手法を調べたところ、ESXiに認識されつつもパススルーを制限しているHIDデバイスの制限を解除することでパススルーを可能とする手法があった。
安定性面などで推奨されるものでは無さそうだが、一旦これで運用してみることとした。

まずは先程設定したUSBホストコントローラのパススルーを無効に設定し、
基本的にはこの記事の内容でESXi Shellから設定を行い、ホストを再起動。
その後、仮想マシンの設定からUSBデバイスの追加を行うと、無事ADIR01Pが追加できるようになった。
f:id:kobar9568:20210217042738p:plain
仮想マシンを起動して操作を試したが、今度は問題無く赤外線送信を行うことが出来た。また、Dockerからも問題なく扱えた。 暫くこれで運用してみて、様子を見ようと思う。

BitTradeOne 赤外線リモコンアドバンス ADIR01P

BitTradeOne 赤外線リモコンアドバンス ADIR01P

  • 発売日: 2015/08/07
  • メディア: Personal Computers
ちなみにUSB3.0のボードはlspciで見たところ、VIA Technologies, Inc.VL805 USB 3.0 Host Controllerがホストコントローラとして載っていた。 今回は別の手法を取ったが、ESXiで使う用の安いボードとして良さそう。ペリフェラル電源が不要なので取り回しが良い。