2023-05-27 Raspberry Pi4 で簡易コンソールサーバを作る

提供:hkatou_Lab

中古のコンソールサーバが高い / 出回ってない + ラックスペースを消費するのが嫌だったため、余っていた Raspberry Pi4 でコンソールサーバを立てました。

ポートあたりのコストは高いですが、棚板 0.5U 以下のスペースしか食わない・Syslog / SNMP Trap / RANCID サーバなどと兼用できるのが良いです。

構成

BOM
メーカー 型式 内容 入手先 価格 数量 備考
SBC Raspberry Pi

Foundation

Raspberry Pi4

ModelB 4GB

4Core Amazon \6,875 1 2020/09 に購入して余ってたやつ
Micro SD SanDisk Micro SD 64GB Amazon \1,400 1 そのへんに転がってたやつ
Raspberry Pi 4 Case RETROFLAG NSEPi4 ファン付き Aliexpress \4,200 1 SSD が使える PI4 ケース

2020/08 購入

Raspberry Pi 4

USB-C (Type C)電源

Smraza SD02-JP 5V 3A Amazon \1,139 1 On / Off スイッチ付き
USB ハブ 5ポート USB 3.0 Aceele ASIN : B07RGVXFZL 20cm Amazon \1,189 2 バスパワー以外に USB-C で給電してセルフパワーも可能
RJ45-USB Cisco互換

コンソールケーブル

monofive MF-CBRJ45USB FT232R

USB

RJ-45

Amazon \1,598 5
合計 \23,982

最近は価格が高くなっているので、ここまで安くならないでしょう。

筆者は余ってた PI4 にハブとコンソール ケーブルのみ追加購入したので、\10,368 でした。

(CH340 x8 を買って \5,000 ほどドブに捨てたのはないしょ)

手順

  1. Raspberry PI4 に CentOS 9 Stream をインストール
  2. FTDI 232R ドライバ モジュールを読み込み
  3. minicom をインストール
  4. 接続できるか確認
  5. デバイスファイルのファイル名を固定
  6. エイリアス名と機器が一致するか確認

01) Raspberry PI4 に CentOS 9 Stream をインストール

Web にたくさん事例があるので、割愛します。以下の順に実施。

  1. CentOS 9 Stream のイメージファイルをダウンロード
  2. Rufus で SD カードにイメージ ファイルを書き込む
  3. Raspberry Pi4 に挿して起動
  4. SSH ログイン or ディスプレイとキーボードを接続して、Terminal から SD カードのパーティションをリサイズ

02) FTDI 232R ドライバ モジュールを読み込み

lsmod で ftdi-sio ドライバ モジュールが読み込まれているか確認します。

ない場合、modprobe コマンドで FT232R 用ドライバ モジュール ftdi_sio を読み込みます。

$ modprobe ftdi-sio

以下のような表示になれば OK.

$ lsmod | egrep -i "Module|ftd"
Module                  Size  Used by
ftdi_sio               53248  0
usbserial              45056  1 ftdi_sio

03) minicom をインストール

$ sudo dnf install minicom

04) 接続できるか確認

一般的な 9600bps の Cisco 機器と接続する場合、以下で接続が可能です。

$ minicom -b 9600 -D /dev/ttyUSB0

1 つ接続確認できたら、他の 4 つも接続してしまって OK です。

Ctrl + a の後 q を押して Enter で抜けられます。

使用方法は Ctrl + a の後 z で。

05) デバイスファイルのファイル名を固定

ttyUSB だと、

  • USB にコンソールケーブルを接続した順番によって、デバイス ファイル名が変化してしまう
  • どの機器に接続しているかわからない

ため、シリアル番号からデバイス ファイル名を固定します。

シリアル番号の確認

$ udevadm info -q property -n /dev/ttyUSB0 | grep -E "ID_SERIAL_SHORT=|ID_VENDOR_ID=|ID_MODEL_ID="

以下のような出力が得られます。

ID_MODEL_ID=6001
ID_SERIAL_SHORT=<Serial_NumN>
ID_VENDOR_ID=0403

ID_VENDOR_ID : メーカーに振られた ID. ここでは FTDI (Future Technology Devices International) を指す

ID_MODEL_ID : プロダクトの ID. ここでは FT232R を指す

ID_SERIAL_SHORT : プロダクトのシリアル番号

udev で機器接続時に tty のエイリアスを作成

5 つの USB シリアル コンバータを接続した場合は、 以下のように 5 行書きます。

# sudo vim /etc/udev/rules.d/90-usb-serial-devices.rules

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="<Serial_Num0>", SYMLINK+="tty-rt91", GROUP="dialout"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="<Serial_Num1>", SYMLINK+="tty-rt92", GROUP="dialout"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="<Serial_Num2>", SYMLINK+="tty-l3sw91", GROUP="dialout"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="<Serial_Num3>", SYMLINK+="tty-l3sw92", GROUP="dialout"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="<Serial_Num4>", SYMLINK+="tty-l2mgmt91", GROUP="dialout"

<Serial_Num[0-4]> には、先程の udevadm コマンドで得られた値を入れます。

別メーカーのチップの場合、idVendor と idProduct も変更が必要です。

/etc/rc.local に実行権限を付与

$ sudo ls -al /etc/rc.local

rc.local は CentOS 7 から非推奨で互換性のために残されており、今後のリリースでは使えなくなるかもしれません。

再起動 or udev 再起動

$ sudo reboot
$ sudo udevadm control --reload-rules
$ sudo service systemd-udevd reload

USB を挿抜する

エイリアス確認

$ sudo ls -al /dev/tty-*
lrwxrwxrwx 1 root root 7 Feb 27 09:00 /dev/tty-bgp91 -> ttyUSB0
lrwxrwxrwx 1 root root 7 Feb 27 09:00 /dev/tty-bgp92 -> ttyUSB2
lrwxrwxrwx 1 root root 7 Feb 27 09:00 /dev/tty-l3mgmt91 -> ttyUSB1
lrwxrwxrwx 1 root root 7 Feb 27 09:00 /dev/tty-l3sw91 -> ttyUSB4
lrwxrwxrwx 1 root root 7 Feb 27 09:00 /dev/tty-l3sw92 -> ttyUSB3

筆者はホスト名をつけました。

06) エイリアス名と機器が一致するか確認

$ sudo minicom -b 9600 -D /dev/tty-l2mgmt91

Welcome to minicom 2.7.1

OPTIONS: I18n
Compiled on Aug  9 2021, 00:00:00.
Port /dev/tty-l3mgmt91, 16:38:17

Press CTRL-A Z for help on special keys


tky-l2mgmt91#

一致しない場合、物理的に RJ-45 を差し替えるか、エイリアス作成コマンドのシリアルを入れ替え、再起動して再度確認します。

他の USB シリアル変換チップについて

FTDI は筆者が知る中で最高のチップですが、他の選択肢について記載します。

  • Prolific PL2101
    • たまにカーソル位置がずれるくらいで使えなくはない
    • コンソールは信頼性がほしいので、筆者は 2 度と買いたくない
  • Nanjing Qinheng Microelectronics (WCH) CH340
    • 面白いゴミだ 気に入った 壊すのは最初にしてやる
    • 筆者が罵倒する形容詞に悩むような出来
      • 燃えるゴミなら燃やせるだけマシなので、燃えるゴミに失礼
    • I/O エラーが起きてアクセスできなくなるため、少なくとも Linux では使えない
    • Windows のドライバは、今のところ問題となる挙動は見つけられていない

参考 URL

Raspberry Pi に CentOS Stream 9 をインストールしてみる

https://people.centos.org/pgreco/CentOS-Userland-9-stream-aarch64-RaspberryPI-Minimal-4/

USB-シリアル変換器のデバイスファイル名を固定する

弊社USBアダプタをLinuxで使うには(2019版)