📹

【WSL2】Windows 11上の仮想UbuntuOSでUSB Webカメラを認識させる完全ガイド (usbipd-win)

に公開

WSL2は開発者にとって非常に強力なツールですが、ハードウェア(USB Webカメラなど)への直接アクセスはデフォルトで制限されており、ここで躓く方が多いようです。特にOpenCVでの画像処理や物体検出(Object Detection)プロジェクトを行う場合、カメラ接続は必須ですよね。

今回は、WSL2 (Windows Subsystem for Linux 2) 環境での開発における最大の難関の一つ、「USB Webカメラの認識(パススルー)」について解説します。

通常、WSL2からはホスト(Windows)のUSBデバイスに直接アクセスできません。しかし、オープンソースツールの usbipd-win を使用することで、Windows上のWebカメラをWSL2(Ubuntuなど)にパススルーし、あたかもLinuxに直接接続されているかのように扱うことができます。

その手順をステップバイステップでまとめました。

🛠️ 前提条件 (Prerequisites)

作業を始める前に、以下の環境を確認してください。

  • OS: Windows 11 (推奨) または Windows 10 (Build 19044以上)
  • WSL2: インストール済みであること (Ubuntu 20.04/22.04など)
  • Linux Kernel: 5.10.60.1 以上
    • ターミナルで uname -r を入力して確認可能です。

Step 1. Windows側に usbipd-win をインストール

まず、WindowsとWSL間のUSB通信を可能にするツール usbipd-win をインストールします。

  1. PowerShell管理者権限(Administrator)で開きます。
  2. 以下の winget コマンドを入力してインストールします。
## Powershell
winget install --interactive --exact dorssel.usbipd-win


インストールが完了したら、環境変数を適用するためにターミナルを一度閉じてから、再度開いてください。

Step 2. WSL2 (Ubuntu) 側にツールをインストール

次に、Linux (WSL2) 側でもUSB信号を受け取るための準備が必要です。WSL2のターミナルを開き、以下のコマンドを順に実行します。

パッケージリストの更新とツールのインストール

## bash in WSL2
sudo apt update
sudo apt install linux-tools-virtual hwdata

# もしカーネルバージョンが見つからない等のエラーが出る場合は以下を試してください
sudo apt install linux-tools-generic -y

*Tips: linux-tools-virtualは、現在のカーネルバージョンに合ったusbipツールをインストールします。エラーが出る場合は、linux-tools-genericが代替策となります。

Step 3. USBカメラを接続する (最重要ステップ!)

いよいよWindowsに接続されたカメラをWSLにパススルーします。この操作は PowerShell(管理者権限) で行います。

  1. USBデバイスリストの確認
## Powershell
usbipd list


このコマンドを実行すると、PCに接続されているUSBデバイス一覧が表示されます。ここで使用したい Webカメラの名称と、その左側に表示されている BUSID (例: 1-2 や 1-5) をメモしてください。

  1. デバイスのbind (初回のみ)
## Powershell
usbipd bind --busid <カメラのBUSID>
# 例: usbipd bind --busid 1-5

もし対象デバイスの状態(STATE)がNot sharedとなっている場合、共有可能な状態(Shared)にする必要があります。(すでに Shared ならこの手順はスキップ可能です)

*注意: もし通常コマンドでエラーが出る場合は、強制的にバインドするオプションを試してください。usbipd bind --force --busid <カメラのBUSID>

  1. WSL2へデバイスを接続 (Attach)
## Powershell
usbipd attach --wsl --busid <カメラのBUSID>
# 例: usbipd attach --wsl --busid 1-5

実際にデバイスをWSLに接続します。
!重要なポイント: この時点でWSL2のターミナルが起動している(バックグラウンドで動いている)必要があります。!
成功すれば特にメッセージは表示されずコマンドが終了するか、Attachedに関するメッセージが表示されます。

*順序について: WSL2が起動していない状態でattachするとエラーになります。
「WSL2を起動」→「PowerShellでattach」の順序を守ってください。

Step 4. 接続確認とテスト

WSL2 (Ubuntu) のターミナルに戻り、カメラが正しく認識されたか確認しましょう。

  1. USBリストの確認
## bash in WSL2
lsusb

出力リストにWebカメラのメーカー名やモデル名が表示されていれば成功です!

  1. ビデオデバイスの確認
## bash in WSL2
ls -l /dev/video*

/dev/video0/dev/video1のようにビデオノードが生成されていれば、OpenCVなどのプログラムからカメラを利用する準備は完了です。

*注意点: USBカメラをWSL2にattachしている間は、Windows側(Zoomやカメラアプリなど)からはそのカメラを使用できなくなります。 Windowsで再度使いたい場合は、後述するdetach操作が必要です。

➡️ Windowsのカメラアプリを開いたらこんな様子に…。Windowsではカメラを見つけられないらしい。

🎯 活用例: OpenCV Pythonでのテスト

簡単なPythonコードで動作確認をしてみましょう。

## python3
import cv2

# 通常は「/dev/video0」がデフォルトのカメラです
cap = cv2.VideoCapture("/dev/video0")

if not cap.isOpened():
    print("カメラを開けません")
    exit()

while True:
    ret, frame = cap.read()
    if not ret:
        break
    
    cv2.imshow('WSL2 Camera Test', frame)
    
    # 'q' キーで終了
    if cv2.waitKey(1) == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

*補足: cv2.imshowでウィンドウを表示するには、WSLg (Windows 11に標準搭載) が機能しているか、XServerの設定が必要です。

💡 トラブルシューティング

  1. 権限エラー (Permission denied): WSL内で/dev/video0へのアクセス権限がない場合、以下のコマンドで現在のユーザーをvideoグループに追加するのがベストプラクティスです。
## bash in WSL2
sudo usermod -aG video $USER
(設定反映のため、一度WSLを再起動するか再ログインが必要です)

*Tips: 手っ取り早く解決したい場合はsudo chmod 777 /dev/video0も有効です。

  1. 接続が切れる: USBケーブルを抜いたりPCを再起動すると接続は解除されます。その都度、Step 3のattachコマンドを実行してください。

Step 5. 使用後の切断 (Detach)

作業が終わったら、USBデバイスをWindows側に返却(Detach)しておきましょう。

  1. 接続解除 (Detach)
    PowerShell (管理者) で実行します。
## Powershell
usbipd detach --busid <カメラのBUSID>
# 例: usbipd detach -–busid 1-5
  1. bind解除 (Unbind / 必要な場合)
    完全に共有設定を解除したい場合はunbindします。
## Powershell
usbipd unbind --busid <カメラのBUSID>
# 例: usbipd unbind -–busid 1-5

*解説: 上記のように対象デバイス(BUSID 1-5)のSTATEが、Not sharedに戻ったことを確認できる。

おわりに

これでWSL2環境でも自由にUSBカメラを使って、画像収集やモデル推論ができるようになりました。WindowsとLinuxの境界線がどんどんなくなってきて便利ですね。

ぜひ試してみてください!🚀

Discussion