訳: 一宮 亮 <ryo@azusa.shinshu-u.ac.jp>
、 1997
年 11 月 16 日
このセクションでは、FreeBSD でシリアル接続をする時の一般的な質問に答えます。 PPP および SLIP については、 第9章のセクションを参照してください。
FreeBSD のカーネルが起動する時、カーネルはその設定にしたがって、 システムのシリアルポートを検出します。起動時に表示されるメッセージをよく観察するか、 起動後に次のコマンドを実行する事によって確認できます。
dmesg | grep sio
ここに上に挙げたコマンドの出力例を示します。
sio0 at 0x3f8-0x3ff irq 4 on isa sio0: type 16550A sio1 at 0x2f8-0x2ff irq 3 on isa sio1: type 16550A
これは、二つのシリアルポートを示しています。1 番目は、 irq が 4 で 0x3f8 のポートアドレスを使用しています。 そして、16550A-type UART チップが存在します。 2 番目は、同じチップを使っていますが、 irq は 3 で、0x2f8 のポートアドレスを使用しています。内蔵のモデムカードは、 通常のシリアルポートと同じように扱われますが、 常時シリアルポートにモデムが接続されているという点で異なります。
GENERIC カーネルは、上の例と同じ irq とポートアドレスの設定の二つのシリアルポートをサポートしています。 これらの設定があなたのシステムに合わない場合、 またはモデムカードを追加した場合やカーネルの設定以上にシリアルポートを持っている場合は、 カーネルを再構築してください。 詳しくは、 カーネルの構築の項を参照してください。
心配ありません。 ttydX に統合されました。 ただ、古い設定ファイルのすべてを更新する必要があります。
3 番目のポート sio2 (sio(4) をご覧ください。DOS では、COM3 と呼ばれます。) には、 ダイヤルアウトデバイスとしては /dev/cuaa2、 ダイヤルインデバイスとして /dev/ttyd2 があります。 それではこの両者にはどのような違いがあるのでしょうか?
まず、ダイヤルインの時には ttydX を使います。 /dev/ttydX をブロッキングモードでオープンすると、プロセスは対応する cuaaX デバイスがインアクティブになるのを待ちます。 次に CD 信号がアクティブになるのを待ちます。 cuaaX デバイスをオープンすると、シリアルポートが ttydX デバイスによってすでに使われていないかどうかを確認します。 もしこのポートが使用可能であれば、ポートの使用権を ttydX から「奪い取る」のです。また、 cuaaX デバイスは CD 信号を監視しません。 この仕組みと自動応答モデムによって、 リモートユーザーをログインさせたり、 同じモデムでダイヤルアウトしたりすることができ、 システムのあらゆるトラブルの面倒を見ることができるでしょう。
繰り返しになりますが、 カーネルコンフィグレーションのセクションでは、 あなたのカーネルの設定についての情報が得られるでしょう。 マルチポートシリアルカードを使用するためには、カーネルの設定ファイルに、 カードの持つそれぞれのシリアルポートに対応する sio(4) の行を記述する必要があります。しかし、 irq とベクタアドレスは一つのエントリにのみ記述してください。 カード上のすべてのポートは一つの irq を共有しなければなりません。 一貫性を持たせるためにも、 最後のシリアルポートの所で irq を指定してください。 また、COM_MULTIPORT オプションも付けてください。
次に示す例は、AST の 4 ポートシリアルカードを irq 7 で設定したものです。
options "COM_MULTIPORT" device sio4 at isa? port 0x2a0 tty flags 0x781 device sio5 at isa? port 0x2a8 tty flags 0x781 device sio6 at isa? port 0x2b0 tty flags 0x781 device sio7 at isa? port 0x2b8 tty flags 0x781 irq 7 vector siointr
このフラグはマスタポートがマイナー番号 7 (0x700) を持っていて、 検出時の診断機能を有効にし (0x080)、 そしてすべてのポートで irq を共有する (0x001) ということを意味しています。
ttydX デバイス (または cuaaX デバイス) は、 アプリケーションのためにオープンする標準的なデバイスです。 プロセスがそのポートをオープンする時、 プロセスはデフォルトの端末 I/O 設定を取得します。 これらの設定は次のコマンドで確認することができます。
stty -a -f /dev/ttyd1
このデバイスに対する設定を変更した場合、 その設定はデバイスをクローズするまで有効です。 デバイスを再オープンした場合、それらの設定はデフォルトに戻ってしまいます。 デフォルトの設定に変更を加えるために、 「初期設定」デバイスをオープンし、 設定を修正することができます。 たとえば、CLOCAL モード、8 ビット、 XON/XOFF フロー制御という設定を ttyd5 のデフォルトにしたい場合、次のように行なってください。
stty -f /dev/ttyid5 clocal cs8 ixon ixoff
この設定を行なうためのコマンドを記述するのに適切なファイルは、 /etc/rc.serial です。 これでアプリケーションが ttyd5 をオープンした時に、 これらの設定をデフォルトで取得します。 しかし、こういったリンクによる設定は変更可能です。
「設定固定」デバイスを調整してやることによって、 アプリケーションによる設定の変更を禁止することができます。 たとえば、ttyd5 の通信速度を 57600bps に固定するには、次のように行ってください。
# stty -f /dev/ttyld5 57600
これにより、アプリケーションは ttyd5 をオープンし、ポートの通信速度を変更しようとしますが、 通信速度は 57600bps のままになります。
当然のことながら、初期設定デバイスおよび、設定固定デバイスは root のみが書き込みできるようになっていなければなりません。 しかし、MAKEDEV(8) スクリプトはデバイスエントリを作成する時に、 このような設定は行いません。
つまり、インターネットサービスプロバイダーになりたいのですね。 それにはまず、1 台ないし複数の自動応答モデムが必要です。 モデムには、キャリアーを検出した時には CD 信号を出力し、 そうでない場合には出力しないことが必要とされます。 また DTR 信号が on から off になった時には、 電話回線を切断し、モデム自身をリセットしなければなりません。 おそらく、RTS/CTS フロー制御を使うか、 ローカルフロー制御をまったく使わないかのどちらかでしょう。 最後に、コンピュータとモデムの間は固定速度でなければなりません。 ただ、(ダイヤルアップの発呼者に対して親切であるためには、 ) こちらのモデムと相手側のモデムの間の速度を、 モデム間で自動調整できるようにすべきでしょう。
多くあるヘイズコマンド互換モデムに対して、次のコマンドはこれらの設定を行ない、 その設定を不揮発性メモリーに保存します。
AT&C1&D3&K3&Q6S0=1&W
MS-DOS のターミナルプログラムに頼らずに AT コマンドを送出するには、 「AT コマンドを入力するには」のセクションを参照してください。
次に、モデム用のエントリを /etc/ttys (ttys(5) 参照) に作成しましょう。 このファイルには、 オペレーティングシステムがログインを待っているすべてのポートが記述されています。 以下のような行を追加してください。
ttyd1 "/usr/libexec/getty std.57600" dialup on insecure
この行は、2 番目のシリアルポート (/dev/ttyd1) には、 57600bps の通信速度でノンパリティ (std.57600: これは /etc/gettytab に記述されています。gettytab(5) 参照) のモデムが接続されていることを示しています。 このポートの端末タイプは dialup です。 またこのポートは、on すなわちログイン可能であり、insecure です。 これは root がこのポートから直接ログインするのは、 許可されていないということを意味します。 このようなダイヤルインポートに対しては、 ttydX のエントリを使用してください。
これが一般的な、ターミナルタイプとして dialup を使う方法です。多くのユーザーは、 .profile や .login で、 ログイン時の端末タイプが dialup であった場合には、 実際の端末タイプをユーザーに問い合わせるように設定しています。 この例は、ポートが insecure でした。このポートで root になるには、 一般ユーザーとしてログインし、それから “su” を使って root になってください。 もし、secure を指定したならば、 直接 root がそのポートからログインできます。
/etc/ttys に変更を加えた後は、HUP シグナル (SIGHUP) を init(8) プロセスに送る必要があります。
# kill -HUP 1
この操作は init プロセスに /etc/ttys を再読み込みさせます。 これにより、init プロセスは getty プロセスをすべての on となっているポートに起動させます。 次のようにして、ポートがログイン可能かを知ることができます。
% ps -ax | grep '[t]tyd1'
ログイン可能であれば、次のような出力が得られるはずです。
747 ?? I 0:00.04 /usr/libexec/getty std.57600 ttyd1
もし、他のコンピューターを FreeBSD の端末として接続したいのならば、 お互いのシリアルポート間をつなぐヌルモデムケーブル (訳注: リバースケーブルもしくはクロスケーブルとも呼ばれます) を用意してください。 もし、既製の端末を使う場合は、付属するマニュアルを参照してください。
そして、/etc/ttys (ttys(5) 参照) を上と同じように変更してください。 たとえば、WYSE-50 という端末を 5 番目のポートに接続するならば、 次のようなエントリを使用してください。
ttyd4 "/usr/libexec/getty std.38400" wyse50 on secure
この例は、/dev/ttyd4 ポートにノンパリティ、 端末タイプが wyse50、通信速度が 38400bps (std.38400: この設定は、 /etc/gettytab に記述されています。gettytab(5) 参照) の端末が存在しており、 root のログインが許可されている (secure) であることを示しています。
実際、 tip(1) のオンラインマニュアルは古くなっています。 すでに、Hayes ダイアラが実装されています。 /etc/remote ファイル (remote(5) 参照) で、 “at=hayes” と指定してください。
Hayes ドライバは、最近のモデムの新しい機能である、 BUSY、 NO DIALTONE、 CONNECT 115200 などのメッセージを認識できるほど賢くはなく、 単に混乱を起こすだけです。 tip(1) を使う場合には (ATX0&Wとするなどして)、 これらのメッセージを表示させないようにしなくてはいけません。
また、tip のダイヤルのタイムアウトは 60 秒です。 モデムのタイムアウト設定はそれより短くすべきであり、 そうしないと tip は通信に問題があると判断するでしょう。 ATS7=45&W を実行してください。
実際、デフォルトの tip は Hayes の完全なサポートをしているわけではありません。 解決方法は /usr/src/usr.bin/tip/tip の下の tipconf.h を変更することです。 もちろん、これにはソース配布ファイルが必要です。
“#define HAYES 0” と記述されている行を “#define HAYES1” と変更し、そして “make” と “make install” を実行します。これでうまく動作するでしょう。
/etc/remote ファイル (remote(5) 参照) の中で “direct” エントリを作ります。 たとえばモデムが 1 番目のシリアルポートである /dev/cuaa0に接続されている場合、 次のようにします。
cuaa0:dv=/dev/cuaa0:br#19200:pa=none
モデムがサポートする最大の bps レートを br フィールドに使います。 そして tip cuaa0 (tip(1) 参照) を実行すると、モデムが利用できるようになります。
/dev/cuaa0がシステムに存在しない場合は、次のようにします。
# cd /dev # ./MAKEDEV cuaa0
または root になって以下のように cu を使います。
# cu -lline -sspeed
line にはシリアルポート (たとえば /dev/cuaa0)を指定します。 そして speed には接続する速度 (たとえば 57600) を指定します。 その後 AT コマンドを実行したら、 ~. と入力すれば終了します。
電話番号 (pn) 機能の中での <@> 記号は、 tip に /etc/phones にある電話番号を参照するように伝えます。しかし <@> の文字は /etc/remote のような設定ファイルの中では特殊文字となります。 そこで、バックスラッシュを使ってエスケープを行います。
pn=\@
“generic” エントリと呼ばれるものを /etc/remote ファイル (remote(5) 参照) に追加します。 たとえば、次のようにします。
tip115200|Dial any phone number at 115200 bps:\ :dv=/dev/cuaa0:br#115200:at=hayes:pa=none:du: tip57600|Dial any phone number at 57600 bps:\ :dv=/dev/cuaa0:br#57600:at=hayes:pa=none:du:
そして “tip -115200 5551234” のように利用できます。 tip(1) より cu(1) を使いたい場合、 cu の generic エントリを使います。
cu115200|Use cu to dial any number at 115200bps:\ :dv=/dev/cuaa1:br#57600:at=hayes:pa=none:du:
そして “cu 5551234 -s 115200” と実行します。
tip1200 や cu1200 用のエントリを記述し、 適切な通信速度を br フィールドに設定します。 tip(1) は 1200bps が正しいデフォルト値であるとみなすので、 “tip1200” エントリを参照します。 もちろん 1200bps を使わなければならないわけではありません。
毎回接続されるのを待って “CONNECT <host>” と入力するかわりに、 tip の cm 機能を使います。 たとえば、/etc/remote (remote(5) 参照) に次のようなエントリを追加します。
pain|pain.deep13.com|Forrester's machine:\ :cm=CONNECT pain\n:tc=deep13: muffin|muffin.deep13.com|Frank's machine:\ :cm=CONNECT muffin\n:tc=deep13: deep13:Gizmonics Institute terminal server:\ :dv=/dev/cuaa2:br#38400:at=hayes:du:pa=none:pn=5551234:
これで、“tip pain” や “tip muffin” と実行すると pain や muffin のホストに接続することができ、 “tip deep13” を実行するとターミナルサーバに接続します。
これは大学に電話回線がいくつかあって、 数千人の学生が接続しようとする場合によくある問題です。
あなたの大学のエントリを /etc/remote ファイル (remote(5) 参照) に作成して、 pn のフィールドには <\@> を使います。
big-university:\ :pn=\@:tc=dialout dialout:\ :dv=/dev/cuaa3:br#9600:at=courier:du:pa=none:
そして /etc/phones ファイル (phones(5) 参照) に大学の電話番号の一覧を書きます。
big-university 5551111 big-university 5551112 big-university 5551113 big-university 5551114
tip(1) は一連の電話番号を上から順に試みて、 最終的に接続できなければあきらめます。リトライを続けさせたい場合は、 tip を while ループに入れて実行します。
CTRL+P は通常「強制 (force)」文字であり、 tip(1) に次の文字がリテラルデータであることを伝えます。 強制文字は「変数の設定」を意味する ~s エスケープによって、 他の文字にすることができます。
“~sforce=<single-char>” と入力して改行します。 <single-char> は、任意の 1 バイト文字です。 <single-char> を省略すると NUL 文字になり、 これは CTRL+2 や CTRL+SPACE を押しても入力できます。 いくつかのターミナルサーバで使われているのを見ただけですが、 <single-char> に SHIFT+CTRL+6 に割り当てるのもよいでしょう。
$HOME/.tiprc に次のように定義することで、 任意の文字を強制文字として利用できます。
force=<single-char>
CTRL+A を押してしまい、caps-lock キーが壊れている場合のために設計された tip(1) の “raise character” モードに入ったのでしょう。 既に述べた ~s を使って、 “raisechar” をより適切な値に変更してください。 もしこれら両方の機能を使用しないのであれば、 強制文字と同じ設定にすることもできます。
以下は CTRL+2 や CTRL+A などを頻繁に使う必要のある Emacs ユーザにうってつけの .tiprc ファイルのサンプルです。
force=^^ raisechar=^^
^ は SHIFT+CTRL+6 です。
まず始めに、FreeBSD Ports Collection から zmodem プログラムのいずれか (lrzszと rzsz の、通信カテゴリーの2 つのプログラムのどちらか) をインストールします。
ファイルを受信するには、リモート側で送信プログラムを起動します。 そして、Enter キーを押してから “~C rz” (lrzsz をインストールした場合は “~C lrz”) と入力すると、 ローカル側へのファイルの受信が始まります。
ファイルを送信するには、リモート側で受信プログラムを起動します。 そして、Enter キーを押してから “~C sz <files>” (lrzsz をインストールした場合は “~C lsz <files>”) と入力すると、リモート側へのファイルの送信が始まります。
マザーボードやシリアルカードが Acer の UART チップを使った物の場合、 FreeBSD の sio ドライバでは正しく検出する事が出来ません。 この問題を解決するためには、 www.lemis.com からパッチを入手してください。
本文書、および他の文書は ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/ からダウンロードできます。
FreeBSD に関する質問がある場合には、ドキュメント を読んだ上で <questions@FreeBSD.org> まで (英語で)
連絡してください。
本文書に関する質問については、<doc@FreeBSD.org> まで電子メールを (英語で)
送ってください。