WSL2メモ
WSL2からWindows側のIPアドレスを知る
WSL2からWindows上でlocalhost(127.0.0.1)に対してOSCメッセージなどを送っても、Windows側には届かない。コマンドプロンプトでipconfigしてWindowsのIPアドレスを確認し、そのアドレス宛に送ればWindows側で受信することは出来る。が、毎回調べるのはメンドクサイ・・・と思って他の手を調べていたら、/etc/resolv.confにWindows側のIPアドレスが保持されているので、.zshrcに
code: zshrc
export WINHOST=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}')
とかいて、localhostの代わりにこのWINHOSTを使うようにすればOK。
※このアドレスを/etc/hostsに追記するという手もあるようだが、WSL2が再起動する度に書き直す必要がある。
USBシリアルするための流れ
管理者権限で起動したPowerShellなどから下記を実行する
code: pwsh
usbipd wsl list (Winに接続されているUSBデバイスの中から接続したいUSBシリアルのBUSIDを確認する)
usbipd wsl attach --busid=X-X (WSLが動いている状態で叩くとWinから切断され、WSLに接続される)
usbipd wsl detach --busid=X-X (作業が終わったらWSLから切断して、Winに戻す)
WSL2側でデバイスが認識されているか確認しつつ、screenで接続する
code: screen
ls /dev/tty* (/dev/ttyUSB0や/dev/ttyACM0が見えたらOK)
sudo chmod 777 /dev/ttyUSB0
sudo screen /dev/ttyUSB0 115200 (ボーレートの値はデバイスに合わせる)
runas.exeでコマンドラインでexeに管理者権限を付ける
Windows11 HomeでビルトインAdministratorを有効化する
code: enable builtin-administrator
net user administrator /active:yes
net user administrator * (このあとパスワードを2回入力)
usbipd-winのインストール
※update-alternativesはカーネルがアップデートする度に実行する。
code: install usbipd-win
sudo apt update
sudo apt install linux-tools-vertual hwdata
sudo update-alternatives --install /ussr/local/bin/usbip usbip /usr/lib/linux-tools/5.15.0-73-generic/usbip 20
WSL2からUSBシリアルデバイスを使えるようにする。管理者権限で立ち上げたcmd.exe or pwsh.exe上で実行する。
code: usbipd
usbipd wsl list // 接続したいデバイスのBUSIDを確認する
usbipd wsl attach --busid=X-X // 上で確認したBUSIDを入れる
ESP32への書き込み注意点
上記の方法でM5StackやESPr DeveloperボードなどESP32系のモジュールを搭載したボードにWSL2からアクセスできる。ただし、ボードのUSBが
ESP32モジュールから直で繋がっている(/dev/ttyACM0とかになる)
ESP32モジュールからいったんUSBシリアルIC(CP2012など)を介して繋がっている(/dev/ttyUSB0とかになる)
かで少し状況が異なる。USBシリアルICが載っているボードの場合は特に問題無く利用可能。問題は直で繋がっている場合で、そのままだと、espflashでボードに接続しようとしたときに内部で呼ばれているget_serial_port_info()でポート情報を取得したときにSerialPortTypeがUnknownとなり、USBのVIDとPIDがともに0が代入されてしまい、処理が途中で止まってしまう。
スマートな方法では無いが、このForkで接続処理時のVIDとPIDの判定処理をスルーして書き込みやデバッグが可能になる。 正直、本家でちゃんと対応してもらいたい・・・。
exFATでフォーマットされた外付けSSDをマウントできるようにする
WSL2だとデフォのままだとexFATのボリュームをマウント出来ずunknown filesystem type exfatとなってしまう。と言う訳で、カーネルの再構築を行う。
code: kernel build
cd WSL2-Linux-Kernel
vim Microsoft/config-wsl (CONFIG_EXFAT_FS=y, CONFIG_EXFAT_DEFAULT_IOCHARSET="utf8"を追記する)
make KCONFIG_CONFIG=./Microsoft/config-wsl
sudo make modules_install
cp vmlinux /mnt/c/Users/XXXX/ (XXXXはユーザー名、vmlinuxの置き場はどこでも良い)
cd /mnt/c/Users/XXXX/
vim .wslconfig (wsl2\n kernel=C:\\Users\\XXXX\\vmlinuxな感じ) これで、Powershellなどからwsl --shutdownとしてWSLを再起動すれば、カスタムカーネルでWSLが起動する。
code: exfat
sudo apt update
sudo apt install exfat-fuse exfatprogs
これでWSLからexFATなボリュームをマウントする準備が整ったので
code: pwsh as Administrator
GET-CimInstance -query "SELECT * from Win32_DiskDrive" (外付けSSDのDeviecIDを確認)
wsl --mount -t exfat \\.\PHYSICALDRIVE1 --bare (PHYSICALDRIVE1は上のコマンドで確認した外付けSSDのDeviceIDに変える)
最後にWSLからマウントしてあげる。
code: mount exfat volume
lsblk (パーティションとか確認)
sudo mount /dev/sdd1 /mnt/d (sdd1はlsblkで確認した名前に変える。マウント先のディレクトリはお好きに)