• Windows Subsystem for Linuxガイド 第30回 USBデバイスをWSLで使う - その4

前回は、カーネルの再コンパイルを行った。今回は、WSLのカーネルを差し替えUSB大容量ストレージデバイスとなる開発ボードを接続してみる。なお、前々回に解説したusbipd-winはバージョンアップが行われている。このあたりも合わせて解説したい。原稿執筆時点のWindows 11は、Ver.23H2、OSビルド22631.2861、WSLはVer.2.0.14.0である。

カーネルのコピー

前回作成したカーネルをWin32側(ここではC:\WSL-Kernelと仮定)にコピーする。このとき、ファイル名をvmlinuxから変更しておくと、区別がしやすくなる(同vmlshioda)。

また、WSLを停止し、ユーザーのホームディレクトリにある「.wslconfig」ファイルを編集し、リスト01のようにカーネルファイルのパスを設定する。その後WSLを再起動すれば、カーネルが変更されているはずである。WSLから「uname -a」コマンドでバージョンが更新されていることを確認できる(写真01)。

■リスト01


[wsl2]
kernel=C:\\WSL-Kernel\\vmlshioda
  • 写真01: 前回作成したカーネルは、バージョン文字列を書き換えている。書き換えたカーネルで起動しているかどうかは、uname -aコマンドで確認できる

usbipd-winのアップデート

12月6日にusbipd-win ver.4.0.0が公開された。最新のWSLと組み合わせるには、アップデートしておく必要がある。

なお、Ver.4.0.0からコマンドライン文法が変更になった。具体的には、


usbipd サブコマンド [オプション]

という書式となった。

旧バージョンでは、wslコマンドに続けてサブコマンドを入力し、usbipd本来のコマンドとWSL接続用のコマンドが分離されていた(詳細は前々回の記事参照)。

新バージョン(表01)では、wslコマンドは廃止され、attachサブコマンドでのみ“--wsl”オプションにより接続先がWSLであることを示すようになった。また表02に主なサブコマンドのオプションを示す。

  • ■表01

  • ■表02

今回のコマンドラインの変更は、従来のUSB/IPコマンドとの整合性を図ったもの。このため、USBデバイスは、attachする前にbindコマンドで共有を開始しておく必要がある。bindサブコマンドとそれを解除するunbindサブコマンドの実行には管理者権限が必要だが、bindサブコマンドを一回実行するとunbindコマンドで解除するまで共有状態が続く。PowerShellからは、「Start usbipd "bind -b 1-3" -Verb runas」とする(Startは、Start-Processのエイリアス)。attachサブコマンドなどは、通常権限で実行できる。

具体的な手順としては、


Start usbipd "bind -b <BUSID>" -Verb runas
    WSLを起動
usbipd attach --wsl -b <BUSID>
    USBデバイスをWSL側で利用
usbipd detach -b <BUSID>

となる。bindサブコマンドで“--force”オプションを使わなかった場合、attachするまでは、指定したUSBデバイスはWin32側で利用できる。ただしattachサブコマンドを実行するときには、WSLディストリビューションが起動中でなければならない。なお、WSL側での設定は不要になった。

USB大容量ストレージデバイスの場合、ストレージデバイスのパスを探し、これを使ってマウントを行う必要がある。デバイスパスを探すには、ボリュームラベルを使う方法が最も簡単だ。

USBデバイスを接続したあと、エクスプローラーの表示をみるか、コマンドラインから「Get-Volume [<ドライブ文字>]」で調べる。

WSL側では、「ls -l /dev/disk/by-label」でラベルとデバイスパスの対応を知ることができる(写真02)。

  • 写真02: 接続した開発ボードはBUSIDが“2-3”で、Win32側ではFドライブになっているとする。Win32側でボリュームパスをGet-Volumeコマンドで確認し、WSL側で「ls -l /dev/disk/by-lable」コマンド、あるいは「lsblk -f」コマンドでボリュームラベルを探し、デバイスパス(ここでは/dev/sdd1)を探す

ボリュームラベルが使えない場合には、「ls -l /dev/disk/by-id」の出力から“usb-”を先頭に持つリンクを探しデバイスをみつける。判断ができない場合には、デバイスを着脱して変化のあるデバイスを探す。

Raspberry Pi Picoのファームウェア変更

ここでは、USB大容量ストレージデバイスとなる開発ボード(Raspberry Pi Pico)を使い、開発環境としてthonnyを使いファームウェアを書き換えてみる。

Raspberry Pi Picoは、基板上のボタン(BOOTSEL)を押しながらUSBコネクタを接続すると、ファームウェアの書き換えモード(BOOTSELモード)になる。このとき、Raspberry Pi Picoは、USB大容量ストレージデバイスとなる。なお、ボタンを押さずにUSBコネクタを接続した場合は、USBシリアルデバイスになる。

手順としては、

  1. Raspberry Pi PicoをBOOTSELモードで接続
  2. usbipdで接続(BUSIDは1-2であると仮定)
     usbipd bind -b 1-2
     usbipd attach -w -b 1-2
  3. WSL側のコンソールに移動
  4. Thonnyをインストール
     sudo apt install thonny
  5. マウント先(/mnt/rpico)を作成
     sudo mkdir /mnt/rpico
  6. 接続の確認とデバイスファイルパスの確認
     lsusb
     lsblk -f
     ls -l /dev/disk/by-label
     (ここでデバイスは/dev/sde1だったとする)
  7. マウント
     sudo mount /dev/sde1 /mnt/rpico -o umask=000
  8. Thonnyを起動
     thonny &

という手順で行う。その後、thonny内でファーウェアの書き換えを行う(写真03)。ファームウェアの書き換え方法は、thonnyのWebページなどを参照してほしい。

  • 写真03: usbipd-winで接続したUSB大容量ストレージデバイスのデバイスパスがわかったら、mountコマンドで適当なディレクトリ(ここでは/mnt/rpicoを仮定)にマウントする。Thonnyを起動し、設定でインタプリタを選択する。ダイアログ右下の「Install or Update firmware」をクリックする。表示されたダイアログボックスの「Target device location」にマウントしたパスが表示されたら、インストールボタンでファームウェアのインストールを行う

usbipd-winによるUSBデバイスの接続に関して、4回にわたって解説してきたが、ここで一区切りとしたい。

Windows Subsystem for Linuxガイド 連載バックナンバー
https://news.mynavi.jp/tag/winsubsystem/