前回は、カーネルの再コンパイルを行った。今回は、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 " -Verb runas

WSLを起動

usbipd attach --wsl -b

USBデバイスをWSL側で利用

usbipd detach -b

となる。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シリアルデバイスになる。

手順としては、

Raspberry Pi PicoをBOOTSELモードで接続

usbipdで接続(BUSIDは1-2であると仮定) usbipd bind -b 1-2 usbipd attach -w -b 1-2

WSL側のコンソールに移動

Thonnyをインストール sudo apt install thonny

マウント先(/mnt/rpico)を作成 sudo mkdir /mnt/rpico

接続の確認とデバイスファイルパスの確認 lsusb lsblk -f ls -l /dev/disk/by-label (ここでデバイスは/dev/sde1だったとする)

マウント sudo mount /dev/sde1 /mnt/rpico -o umask=000

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/