前回は、カーネルの再コンパイルを行った。今回は、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
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に主なサブコマンドのオプションを示す。
今回のコマンドラインの変更は、従来の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)。
ボリュームラベルが使えない場合には、「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ページなどを参照してほしい。
usbipd-winによるUSBデバイスの接続に関して、4回にわたって解説してきたが、ここで一区切りとしたい。
> Windows Subsystem for Linuxガイド 連載バックナンバー
https://news.mynavi.jp/tag/winsubsystem/