web-dev-qa-db-ja.com

物理USBデバイスLinuxをエミュレートする

いくつかのテストを自動化したいLinuxアプリケーションがあり、その状態は特定のデバイス、つまりUSBデバイス、WLANデバイス、WANデバイス)のステータスに応じて変化するはずです。物理的なUSB、WLAN、WANなどのデバイスを自由に使用できなくなったため、実際に物理的なデバイスを接続したり、オン/オフしたりせずに、このプログラムをテストする方法を見つける必要があります。

私はユーザースペースから制御できる仮想USBデバイスを作成することから始めていますが、これらのフォーラムで同様のトピックを取り上げてプロジェクトに適用することを妨げる知識が根本的に不足しています。ある種の仮想USBドライバーを作成し、それをusbfsではなくユーザーレベルのプログラムと通信させる必要があると感じています。ただし、この仮想ドライバーを作成した場合でも、ユーザースペースからこのデバイスを「プラグイン」して、プログラムをこの特定のドライバーに登録するにはどうすればよいですか。私がやろうとしていることは可能ですか?

13
Matt Dorsett

最良の方法は、USBデバイスになることができるLinuxガジェットドライバーとハードウェアを使用することです。ガジェットドライバを使用すると、コンピュータはあらゆる種類のデバイスになりすますことができます。次に、テスト対象のシステムには、ガジェットボックスへの1本のUSBOTGケーブルがあります。ガジェットボックスに適切なハードウェアがあれば、ケーブルを抜く必要はありません。 「ガジェットボックス」は、Linuxを実行しているデスクトップ/ラップトップ(USB OTGをサポートしている場合)、またはAndroid電話またはRaspberryPi)です。(USBケーブルは吸うことに注意してください。ケーブルが原因でフィットするからといって、USB OTGに正しく配線されているわけではありません。)

適切なUSBOTGハードウェアがあれば、ガジェットボックスはすべてソフトウェアになります。

1)テスト対象のデバイスがOTGをサポートしている場合は、ガジェットボックスがUSBホストになろうとしないことを確認してください。 (その後、テスト対象のデバイスはUSBクライアントになります。)つまり、 usb_storageなどが自動的に読み込まれないようにしてください。

2)そのままの状態で、カーネルはUSBハブ、USBイーサネット、USBシリアルポート、およびUSBスティック用のガジェットをサポートします。ガジェットボックスに適切なモジュールをロードするだけで、「正しく機能」します。たとえば、USBスティックを作成するには、「insmod g_file_storage.ko file=/dev/ram0」のようにします。向こう側はあなたがUSBスティックを差し込んだと思います。

シリアルデバイスの場合、ガジェットは/ dev/USBxで「電話をピックアップ」し、テスト対象のデバイスと通信するユーザースペースコードを実行できます(おそらく4Gモデムなどをエミュレートします)。

製造元がUSBを理解するのが面倒だったため、多くのデバイスは実際には「USBシリアル」です。

3)少し再コンパイルまたは構成するだけで、これらの汎用ガジェットデバイスをさまざまなUSB IDのふりをしたり、さまざまなベンダー文字列を返したりすることができます。これは「実際のハードウェアに対するテスト」と同じではありませんが、少なくともこれらのデバイスの汎用バージョンでテストしています。

4)カーネルにまだ含まれていないデバイスタイプ(WiFiなど)の場合は、自分で使用します。十分な血の汗と涙があれば、独自のガジェットタイプを作成できます。 (理想的には、可能な限りユーザースペースを維持し、カーネル内のパフォーマンスが重要な部分のみを処理します。)

注意:USBを同時に理解して評価することは不可能です。

10

VMWareを使用して仮想環境でアプリケーションをテストできますか?次に、ホストマシン上の任意の仮想デバイスをゲストに「プラグイン」してVM)、その方法でアプリケーションをテストできます。

0
Luger