シリアルコンソールを極めよう – Part5. ターミナル編

しばらく間が空いてしまいましたね。

やはりエンジニアとはいえ、人間ですので食べていかなければ…。<いいわけ

今回はシリアルコンソールの話5回目です。
ターミナルソフトとして、TeraTermとscreenコマンドを中心に掘り下げて解説したいと思います。

20140620004928

▲深夜1時のコワーキングスペースで、何してますか、僕は。

シリーズ一覧

 シリアルコンソールを極めよう – Part1. 概要編
 シリアルコンソールを極めよう – Part2. USB変換ケーブル編
 シリアルコンソールを極めよう – Part3. 変換コネクタ編
 シリアルコンソールを極めよう – Part4. ケーブル編
→シリアルコンソールを極めよう – Part5. ターミナル編
 シリアルコンソールを極めよう – Part6. コンソールサーバを自作しよう
 シリアルコンソールを極めよう – Part7. TeraTermマクロを使おう

Part5. ターミナル編

さて、第5回は「ターミナル編」です。

皆さん何気にPuttyとかscreenとか使っていると思いますが、それらの挙動や使い方を、シリアルコンソールの側面から解説します。

昔のコンピュータは、端末だけでは作業できなかった。

「何を今更?」と言われるかもしれませんが、昔はダム端末と呼ばれ、ホストコンピュータとシリアルケーブルで接続され、単純に文字を表示する・タイプされた文字を送信するだけの端末でした。
その為、現在でもNICが壊れた時の保険として、今でもIPMIではなくシリアルコンソールを使っている環境があります。今はとても便利になりました…)

現在使われているプロトコルが実装されるようになりました。

詳細は、Wikipediaに写真付きで詳しく纏められています。

VT100 – Wikipedia

その他、エミュレータが現在でも使われています。

Xming X Server for Windows プロジェクト日本語トップページ – SourceForge.JP

ASTEC-X — Windows 対応 PC X サーバー

TeraTerm

言わずと知れたターミナルソフトです。
現在はTeraTerm2.3の後継として、SourceForce上でUTF-8対応の他、毎回悩まされていたMAXCOMPORT問題も密かに改善されています。(ぉ
(以前はMAXCOMPORTが小さな値だったので、iniファイルを編集しないとUSBシリアル変換ケーブルが使えなかったのです。)

20140620013935

Tera Term (テラターム) プロジェクト日本語トップページ – SourceForge.JP

特徴

エンジニアの間ではデファクトスタンダードと言ってもおかしくありませんが、強いてあげるならば、以下の部分ではないでしょうか。

  • COMポートの設定変更が簡単
  • ログを簡単に取得する事ができる
  • 文字列の送信時にウェイトを入れる事が出来る(後述)
  • 各種ファイル転送プロトコルを使う事ができる
  • TeraTermマクロ(第7回で紹介)で自動化ができる

screenコマンド

一方、BSD等で使えるものとして、screenコマンドやcuコマンドがあります。
今回は高機能で筆者が愛用している(笑)screenコマンドをご紹介します。

screenは仮想ターミナルとしての側面が強いですが、もちろんシリアルコンソールにも使えます。

20140620010845

使い方

screenコマンドは一般ユーザ権限で使う事ができます。

% screen TTYデバイス [通信速度,[cs8|cs7,[ixon|-ixon,[ixoff|-ixoff,[istrip|-istrip]]]]]

実際には、標準のパラメータでCisco等には使用可能なので、デバイスのみ指定して使用します。

% screen /dev/tty.usbserial

ウィンドウを閉じる時は、以下のコマンドで終了します。

Ctrl+a→k→y

詳細は、screenのmanを読みましょう。
Man page of SCREEN

通信パラメータの設定

まず、僕は「9600、8、1、なし」と覚えています。
また、「9600-8-N-1」とも表記されている場合があります。
いずれもシリアル通信に必要なパラメータですが、現在の機器は暗黙的にこのパラメータが設定されている為、なかなか覚えることが無いかもしれません。
基本的にネゴシエーションは無いので、双方の機器で合わせる必要があります。
(※hp ProCurve Eシリーズでは、ログイン時に何回かEnterを送る事で自動認識されます。)

通信速度

1秒間に何ビット送信するか、という数字です。
300bpsから始まり、115.2kbpsまで(本当はもっと上もありますが)存在します。

バイト長

1キャラクタあたり何ビットで送信するかを、7bitもしくは8bitを示します。
(厳密には文字の事をキャラクタと呼びます。)
キャラクタを示したASCIIコードには128個しかなく、1キャラクタ7bitあれば英語での通信が可能でした。
しかし、拡張ASCIIコードや漢字コードが使われるにつれ、現在で言う8bitが普通になります。

ストップビット

1キャラクタ毎に、「1キャラクタ終了」の合図として送信するビットの数です。
1bit, 1.5bit, 2bitなどがあり、一般的には1bitの「1」をキャラクターの後ろに付加します。
尚、同様にスタートビットも存在し、先頭に常に「0」を付加します。

パリティ

通信の誤り検出の為のビット。一般的には使用しません。

フローコントロール(フロー制御)

CTS信号線、DSR-DTR信号線)によるフロー制御の2種類があります。

Cisco機器では標準でハードウェアフロー制御が有効になっています。機器によって扱いが異なるので、必要であれば確認する事をおすすめします。

尚、フロー制御と、後述する「ゆっくり」を有効にしない状態で、連続してConfigを投入した場合、以下のように取りこぼしてしまい、設定に失敗するケースが多々あります。

20140620010847

▲300行のConfigを一気に送り込んだ例

ブレーク信号

機種により意味は異なるが、一般的に処理を中断する処理を行う。

例えば、SPARC Serverの場合、OpenBootへの移行、コアダンプして停止などの挙動となります。

尚、コンソールサーバやターミナルソフトによっては、電源切断時/終了時にブレーク信号を強制的に送信するものがあります。ターミナルソフトを終了する前に、コンソールケーブルを抜きましょう。(笑)

20140620010848

ターミナルソフトケーススタディ

これらターミナルソフトを使っていて、多々お世話になるであろう事柄を、簡単にまとめてみます。(自分の備考録ともいう・笑)

ログを取得する(TeraTerm編)

ファイル→ログにて、ログ保存のダイアログが表示されます。
ファイル名は自分で決めなければいけませんが、僕は慣習として「HOSTNAME-YYYYMMDD.作業名.log」としています。(ファイル名でソートした時に楽なので)

また、「現在バッファを含む」にチェックを付けると、既存のログバッファの内容を含めてログに出力してくれる為、おすすめです。

尚、ログバッファは「設定→ウィンドウの設定」から設定可能です。デフォルトで10000行がバッファされます。

20140620013938

ログを取得する(screen編)

いくつかの方法がありますが、scriptコマンド及びscreenの ログ作成機能ではエスケープコードが入ってしまい、とても読みにくいログになってしまします。
ですので、スクロールバッファを拡張し、作業後にまとめてスクロールバッファを保存する方法をご紹介します。

まず、.screenrcに、以下の1文を追記します。
これにより、スクロールバッファを10000行まで拡大します。

defscrollback 10000

次に、screen内で作業中、以下の要領でログを保存します。

Ctrl+a→:hardcopy -h LogFilename.log

20140620010846

-h無しの場合、表示中の画面の文字列が、-h有りの場合、ログバッファ全体がログファイルに保存されます。
この場合、エスケープコードは保存されず、キレイなログが保存されます。

ブレーク信号を送信する(TeraTerm編)

「コントロール→ブレーク信号」 もしくは「Alt+B」で送信する事ができます。

ブレーク信号を送信する(screen編)

「Ctrl+a→b」 で送信する事ができます。

通信パラメータを設定する(TeraTerm編)

「設定→シリアルポート」より設定可能です。OKを押下後、即時反映されます。

20140620013936

通信パラメータを設定する(screen編)

screen起動時のコマンドラインにて指定します。

文字列をゆっくり転送する(TeraTerm編)

「設定→シリアルポート」より設定可能です。
「送信遅延」の「ミリ秒/字」がキャラクター単位、「ミリ秒/行」が行単位で、それぞれ1/1000秒(ミリ秒)単位で指定可能です。
OKを押下後、即時反映されます。

「ファイル→ファイル送信」で送信するファイルを選択することで、上記の設定でゆっくり文字列が送信されます。

文字列をゆっくり転送する(screen編)

事前に、以下のようなシェルスクリプトを作成します。
sleepの値は適宜変えて下さい。あ、権限も与えてくださいね。

$ cat wait.sh
#!/bin/sh

if [ “$1” = “” ];then
exit
fi

while read ln
do
echo $ln
sleep 0.5
done<$1
exit

次に、screen内で以下のようにタイプしましょう。
このファイルを、/path/to/wait.sh とします。

次に、screen内で以下のようにタイプします。

Ctrl+a→:exec /path/to/wait.sh /usr/home/foo/catalyst.config

本当はこんなステキコードを書きたいのですが、サンプルコードとして許してください!><;

また、execコマンドはシリアルの入出力をプログラムのSTDIN/STDOUTとしてリダイレクトしてくれるので、expectあたりと組み合わせるとステキTeraTermマクロを超えるかもしれません・笑)

XMODEM等でファイルを転送する(番外編・TeraTerm編)

かつてTeraTermにはこれらが標準で実装されています。

現在でも、IOSの復元などでは、 Xmodemが使用されます。

但し、これらのぺけぴー、だいじ、だいじ。

次回予告

次回6回目は「コンソールサーバを自作しよう」です。
コンソールサーバは、シリアルポートを常時何ポートも専有する、データセンタなどで便利なアイテムです。コスパで考えると、RaspberryPiでも良いかもしれませんね。

余談

ちなみに、かつてDOS/V(ThinkPad230Cs)でもお世話になりました。(赤面

20140620010849

画像は「オンラインソフト@メモリーズ」様からお借りました。
10年前のソフトの情報を残して頂き、ありがとうございます。(赤面

Facebook Comments