みなさん、こんにちは。
最近、Windowsでの作業時間より、Windows Subsystem for Linux 2 (WSL2) での作業時間が増えてきました。デスクトップアプリもWSLgでWindowsから使うより、XRDPでWSL2のデスクトップ環境にログインして使う方が快適だと感じるようになり、WSL2は私の開発環境の中心となっています。
しかし、WSL2を使う中で、どうしても気になっていたのが、USBデバイスの扱いでした。特に、WebカメラやUSBメモリ、さらにはArduinoなどの開発ボードをWSL2から直接操作できたら、どれだけ便利だろうと考えていました。
外付けUSBハードディスクやUSBメモリについては、Windows側で認識されているドライブをWSL2からアクセスできます。これは非常に便利な方法で、以前こちらの記事でもご紹介しました。
しかし、それ以外のUSBデバイス(例えばWebカメラやArduinoなど)は、この方法では使えません。
そこで他の方法を探していたところ、Microsoft公式でも紹介されている usbipd-win
というツールを発見しました。これをWindows側にインストールして、WSL2にUSBデバイスを「アタッチ」すればよいだけ、というではありませんか!
希望に満ちたスタート – usbipd
の導入
早速、手順通りに usbipd-win
をインストール。
- USBデバイスをWindowsに接続。
- PowerShell(管理者)で
usbipd list
と打ち込み、デバイスのBUSID
を確認。 - 同じくPowerShell(管理者)で
usbipd bind --busid <BUSID>
を実行し、WSL2にデバイスをアタッチ!
ここまでは順調でした。
立ちはだかる「カーネル再構築」の壁
WSL2にデバイスをアタッチした直後、まず試したのは Webカメラ です。lsusb
を実行すると、確かにWebカメラが認識されているではありませんか!「おお、すばらしい!」と感動しました。
しかし、いざWebカメラを使おうと ls -l /dev/video*
を実行してみると、「そのようなファイルまたはディレクトリはありません」という無情なメッセージ。
「なぜだ!?」と調べてみると、どうやらWSL2のデフォルトカーネルには、Webカメラ(USB Video Class: UVC)を扱うためのドライバーが含まれていないとのこと。つまり、usbipd
でデバイスの存在自体はWSL2に伝えられても、それをWebカメラとして認識・利用するためのドライバーが足りない状態だったわけです。
解決策は明確でした。「カーネルの再構築」。
MicrosoftのGitHubリポジトリからWSL2カーネルのソースコードをクローンし、make menuconfig
で必要なモジュール(私の場合は USB Video Class (UVC)
)を有効にして、ビルド。そして、vmlinux
ファイルを .wslconfig
で指定して、WSL2を再起動。
これでWebカメラが使えるようになりました!感動もひとしおです。
次に USBメモリ も試してみようと usbipd bind
でアタッチ。
同じように lsusb
で認識はするものの、またもや /dev/sd*
が見当たらない。そうです、これも同じ理由で、USBストレージデバイス を扱うための usb_storage
モジュールがカーネルに不足していたのです。
またしてもカーネル再構築。USB Mass Storage support
を有効にしてビルドし直したところ、USBメモリも /dev/sde1
として認識され、無事マウントして使えるようになりました。
終わりの見えないアップデートとの戦い
WebカメラもUSBメモリも使えるようになったWSL2環境は、まさに理想郷でした。しかし、この喜びも束の間、ある疑問が頭をよぎりました。
「これ、WSL2がアップデートされたらどうなるんだろう?」
そして、その懸念は的中します。WSL2は、Microsoftによって定期的にアップデートされます。Windows Update経由であったり、wsl --update
コマンドであったり。そのアップデートが行われるたびに、以下のような問題に直面する可能性が高いことが分かりました。
- デフォルトカーネルの更新
.wslconfig
でカスタムカーネルを指定していない場合、WSLのアップデートでデフォルトカーネルが新しくなり、今まで使えていたUSBデバイスが使えなくなる(またカーネル再構築が必要になる)。
- カスタムカーネルの互換性
.wslconfig
でカスタムカーnelを指定していても、WSLの内部的なアーキテクチャが大きく変わると、現在のカスタムカーネルでは起動すらできなくなる可能性があります。その場合、最新のWSLカーネルソースを再度ダウンロードし、一から再構築し直す必要が生じます。
つまり、WSL2で特定のUSBデバイスを使い続ける限り、「WSL2がアップデートされるたびに、カーネル再構築という手間が発生する可能性がある」という現実が目の前に突きつけられたのです。
そして断念へ
WebカメラやUSBメモリのためだけに、WSL2がアップデートされるたびに数時間かけてカーネルをビルドし直す、その労力を考えると、正直、私の「手間を省きたい」というWSL2導入の根本的な目的と矛盾してきます。
もちろん、特定の業務用途でどうしても必要な場合は、その労力を惜しむべきではないでしょう。しかし、私の普段使いにおいては、WebカメラはWindows側で使えば良いし、USBメモリはWindowsに挿してWSL2から mount -t drvfs
でマウントすれば事足ります。
WSL2のUSBデバイス対応は、技術的には素晴らしい試みです。しかし、現状では「カスタムカーネルの継続的なメンテナンス」という壁が高く、私のようなライトユーザーには敷居が高いと感じざるを得ませんでした。
というわけで、私のWSL2は、再びシンプルな環境に戻り、USBデバイスはWindows側で使う、という方針に落ち着きました。
いつか、WSL2のデフォルトカーネルが全ての必要なモジュールを網羅し、ユーザーが手軽にUSBデバイスを利用できる日が来ることを心から願っています。
本日も最後までお読みいただきありがとうございました。
それでは、よいWSLライフを!