イイ感じのシリアルコンソールサーバーを作る

Yak Shaving 感がすごいですが、モチベーションとしては今 CCIE R&S の勉強をしてて、毎回自分のマシンにUSBつなぐの非常につらかった（なるべくワイヤに縛られたくない、マシン変わっても変わらない操作感がほしい）ので SSH して `cu` コマンドなり `screen` コマンドで繋げばいい自作のコンソールサーバーもどきを作りました。

シリアルコンソールサーバーまともに買うと数万とかして高いですからね。KANE GA NAI
手元にあるやつだけで完結したい。

これで簡単なプライベートレンタルラックができますね。

必要なもの
-------------------

1. シスコの中古の実機いっぱい
1. USBコンソールケーブルいっぱい
  - [Amazon | 【CISCO互換ケーブル】FTDI chipset USB RJ45 コンソールケーブル | | シリアルケーブル 通販](https://www.amazon.co.jp/dp/B00JPFOTOY)
1. たくさん指せるUSBハブ
1. サーバー用にする廃棄寸前のラップトップ
1. Ubuntu 17.10 Desktop or Server

達成すること
-----------------------

1. USB コンソールケーブルを別のハブのポートに挿しても同じデバイス名で解決させる（Macの用な感じに /dev/tty.usbserial-AI038TTH 出てほしい）
1. シリアルコンソールなので一般ユーザでも tty デバイスに読み書きできるようにしたい。

結論だけ知りたい方は最後を参照。

Yak Shaving
---------------------------

```
sudo udevadm info -q path -n /dev/ttyUSB2
```

```
wnoguchi@serial:~$ ls /dev/ttyUSB*
/dev/ttyUSB0  /dev/ttyUSB2  /dev/ttyUSB4  /dev/ttyUSB6  /dev/ttyUSB8
/dev/ttyUSB1  /dev/ttyUSB3  /dev/ttyUSB5  /dev/ttyUSB7  /dev/ttyUSB9
```

```
wnoguchi@serial:~$ udevadm info -q path -n /dev/ttyUSB2
/devices/pci0000:00/0000:00:10.0/usb3/3-2/3-2.4/3-2.4.1/3-2.4.1:1.0/ttyUSB2/tty/ttyUSB2
```

```
wnoguchi@serial:~$ udevadm info -q path -n /dev/ttyUSB2
/devices/pci0000:00/0000:00:10.0/usb3/3-1/3-1.4/3-1.4.1/3-1.4.1:1.0/ttyUSB2/tty/ttyUSB2
```

```
wnoguchi@serial:~$ udevadm info --name=/dev/ttyUSB2 --attribute-walk | less
  looking at parent device '/devices/pci0000:00/0000:00:10.0/usb3/3-1/3-1.4/3-1.4.1':
    KERNELS=="3-1.4.1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{authorized}=="1"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bDeviceClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bMaxPacketSize0}=="8"
    ATTRS{bMaxPower}=="90mA"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bcdDevice}=="0600"
    ATTRS{bmAttributes}=="a0"
    ATTRS{busnum}=="3"
    ATTRS{configuration}==""
    ATTRS{devnum}=="25"
    ATTRS{devpath}=="1.4.1"
    ATTRS{idProduct}=="6001"
    ATTRS{idVendor}=="0403"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="FTDI"
    ATTRS{maxchild}=="0"
    ATTRS{product}=="FT232R USB UART"
    ATTRS{quirks}=="0x0"
    ATTRS{removable}=="unknown"
    ATTRS{serial}=="AI038TTH"
    ATTRS{speed}=="12"
    ATTRS{urbnum}=="15"
    ATTRS{version}==" 2.00"
```

```
wnoguchi@serial:~$ udevadm info -q path -n /dev/ttyUSB2
/devices/pci0000:00/0000:00:10.0/usb3/3-2/3-2.4/3-2.4.1/3-2.4.1:1.0/ttyUSB2/tty/ttyUSB2
```

```
wnoguchi@serial:~$ udevadm info --name=/dev/ttyUSB2 --attribute-walk | less

  looking at parent device '/devices/pci0000:00/0000:00:10.0/usb3/3-2/3-2.4/3-2.4.1':
    KERNELS=="3-2.4.1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{authorized}=="1"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bDeviceClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bMaxPacketSize0}=="8"
    ATTRS{bMaxPower}=="90mA"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bcdDevice}=="0600"
    ATTRS{bmAttributes}=="a0"
    ATTRS{busnum}=="3"
    ATTRS{configuration}==""
    ATTRS{devnum}=="41"
    ATTRS{devpath}=="2.4.1"
    ATTRS{idProduct}=="6001"
    ATTRS{idVendor}=="0403"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="FTDI"
    ATTRS{maxchild}=="0"
    ATTRS{product}=="FT232R USB UART"
    ATTRS{quirks}=="0x0"
    ATTRS{removable}=="unknown"
    ATTRS{serial}=="AI038TTH"
    ATTRS{speed}=="12"
    ATTRS{urbnum}=="15"
    ATTRS{version}==" 2.00"
```

ハブを経由せずに直接つなぐ

```
wnoguchi@serial:~$ ls /dev/ttyUSB*
/dev/ttyUSB0
```

```
wnoguchi@serial:~$ ls /dev/ttyUSB*
/dev/ttyUSB0
wnoguchi@serial:~$ udevadm info -q path -n /dev/ttyUSB0
/devices/pci0000:00/0000:00:10.0/usb3/3-2/3-2:1.0/ttyUSB0/tty/ttyUSB0

  looking at parent device '/devices/pci0000:00/0000:00:10.0/usb3/3-2':
    KERNELS=="3-2"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{authorized}=="1"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bDeviceClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bMaxPacketSize0}=="8"
    ATTRS{bMaxPower}=="90mA"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bcdDevice}=="0600"
    ATTRS{bmAttributes}=="a0"
    ATTRS{busnum}=="3"
    ATTRS{configuration}==""
    ATTRS{devnum}=="50"
    ATTRS{devpath}=="2"
    ATTRS{idProduct}=="6001"
    ATTRS{idVendor}=="0403"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="FTDI"
    ATTRS{maxchild}=="0"
    ATTRS{product}=="FT232R USB UART"
    ATTRS{quirks}=="0x0"
    ATTRS{removable}=="unknown"
    ATTRS{serial}=="AI038TTH"
    ATTRS{speed}=="12"
    ATTRS{urbnum}=="15"
    ATTRS{version}==" 2.00"
```

別ポート

```
wnoguchi@serial:~$ udevadm info -q path -n /dev/ttyUSB0
/devices/pci0000:00/0000:00:10.0/usb3/3-1/3-1:1.0/ttyUSB0/tty/ttyUSB0
```


```
  looking at parent device '/devices/pci0000:00/0000:00:10.0/usb3/3-1':
    KERNELS=="3-1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{authorized}=="1"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bDeviceClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bMaxPacketSize0}=="8"
    ATTRS{bMaxPower}=="90mA"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bcdDevice}=="0600"
    ATTRS{bmAttributes}=="a0"
    ATTRS{busnum}=="3"
    ATTRS{configuration}==""
    ATTRS{devnum}=="51"
    ATTRS{devpath}=="1"
    ATTRS{idProduct}=="6001"
    ATTRS{idVendor}=="0403"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="FTDI"
    ATTRS{maxchild}=="0"
    ATTRS{product}=="FT232R USB UART"
    ATTRS{quirks}=="0x0"
    ATTRS{removable}=="unknown"
    ATTRS{serial}=="AI038TTH"
    ATTRS{speed}=="12"
    ATTRS{urbnum}=="300"
    ATTRS{version}==" 2.00"
```

USBハブの別のポートに刺す。

```
wnoguchi@serial:~$ ls /dev/ttyUSB*
/dev/ttyUSB0  /dev/ttyUSB2  /dev/ttyUSB4  /dev/ttyUSB6  /dev/ttyUSB8
/dev/ttyUSB1  /dev/ttyUSB3  /dev/ttyUSB5  /dev/ttyUSB7  /dev/ttyUSB9
```

```
wnoguchi@serial:~$ udevadm info -q path -n /dev/ttyUSB2
/devices/pci0000:00/0000:00:10.0/usb3/3-2/3-2.3/3-2.3.1/3-2.3.1:1.0/ttyUSB2/tty/ttyUSB2
```

```
  looking at parent device '/devices/pci0000:00/0000:00:10.0/usb3/3-2/3-2.3/3-2.3.1':
    KERNELS=="3-2.3.1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{authorized}=="1"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bDeviceClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bMaxPacketSize0}=="8"
    ATTRS{bMaxPower}=="90mA"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bcdDevice}=="0600"
    ATTRS{bmAttributes}=="a0"
    ATTRS{busnum}=="3"
    ATTRS{configuration}==""
    ATTRS{devnum}=="59"
    ATTRS{devpath}=="2.3.1"
    ATTRS{idProduct}=="6001"
    ATTRS{idVendor}=="0403"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="FTDI"
    ATTRS{maxchild}=="0"
    ATTRS{product}=="FT232R USB UART"
    ATTRS{quirks}=="0x0"
    ATTRS{removable}=="unknown"
    ATTRS{serial}=="A103NTFZ"
    ATTRS{speed}=="12"
    ATTRS{urbnum}=="15"
    ATTRS{version}==" 2.00"
```


番号変わってる。
なかなかに厳しい
たぶん ttyUSB0-1 のデバイス抜けたら順番変わるんでしょ？？

```
wnoguchi@serial:~$ ls /dev/ttyUSB*
/dev/ttyUSB0  /dev/ttyUSB3  /dev/ttyUSB5  /dev/ttyUSB7  /dev/ttyUSB9
/dev/ttyUSB2  /dev/ttyUSB4  /dev/ttyUSB6  /dev/ttyUSB8
```

ハブのUSB抜く

```
wnoguchi@serial:~$ ls /dev/ttyUSB*
ls: cannot access '/dev/ttyUSB*': No such file or directory
```

また差す


```
wnoguchi@serial:~$ ls /dev/ttyUSB*
/dev/ttyUSB0  /dev/ttyUSB2  /dev/ttyUSB4  /dev/ttyUSB6  /dev/ttyUSB8
/dev/ttyUSB1  /dev/ttyUSB3  /dev/ttyUSB5  /dev/ttyUSB7
```

```
wnoguchi@serial:~$ udevadm info -q path -n /dev/ttyUSB2
/devices/pci0000:00/0000:00:10.0/usb3/3-2/3-2.3/3-2.3.1/3-2.3.1:1.0/ttyUSB2/tty/ttyUSB2
```


```
  looking at parent device '/devices/pci0000:00/0000:00:10.0/usb3/3-2/3-2.3/3-2.3.1':
    KERNELS=="3-2.3.1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{authorized}=="1"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bDeviceClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bMaxPacketSize0}=="8"
    ATTRS{bMaxPower}=="90mA"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bcdDevice}=="0600"
    ATTRS{bmAttributes}=="a0"
    ATTRS{busnum}=="3"
    ATTRS{configuration}==""
    ATTRS{devnum}=="95"
    ATTRS{devpath}=="2.3.1"
    ATTRS{idProduct}=="6001"
    ATTRS{idVendor}=="0403"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="FTDI"
    ATTRS{maxchild}=="0"
    ATTRS{product}=="FT232R USB UART"
    ATTRS{quirks}=="0x0"
    ATTRS{removable}=="unknown"
    ATTRS{serial}=="A103NTFZ"
    ATTRS{speed}=="12"
    ATTRS{urbnum}=="15"
    ATTRS{version}==" 2.00"
```

アカン

またUSBロールオーバーケーブルUSBハブの別のポートに刺す
ハブ抜いて刺す

```
  looking at parent device '/devices/pci0000:00/0000:00:10.0/usb3/3-2/3-2.3/3-2.3.1':
    KERNELS=="3-2.3.1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{authorized}=="1"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bDeviceClass}=="00"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bMaxPacketSize0}=="8"
    ATTRS{bMaxPower}=="90mA"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bcdDevice}=="0600"
    ATTRS{bmAttributes}=="a0"
    ATTRS{busnum}=="3"
    ATTRS{configuration}==""
    ATTRS{devnum}=="2"
    ATTRS{devpath}=="2.3.1"
    ATTRS{idProduct}=="6001"
    ATTRS{idVendor}=="0403"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="FTDI"
    ATTRS{maxchild}=="0"
    ATTRS{product}=="FT232R USB UART"
    ATTRS{quirks}=="0x0"
    ATTRS{removable}=="unknown"
    ATTRS{serial}=="A103NTFZ"
    ATTRS{speed}=="12"
    ATTRS{urbnum}=="15"
    ATTRS{version}==" 2.00"
```

どうやら使ってるロールオーバーケーブルを抜いて、別の作業終わって別のUSBハブポートに差すと
順番変わるっぽいね。
これはきつい。
ttyデバイス名は Mac で接続したときみたいにシリアル番号で出てほしい。

```
/dev/tty.usbserial-AI038TTH
```

1. [linux - How to bind USB device under a static name? - Unix & Linux Stack Exchange](https://unix.stackexchange.com/questions/66901/how-to-bind-usb-device-under-a-static-name)
1. [しげふみメモ : screenでシリアルコンソール接続](http://blog.livedoor.jp/hakin/archives/51266944.html)
1. [Linuxでシリアルコンソールを使う - builder by ZDNet Japan](https://builder.japan.zdnet.com/os-admin/20365899/)
1. [cu Tips - Qiita](https://qiita.com/g0117736/items/270942c37483183d98ef)

Macでおつなぎ申す。
cu は `~.` で切断。

```
➜  ~ cu /dev/tty.usbserial-AI0388SG
cu: /dev/tty.usbserial-AI0388SG: System not found

cu --line /dev/tty.usbserial-AI038TTH --speed 9600

➜  ~ cu --line /dev/tty.usbserial-AI038TTH --speed 9600

cu: creat during lock (/var/spool/uucp/TMP00000007cd in /Users/wnoguchi as uid 501): Permission denied
cu: /dev/tty.usbserial-AI038TTH: Line in use
➜  ~ sudo cu --line /dev/tty.usbserial-AI038TTH --speed 9600

R2>~.

Disconnected.
```

[LinuxでUSBシリアルケーブルを使う | NETWIZ.JP](https://netwiz.jp/?p=556)

```
wnoguchi@serial:~$ sudo ls -l /dev/ttyUSB8
crw-rw---- 1 root dialout 188, 8 Dec  9 20:25 /dev/ttyUSB8
```

[Ubuntuでminicom起動すると/dev/ttyUSB0のパーミッションがないと言われる - kinneko@転職先募集中の日記](http://d.hatena.ne.jp/kinneko/20140118/p2)

今度はパーミッションでエラーになるよ。なんやねん...
screen はいけるのに cu はいけない。
sudoers ちゃんと設定したんだけどなあ

```
wnoguchi@serial:~$ sudo cu --line /dev/ttyUSB0 --speed 9600
cu: open (/dev/ttyUSB0): Permission denied
cu: /dev/ttyUSB0: Line in use
```

グループ指定したら行けることが判明。

```
wnoguchi@serial:~$ sudo -g dialout cu --line /dev/ttyUSB0 --speed 9600
Connected.

R1#disable
R1>~.
```

何もない

```
root@serial:~# ls /etc/udev/rules.d/
```

[Fixed tty device assignments in Linux using udev](https://www.silabs.com/community/interface/knowledge-base.entry.html/2016/06/06/fixed_tty_deviceass-XzTf)


[udev(7): dynamic device management - Linux man page](https://linux.die.net/man/7/udev)

[Persistent names for usb-serial devices | HintShop](http://hintshop.ludvig.co.nz/show/persistent-names-usb-serial-devices/)

```
wnoguchi@serial:~$ apropos udev
apropos: can't set the locale; make sure $LC_* and $LANG are correct
systemd-udevd (8)    - Device event managing daemon
systemd-udevd-control.socket (8) - Device event managing daemon
systemd-udevd-kernel.socket (8) - Device event managing daemon
systemd-udevd.service (8) - Device event managing daemon
udev (7)             - Dynamic device management
udev.conf (5)        - Configuration for device event managing daemon
udevadm (8)          - udev management tool
```

やっぱマニュアルだな。

```
wnoguchi@serial:~$ man 7 udev
```

だんだん眠たくなってきて寝たら昨日の今

```
ACTION=="add", SUBSYSTEM=="net", DRIVERS=="?*", ATTR{type}=="32", ATTR{address}=="?*00:02:c9:03:00:31:78:f2", NAME="mlx4_ib3"

ACTION=="add", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="tty.usbserial-$attr{serial}"
```

/dev/tty.usbserial-AI038TTH

```
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:6b:eb:75", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
```

シンボリックリンクできたっぽい

```
wnoguchi@serial:~$ ls -l /dev/tty.us*
lrwxrwxrwx 1 root root 7 Dec 10 07:56 /dev/tty.usbserial-A103NTFZ -> ttyUSB1
lrwxrwxrwx 1 root root 7 Dec 10 07:56 /dev/tty.usbserial-A504AOKI -> ttyUSB6
lrwxrwxrwx 1 root root 7 Dec 10 07:56 /dev/tty.usbserial-A504APRK -> ttyUSB0
lrwxrwxrwx 1 root root 7 Dec 10 07:56 /dev/tty.usbserial-A504AQ7R -> ttyUSB7
lrwxrwxrwx 1 root root 7 Dec 10 07:56 /dev/tty.usbserial-A504CU6I -> ttyUSB4
lrwxrwxrwx 1 root root 7 Dec 10 07:56 /dev/tty.usbserial-A504CVAJ -> ttyUSB3
lrwxrwxrwx 1 root root 7 Dec 10 07:56 /dev/tty.usbserial-AI0388SG -> ttyUSB9
lrwxrwxrwx 1 root root 7 Dec 10 07:56 /dev/tty.usbserial-AI038TTH -> ttyUSB2
lrwxrwxrwx 1 root root 7 Dec 10 07:56 /dev/tty.usbserial-AI038TTZ -> ttyUSB8
lrwxrwxrwx 1 root root 7 Dec 10 07:56 /dev/tty.usbserial-AL00LMJ1 -> ttyUSB5
```

デーモンを再起動せずともファイル書き込んで再起動すれば反映される。

[Ubuntuでminicom起動すると/dev/ttyUSB0のパーミッションがないと言われる - kinneko@転職先募集中の日記](http://d.hatena.ne.jp/kinneko/20140118/p2)

なんかもうこれでいいかなという気持ちになってきた。
シンボリックリンクでイイヨー

```:/etc/udev/rules.d/99-usb-serial.rules
ACTION=="add", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", GROUP="users", MODE="0666"
ACTION=="add", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="tty.usbserial-$attr{serial}"
```

```
wnoguchi@serial:~$ ls -l /dev/tty.us* /dev/ttyUSB*
lrwxrwxrwx 1 root root       7 Dec 10 12:49 /dev/tty.usbserial-A103NTFZ -> ttyUSB1
lrwxrwxrwx 1 root root       7 Dec 10 12:49 /dev/tty.usbserial-A504AOKI -> ttyUSB6
lrwxrwxrwx 1 root root       7 Dec 10 12:49 /dev/tty.usbserial-A504APRK -> ttyUSB0
lrwxrwxrwx 1 root root       7 Dec 10 12:49 /dev/tty.usbserial-A504AQ7R -> ttyUSB7
lrwxrwxrwx 1 root root       7 Dec 10 12:49 /dev/tty.usbserial-A504CU6I -> ttyUSB4
lrwxrwxrwx 1 root root       7 Dec 10 12:49 /dev/tty.usbserial-A504CVAJ -> ttyUSB3
lrwxrwxrwx 1 root root       7 Dec 10 12:49 /dev/tty.usbserial-AI0388SG -> ttyUSB9
lrwxrwxrwx 1 root root       7 Dec 10 12:49 /dev/tty.usbserial-AI038TTH -> ttyUSB2
lrwxrwxrwx 1 root root       7 Dec 10 12:49 /dev/tty.usbserial-AI038TTZ -> ttyUSB8
lrwxrwxrwx 1 root root       7 Dec 10 12:49 /dev/tty.usbserial-AL00LMJ1 -> ttyUSB5
crw-rw-rw- 1 root users 188, 0 Dec 10 12:49 /dev/ttyUSB0
crw-rw-rw- 1 root users 188, 1 Dec 10 12:49 /dev/ttyUSB1
crw-rw-rw- 1 root users 188, 2 Dec 10 12:49 /dev/ttyUSB2
crw-rw-rw- 1 root users 188, 3 Dec 10 12:49 /dev/ttyUSB3
crw-rw-rw- 1 root users 188, 4 Dec 10 12:49 /dev/ttyUSB4
crw-rw-rw- 1 root users 188, 5 Dec 10 12:49 /dev/ttyUSB5
crw-rw-rw- 1 root users 188, 6 Dec 10 12:49 /dev/ttyUSB6
crw-rw-rw- 1 root users 188, 7 Dec 10 12:49 /dev/ttyUSB7
crw-rw-rw- 1 root users 188, 8 Dec 10 12:49 /dev/ttyUSB8
crw-rw-rw- 1 root users 188, 9 Dec 10 12:49 /dev/ttyUSB9
```


```
wnoguchi@serial:~$ udevadm info --name=/dev/tty.usbserial-AI038TTZ --attribute-walk | less
```

```
wnoguchi@serial:~$ screen /dev/tty.usbserial-AI038TTZ
```

```
wnoguchi@serial:~$ cu --line /dev/tty.usbserial-AI038TTZ --speed 9600
Connected.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
```

Conclusion
---------------------

udev のルールに以下書けば OK 。

```:/etc/udev/rules.d/99-usb-serial.rules
ACTION=="add", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", GROUP="users", MODE="0666"
ACTION=="add", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="tty.usbserial-$attr{serial}"
```

作成されたスペシャルデバイスファイルへのシンボリックリンクも貼られる。

```
wnoguchi@serial:~$ ls -l /dev/tty.us* /dev/ttyUSB*
lrwxrwxrwx 1 root root       7 Dec 10 12:49 /dev/tty.usbserial-A103NTFZ -> ttyUSB1
lrwxrwxrwx 1 root root       7 Dec 10 12:49 /dev/tty.usbserial-A504AOKI -> ttyUSB6
lrwxrwxrwx 1 root root       7 Dec 10 12:49 /dev/tty.usbserial-A504APRK -> ttyUSB0
lrwxrwxrwx 1 root root       7 Dec 10 12:49 /dev/tty.usbserial-A504AQ7R -> ttyUSB7
lrwxrwxrwx 1 root root       7 Dec 10 12:49 /dev/tty.usbserial-A504CU6I -> ttyUSB4
lrwxrwxrwx 1 root root       7 Dec 10 12:49 /dev/tty.usbserial-A504CVAJ -> ttyUSB3
lrwxrwxrwx 1 root root       7 Dec 10 12:49 /dev/tty.usbserial-AI0388SG -> ttyUSB9
lrwxrwxrwx 1 root root       7 Dec 10 12:49 /dev/tty.usbserial-AI038TTH -> ttyUSB2
lrwxrwxrwx 1 root root       7 Dec 10 12:49 /dev/tty.usbserial-AI038TTZ -> ttyUSB8
lrwxrwxrwx 1 root root       7 Dec 10 12:49 /dev/tty.usbserial-AL00LMJ1 -> ttyUSB5
crw-rw-rw- 1 root users 188, 0 Dec 10 12:49 /dev/ttyUSB0
crw-rw-rw- 1 root users 188, 1 Dec 10 12:49 /dev/ttyUSB1
crw-rw-rw- 1 root users 188, 2 Dec 10 12:49 /dev/ttyUSB2
crw-rw-rw- 1 root users 188, 3 Dec 10 12:49 /dev/ttyUSB3
crw-rw-rw- 1 root users 188, 4 Dec 10 12:49 /dev/ttyUSB4
crw-rw-rw- 1 root users 188, 5 Dec 10 12:49 /dev/ttyUSB5
crw-rw-rw- 1 root users 188, 6 Dec 10 12:49 /dev/ttyUSB6
crw-rw-rw- 1 root users 188, 7 Dec 10 12:49 /dev/ttyUSB7
crw-rw-rw- 1 root users 188, 8 Dec 10 12:49 /dev/ttyUSB8
crw-rw-rw- 1 root users 188, 9 Dec 10 12:49 /dev/ttyUSB9
```

あとはシェルスクリプトなりエイリアスなりでラップして

```
alias R2='screen /dev/tty.usbserial-AI038TTH'
```

とかすれば幸せになれるんじゃないかな。

最近私が使っているのはこんな感じのスクリプトです。

[serial console screen wrapper script.](https://gist.github.com/wnoguchi/f81d0068cdba863f21b94f49ba0560c6)

```bash:/usr/local/bin/con
#!/bin/bash

session_name=$1
case $1 in
  "SW1")
    devname=/dev/tty.usbserial-AL00LMJ1
	  ;;
  "SW2")
    devname=/dev/tty.usbserial-A504CVAJ
	  ;;
  "SW3")
    devname=/dev/tty.usbserial-A504APRK
	  ;;
  "SW4")
    devname=/dev/tty.usbserial-A504CU6I
	  ;;
  "SW5")
    devname=/dev/tty.usbserial-A504AQ7R
	  ;;
  "SW6")
    devname=/dev/tty.usbserial-FTGNW2EB
	  ;;
  "SW7")
    devname=/dev/tty.usbserial-FTZ2DHIG
	  ;;
  "SW8")
    devname=/dev/tty.usbserial-FTZ2DFBL
	  ;;
  "ASW101")
    devname=/dev/tty.usbserial-FTK1ROUP
	  ;;
  "ASW1")
    devname=/dev/tty.usbserial-AI038TTZ
	  ;;
  "ASW2")
    devname=/dev/tty.usbserial-A504AOKI
	  ;;
  "R1")
    # R1
    devname=/dev/tty.usbserial-AI038TTH
	  ;;
  "R2")
    # R2
    devname=/dev/tty.usbserial-A103NTFZ
	  ;;
  "R3")
    # R3
    devname=/dev/tty.usbserial-AI0388SG
	  ;;
  *)
    echo "No such device."
    exit 404
	  ;;
esac

#screen /dev/${devname}
screen  -xRS ${session_name} ${devname}
```

ハッピー Shaving!

[Home Cheap Serial Console Server [PG1X]](https://pg1x.com/tech:network:home-cheap-serial-console-server:home-cheap-serial-console-server)