読者です 読者をやめる 読者になる 読者になる

らくがきちょう

なんとなく

Paspberry Pi をワイヤレスなコンソールサーバにする

Lantronix 社の xDirect シリーズはイーサネット経由でシリアルポート(RS232)にアクセス出来る製品だそうです。「簡易コンソールサーバ」とも表現出来ると思います。

xDirect 232
PoE 非対応。$99.95。
xDirect PoE
PoE 対応。$129.95。


ただ、Amazon.co.jpNTT-X ストアには基本的に在庫が無くて入手まで時間がかかると予想される上、NTT-X ストアで PoE 対応版の価格は約 21,000 円と、かなり高価な価格設定になっていました… そこで今回は Raspberry Pi をコンソールサーバにしてみようと思います。Raspberry Pi はワイヤレスに対応させ、一般的なコンソールサーバ製品と差別化してみます。

構成

今回は以下を組み合わせます。

Raspberry Pi2 は Raspbian OS(2015-05-05-raspbian-wheezy.img)をインストールしてあります。WN-G150U は 2.4GHz 帯しか対応していません(5GHz 帯は非対応)ですが、今回は良しとしました。USB/シリアル変換ケーブルである「REX-USB60F」はとりあえず 2 本、用意しました。環境構築後の構成は以下の通りです。

f:id:sig9:20150719024704p:plain

Raspberry Pi にワイヤレスアダプタを認識させる

今回は Raspberry Pi に WN-G150U を認識させますが、設定方法は「WN-G150UM on Raspberry Pi」という記事が大変、参考になりました。

vi /etc/udev/rules.d/network_drivers.rules というファイルを以下の内容で新規作成します。

ACTION=="add", SUBSYSTEM=="usb", ATTR{idVendor}=="04bb", ATTR{idProduct}=="094c", RUN+="/sbin/modprobe -qba 8192cu"

同様に、vi /etc/modprobe.d/network_drivers.conf というファイルを以下の内容で新規作成します。

install 8192cu /sbin/modprobe --ignore-install 8192cu $CMDLINE_OPTS; /bin/echo "04bb 094c" > /sys/bus/usb/drivers/rtl8192cu/new_id

続いて、ネットワークの設定を行います。今回は wlan0 インターフェイスを以下のパラメータで設定しました。

項目
SSID MY-SSID
事前共有鍵 MY-PSK
アドレス 192.168.253.210
ネットマスク 255.255.255.0
ゲートウェイ 192.168.253.254
DNS (1) 8.8.8.8
DNS (2) 8.8.4.4

具体的には /etc/network/interfaces を以下のように修正しました。

auto lo
iface lo inet loopback

auto eth0
allow-hotplug eth0
iface eth0 inet dhcp

auto wlan0
allow-hotplug wlan0
iface wlan0 inet static
  wpa-ssid        MY-SSID
  wpa-key-mgmt    WPA-PSK
  wpa-psk         My-PSK
  address         192.168.253.210
  netmask         255.255.255.0
  gateway         192.168.253.254
  dns-nameservers 8.8.8.8 8.8.4.4

これで WN-G150U を認識&利用出来るようになったはずです。

Jerm のインストール

シリアル通信の制御には minicom を使うケースも多いと思います。ただ、今回は「コンソールサーバにする = シリアル/TCP 変換を行う」必要がありますので jerm を利用します。リポジトリjerm が無いのでソースからインストールします。

wget http://www.bsddiary.net/jerm/jerm-8096.tar.gz
tar zxvf jerm-8096.tar.gz
cd jerm-8096/
make
sudo cp ./jerm /usr/local/bin

これでインストールは完了です。特に引数無く、jerm とだけ実行するとヘルプが表示されます。

# jerm
Jerminal v0.8096  Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2007 candy
usage1: jerm [optinos] device
	-b speed	speed
	-p [none|even|odd]	parity
	-d [7|8]	data bits
	-s [1|2|1.5]	stop bit
	-f [none|x|hard]	flow control
	-F	Set FUCK MODE for TA-100KR/RA SYSTEMS CORP.
usage2: jerm [-46i][-P port] [options] host
	client mode.
	-i	init stdin/out by device options (pipe mode)
common optinos:
	-l file	log file
	-z	truncate log file
	-x	start in hex dump mode
	-r cccc	set CR LF mapping. (default = rnrn)
		c = {x=drop, r=CR, n=LF, t=CRLF}
		option order = {recv CR, recv NL, send CR, send LF}
	-j	rockwell binary data mode
usage3: jerm -D [-46T][-P port][-z][-l file] device
	server mode.

Supervisor で jerm をデーモン化する

jerm を起動しても、起動したユーザがログアウトしたらプログラムが終了してしまいます。これでは不便なので Supervisor を使って jerm をデーモン化します。まず、Supervisor をインストールします。

apt-get -y install supervisor

Supervisor でのデーモン化対象となるスクリプトを用意します。今回は「一本目の USB/シリアル変換ケーブル」と「二本目の USB/シリアル変換ケーブル」を制御するスクリプトを別々に用意しました。ひとつのスクリプトにまとめても良いのですが、片側のボーレートだけを変換したいようなケースではスクリプトが分かれている方が便利なのでスクリプトを分けました。

まず、一本目の USB/シリアル変換ケーブルを制御する /root/jerm-ttyUSB0.sh を新規作成します(スクリプトの配置位置はヤッツケです…)。-b オプションでスピードを指定していますが、これは接続先の機器に合わせて調整します。

#!/bin/sh
jerm -D -P 2001 -b 115200 -p none -d 8 -s 1 -f none /dev/ttyUSB0

続いて、二本目の USB/シリアル変換ケーブルを制御する /root/jerm-ttyUSB1.sh を新規作成します。

#!/bin/sh
jerm -D -P 2002 -b 115200 -p none -d 8 -s 1 -f none /dev/ttyUSB1

作成したスクリプトに実行権限を付与する為、パーミッションを調整します。

chmod 755 jerm-ttyUSB0.sh
chmod 755 jerm-ttyUSB1.sh

作成したスクリプトを Supervisor にサービスとして認識させる為の設定ファイルを作成します。まず、/etc/supervisor/conf.d/jerm-ttyUSB0.conf を以下の内容で新規作成します。

[program:jerm-ttyUSB0]
command=/root/jerm-ttyUSB0.sh
numprocs=1
redirect_stderr=true
stdout_logfile=/var/log/jerm-ttyUSB0.log
user=root

続いて /etc/supervisor/conf.d/jerm-ttyUSB1.conf を以下の内容で新規作成します。

[program:jerm-ttyUSB1]
command=/root/jerm-ttyUSB1.sh
numprocs=1
redirect_stderr=true
stdout_logfile=/var/log/jerm-ttyUSB1.log
user=root

Supervisor に設定ファイルを読み込ませます。

supervisorctl reread

最後に、作成したサービスを Supervisor に追加します。

supervisorctl add jerm-ttyUSB0
supervisorctl add jerm-ttyUSB1

supervisorctl status で確認すると、サービスが起動している(RUNNING)のが分かります。更に、netstat で Listen しているポートを確認すると jerm に Listen させている TCP/2001 や TCP/2002 が確認出来ます。

# supervisorctl status
jerm-ttyUSB0                     RUNNING    pid 2413, uptime 1:33:59
jerm-ttyUSB1                     RUNNING    pid 3184, uptime 0:00:05

# netstat -nat | grep 200[12]
tcp        0      0 0.0.0.0:2001            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:2002            0.0.0.0:*               LISTEN

クライアントから接続してみる

クライアント(OS X)からコンソールサーバ化した Raspberry Pi 経由で、コンソール接続してみます。クライアント側にも jerm が必要ですが、OS X であれば homebrew で簡単にインストールできます。1 本目の USB/シリアル変換ケーブルは Raspberry Pi の TCP/2001 で Listen していますので、接続するには以下のようにします。

jerm -P 2001 192.168.253.210

二本目の USB/シリアル変換ケーブルは TCP/2002 で Listen していますので、接続するには以下のようにします。

jerm -P 2002 192.168.253.210