ラズパイに USB 接続した同一デバイスを判別できるようにする【その１ーシリアル】

# はじめに
今回はラズベリーパイに USB 接続するデバイスの任意の表示名を設定して判別しやすくします。
通常だと ttyUSB* のみですが、SerialCable1 のような任意の名称が設定できます。

# 作業環境
・Raspberry Pi 3B
・Raspberry Pi OS Lite Legacy (buster)
・FT232RL × 2台（同一デバイス）

ラズベリーパイの基本的なセットアップは完了しているものとします。

# [手順1] USB デバイスを接続した際の変化を確認する
まず未接続の状態で dev ディレクトリを見てみます。

```bash
ls /dev
```
 FT232RL 未接続時
![/dev.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1174732/73edfd23-1878-e881-51e3-96d9d5f894e0.png)

↓ 1台目の FT232RL を接続。ttyUSB0 を確認
![USB0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1174732/bb00b9bf-b358-8db4-2b40-da4192318e31.png)
↓ 2台目の FT232RL を接続。ttyUSB1 の追加を確認
![USB1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1174732/03d22a72-ef57-59be-5f89-4dc0846dc54e.png)
デバイスを接続すると dev ディレクトリにデバイスファイルが追加されます。

# [手順2] 接続デバイスの固有情報を確認する
デバイスの固有情報を確認するために以下コマンドを実行してください。
```bash
udevadm info -q all -n /dev/ttyUSB0
```
ttyUSB0 の部分は参照したいデバイスファイル名にしてください。

コマンドを実行すると以下のように表示されます。
実行例：Sandisk USB フラッシュメモリを接続した場合
```bash
pi@raspberrypi:~$ udevadm info -q all -n /dev/sda
P: /devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2/1-1.2:1.0/host0/target0:0:0/0:0:0:0/block/sda
N: sda
L: 0
S: disk/by-path/platform-3f980000.usb-usb-0:1.2:1.0-scsi-0:0:0:0
S: disk/by-id/usb-SanDisk_Ultra_Fit_4C530000021118120214-0:0
S: disk/by-uuid/e1d2d53c-ba70-402f-820c-27162be4a94c
E: DEVPATH=/devices/platform/soc/3f980000.usb/usb1/1-1/1-1.2/1-1.2:1.0/host0/target0:0:0/0:0:0:0/block/sda
E: DEVNAME=/dev/sda
E: DEVTYPE=disk
E: MAJOR=8
E: MINOR=0
E: SUBSYSTEM=block
E: USEC_INITIALIZED=610442091
E: ID_VENDOR=SanDisk
E: ID_VENDOR_ENC=SanDisk\x20
E: ID_VENDOR_ID=0781
E: ID_MODEL=Ultra_Fit
E: ID_MODEL_ENC=Ultra\x20Fit\x20\x20\x20\x20\x20\x20\x20
E: ID_MODEL_ID=5583
E: ID_REVISION=1.00
E: ID_SERIAL=SanDisk_Ultra_Fit_4C530000021118120214-0:0
E: ID_SERIAL_SHORT=4C530000021118120214
E: ID_TYPE=disk
E: ID_INSTANCE=0:0
E: ID_BUS=usb
E: ID_USB_INTERFACES=:080650:
E: ID_USB_INTERFACE_NUM=00
E: ID_USB_DRIVER=usb-storage
E: ID_PATH=platform-3f980000.usb-usb-0:1.2:1.0-scsi-0:0:0:0
E: ID_PATH_TAG=platform-3f980000_usb-usb-0_1_2_1_0-scsi-0_0_0_0
E: ID_FS_UUID=e1d2d53c-ba70-402f-820c-27162be4a94c
E: ID_FS_UUID_ENC=e1d2d53c-ba70-402f-820c-27162be4a94c
E: ID_FS_VERSION=1.0
E: ID_FS_TYPE=ext4
E: ID_FS_USAGE=filesystem
E: DEVLINKS=/dev/disk/by-path/platform-3f980000.usb-usb-0:1.2:1.0-scsi-0:0:0:0 /dev/disk/by-id/usb-SanDisk_Ultra_Fit_4C530000021118120214-0:0 /dev/disk/by-uuid/e1d2d53c-ba70-402f-820c-27162be4a94c
E: TAGS=:systemd:
E: CURRENT_TAGS=:systemd:

pi@raspberrypi:~$
```
後ほど、SUBSYSTEM , ID_SERIAL_SHORT の値を使用するので値をメモしておいてください。
上の実行例だと " block "（SUBSYSTEM）、" 4C530000021118120214 "（ID_SERIAL_SHORT） となります。

# [手順3] udev ルールファイルを作成する
任意の名称を設定するために udev のルールファイルを作成します。
udev の詳細は [こちら](https://www.freedesktop.org/software/systemd/man/udev.html#Description)

今回はデバイス固有情報の SUBSYSTEM , ID_SERIAL_SHORT の2つの値を使用します。
ルールファイルは /etc/udev/rules.d に格納します。

下記コマンドを実行して rules ファイルを作成します。
```bash
sudo nano /etc/udev/rules.d/99-usb-serial.rules
```
今回は既存のファイルと被らないように、" 99-" で作成しました。

ルールファイルはファイル名の辞書順に実行されるので処理順序が重要な場合はファイル命名に気をつけてください。

以下を 99-usb-serial.rules に記述して保存します。
SYMLINK : 任意の名称を記述する
MODE : パーミッション設定 ※MODE の詳細は [こちら](https://www.freedesktop.org/software/systemd/man/udev.html#OWNER,%20GROUP,%20MODE)
```
SUBSYSTEM=="tty",ENV{ID_SERIAL_SHORT}=="先ほど調べた[ID_SERIAL_SHORT]の値",SYMLINK+="USB-test1",MODE="0666"
```
# [手順4] ルールファイルが適用されているか確認する
以下コマンドでルールファイルを再読み込みします。
```bash
sudo udevadm trigger
```
または
```bash
sudo /etc/init.d/udev reload
```
再読み込み後、デバイスファイル名が SYMLINK で指定した値となります。
※表示されない場合はラズベリーパイを再起動してみてください
![test1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1174732/e9aaedd9-cf5e-5126-3e15-1773d8088e0c.png)

同様にもう一方のデバイスのルールファイルも作成します。99-usb-serial.rules に追記します。
追記後に再読み込みすると以下のようになります。
![test2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1174732/1845fc8c-0aab-8c2e-a066-3b4ad0bc8d15.png)
このように任意の名称を付けることができました。
作業中のデバイスが一目でわかります。

# [まとめ]
・udevのルールファイルを作成することで作業中のデバイスが判別しやすくなります。
・今回はキーにシリアル番号（ID_SERIAL_SHORT）を使いましたが、作業環境によって使用するキーを変えるとより使い勝手がよくなります。
　例えば、ID_PATH_TAG をキーとして使うと、USB ポートで指定してデバイスを特定できます。（[その2](https://qiita.com/kiyonaga/items/08408b1e4020b0694711)で紹介）
・そのほかにも、特定のデバイスを接続したときにスクリプトを実行する等の様々なルール設定が可能です。