💻

LimaでUSBパススルーを使う

2023/10/24に公開

はじめに

LimaはMacでWSLのようなLinux環境を構築するのに便利です。
単なるファイルのやり取りであればディレクトリ共有で十分ですが、ADBなどUSBデバイスと直接通信しなければならない場合にUSBパススルーが必要です。
2023年10月24日現在、Limaは公式にUSBパススルーをサポートしていません。
Limaは内部でQEMUのVMを動かしているので、QEMUの機能を直接利用してUSBパススルーを使用します。
本記事ではVMにAndroid端末をADB接続することをゴールとします。

環境

  • ホストマシン: MacBook Pro M1 Pro
  • ホストOS: macOS Sonoma 14.0
  • Lima: limactl version 0.18.0
  • ゲストOS: Ubuntu 22.04 LTS

方法

1. USBデバイスのベンダIDとプロダクトIDを確認する

下記コマンドでUSBパススルーしたいデバイスのベンダIDとプロダクトIDを取得します。

system_profiler SPUSBDataType

例えば、ファイル転送モードで接続したGoogle Pixel 3の場合はベンダIDが0x18d1、プロダクトIDが0x4ee2です。
USBの接続方式(PTPや充電など)を変更すると、プロダクトIDが変わるので注意してください。
また、充電モードだとVMがAndroid端末を検知しないので気をつけてください。

otsuka@MacBook-Pro ~ % system_profiler SPUSBDataType
USB:

    USB 3.1 Bus:

      Host Controller Driver: AppleT6000USBXHCI

    USB 3.1 Bus:

      Host Controller Driver: AppleT6000USBXHCI

    USB 3.1 Bus:

      Host Controller Driver: AppleT6000USBXHCI

        Pixel 3:

          Product ID: 0x4ee2
          Vendor ID: 0x18d1  (Google Inc.)
          Version: 4.40
          Serial Number: 8CDX1MSU5
          Speed: Up to 480 Mb/s
          Manufacturer: Google
          Location ID: 0x01100000 / 1
          Current Available (mA): 500
          Current Required (mA): 500
          Extra Operating Current (mA): 0

2. QEMUの環境変数を設定する

VMが動作するアーキテクチャによって設定する環境変数が異なります。

x86-64

export QEMU_SYSTEM_X86_64="qemu-system-x86_64 -device qemu-xhci -device usb-host,vendorid=<ベンダID>,productid=<プロダクトID>"

例:

export QEMU_SYSTEM_X86_64="qemu-system-x86_64 -device qemu-xhci -device usb-host,vendorid=0x18d1,productid=0x4ee2"

aarch64

export QEMU_SYSTEM_AARCH64="qemu-system-aarch64 -device qemu-xhci -device usb-host,vendorid=<ベンダID>,productid=<プロダクトID>"

例:

export QEMU_SYSTEM_X86_64="qemu-system-aarch64 -device qemu-xhci -device usb-host,vendorid=0x18d1,productid=0x4ee2"

3. VMを起動する

limactl start ubuntu-lts-x86_64

4. udevルールを追加する

/etc/udev/rules.d/51-android.rulesに下記内容を記載します。
ファイルがない場合は作成します。

SUBSYSTEM=="usb", ATTR{idVendor}=="<ベンダID>", MODE="0666", GROUP="plugdev"

例:

/etc/udev/rules.d/51-android.rules
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", GROUP="plugdev"

ベンダIDに「0x」を付けないように気をつけてください。

5. ADB接続する

otsuka@lima-ubuntu-lts-x8664:/Users/otsuka/lima$ adb devices
List of devices attached
8CDX1MSU5	device

otsuka@lima-ubuntu-lts-x8664:/Users/otsuka/lima$ adb shell pm list packages
package:com.google.android.networkstack.tethering
package:com.amazon.mShop.android.shopping
package:com.google.omadm.trigger
package:com.google.android.carriersetup
package:com.android.cts.priv.ctsshim
...

Discussion