WSLでUSB認識をしよう

# この記事で結局使うコマンド
```powershell:powershell:administrator
#wsl起動済み
usbipd wsl attach --busid 2-1
```
```bash:WSL
sudo chmod 777 /dev/ttyACM0
```

# この記事の主題
- WSLでUSBを認識するための手順
- WSLがうまくいかなくなった場合の処置

# 環境
windows11 22H2
WSL2

最近はWSLのインストールもずいぶん簡単になり、powershellで`wsl --install`するだけでできるようになりました。Microsoft StoreでUbuntuをインストールしても同じ動作をするようです。

# USBを認識させる手順
https://learn.microsoft.com/ja-jp/windows/wsl/connect-usb

上記ページを参照してください。以下に簡単に解釈、要約したものを書きます。
まずwindowsにusbipdをインストールします。
```powershell:powershell
winget install --interactive --exact dorssel.usbipd-win
```

その後WSLにusbipdの設定をしてあげます。ここで`Unable to locate`とか出た人は[とにかく動かないWSL-Ubuntuをどうにかする](#とにかく動かないwsl-ubuntuをどうにかする)を参照してください。僕はここでエラーが出ました。
```bash:WSL
sudo apt update
sudo apt upgrade
sudo apt install linux-tools-5.4.0-77-generic hwdata
sudo update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-tools/5.4.0-77-generic/usbip 20
```

そうしたら、powershellの方からUSBデバイスの接続をしてあげましょう。powershellを管理者モードで開きます。現在接続されているUSBデバイスをまず確認します。
```powershell:powershell:administrator
usbipd wsl list
```
以下のようにデバイスの一覧が表示されます。
```:レスポンス
BUSID  VID:PID    DEVICE                                                        STATE
2-1    2341:0043  Arduino Uno (COM5)                                            Not attached
2-5    13d3:56eb  USB2.0 HD UVC WebCam, USB2.0 IR UVC WebCam, Camera DFU De...  Not attached
2-10   8087:0026  インテル(R) ワイヤレス Bluetooth(R)                           Not attached
```

今回はArduino Uno (COM5) というデバイスをWSLに認識させます。このデバイスのBUSIDである`2-1`を使います。
```powershell:powershell:administrator
usbipd wsl attach --busid 2-1
```
これで接続が完了しました。確認してみましょう。

```bash:WSL
lsusb
```
```:レスポンス
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 003: ID 2341:0043 Arduino SA Uno R3 (CDC ACM)
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```
二番目に認識されているようです。
更に確認をします。
```bash:WSL
dmesg | grep tty
```
```:レスポンス
[    9.861989] cdc_acm 1-1:1.0: ttyACM0: USB ACM device
```
これでWSL上でttyACM0として認識されていることがわかりました。
アクセス権限も与えておきましょう。
```bash:WSL
sudo chmod 777 /dev/ttyACM0
```
これでデバイスが扱えるようになりました。切断時は
```bash:WSL
usbipd wsl detach --busid 2-1
```
を実行してくださいね。

# とにかく動かないWSL-Ubuntuをどうにかする
さて、ここまででWSL-Ubuntuが動かなくなった人には2つの救済策があります。
1. WSL-Ubuntuをリセットする
1. 別のdistributionをセットする

まず簡単な1からやってみます。
`設定>アプリ>インストールされているアプリ>Ubuntu` を開き、詳細オプション内の`リセット`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2034739/0753938e-1dc7-5603-362c-f421a50a0259.png)

これで修復できれば万々歳です。

それでも何かしらの不具合がある場合は2の別のdistributionをセットするをやってみましょう。
```powershell:powershell
wsl --install
```
を実行すると、
```
Linux 用 Windows サブシステムは既にインストールされています。
インストールできる有効なディストリビューションの一覧を次に示します。
'wsl.exe --install <Distro>' を使用してインストールします。

NAME               FRIENDLY NAME
Ubuntu             Ubuntu
Debian             Debian GNU/Linux
kali-linux         Kali Linux Rolling
SLES-12            SUSE Linux Enterprise Server v12
SLES-15            SUSE Linux Enterprise Server v15
Ubuntu-18.04       Ubuntu 18.04 LTS
Ubuntu-20.04       Ubuntu 20.04 LTS
OracleLinux_8_5    Oracle Linux 8.5
OracleLinux_7_9    Oracle Linux 7.9
```
と返ってくると思います。このNAMEにあるものがインストールできるdistoributionです。`wsl --install`コマンドでは、デフォルトで`Ubuntu`がインストールされます。なのでここでは`Ubuntu-20.04`をインストールしてみましょう。
```powershell:powershell
wsl.exe --install Ubuntu-20.04
```
最初にUbuntuをインストールしたときと同様、`UNIX username`と`password`の設定を済ませます。
```powershell:powershell
wsl --list
```
を実行すると現在インストールされているdistoributionが表示されます。
```
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu (既定)
docker-desktop-data
Ubuntu-20.04
docker-desktop
```
`Ubuntu`と`Ubuntu-20.04`が確認でき、現在`Ubuntu`が既定となっています。
では`Ubuntu-20.04`を既定に設定しましょう。
```powershell:powershell
wsl --set-default Ubuntu-20.04
```
最後に`wsl --list`で変更を確認しましょう
```
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu-20.04 (既定)
docker-desktop-data
docker-desktop
Ubuntu
```
既定のdistoributionが変わっています。これで完了です。