19.4. ダイアルインサービス

寄稿: Helmer Guy [FAMILY Given].
改訂: Kelly Sean [FAMILY Given].

訳: 中根 雅文 . 6 September 1996.

FreeBSD システムをダイアルインサービス用に設定することは、 端末の代わりにモデムを扱うこと以外は、 端末の接続によく似ています。

19.4.1. 外づけモデムと内蔵モデムについて

ダイアルアップのサービスに関していえば、 外づけのモデムの方が適している ようです。これは、 多くの外づけのモデムは設定を不揮発ラムに書き込んで半 永久的に保存することができますし、また RS-232 に関する重要な情報を知る ための点滅するライトによるインディケータが 搭載されているからです。点滅 するライトは、 システムを見に来た訪問者に強い印象を与えるという効果だけ でなく、モデムが適切に動作しているかどうかを知るためにも 有効です。

一方、たいていの内蔵型のモデムには 不揮発性ラムが搭載されていないため、ディップ スイッチの変更以外に設定を保存する方法がありません。また、も しインディケータがついていても、おそらくコンピュータのケース カバーが 外されていなければその状態を確認するのは 難しいでしょう。

19.4.1.1. モデムとケーブル

外付けモデムを使用しているなら、 それにあったケーブルが必要です。 通常の信号が全て接続されている限り、標準的な RS-232C ケーブルで十分でしょう。

  • Transmitted Data (SD)

  • Received Data (RD)

  • Request to Send (RTS)

  • Clear to Send (CTS)

  • Data Set Ready (DSR)

  • Data Terminal Ready (DTR)

  • Carrier Detect (CD)

  • Signal Ground (SG)

FreeBSD で 2400bps 以上の転送速度を利用する場合には、 フロー制御のため に RTS 信号と CTS 信号が必要です。また、 接続の確立と回線の切 断を検出するために CD 信号を利用します。さらに、 DTR 信号を使っ て回線切断後のモデムのリセットを行います。ケーブルの中には、 総ての必要 な信号線が接続されていないものもありますので、 たとえば、回線切断後でも ログイン セッションが残ってしまうといった問題が発生した場合などには、 ケーブルに問題がある可能性もあります。

FreeBSD も他の Unix 系 OS と同様、回線の接続およ び切断の検出や回線の切断および回線切断後の モデムの初期化にハードウェア シグナルを利用します。FreeBSD は、モデムに対するコマンドの送信やモデ ムの状態の監視を行いません。パソコンで運用されている BBS への接続に慣 れている方にとっては、 ちょっとめんどうかもしれませんね。

19.4.2. シリアル インタフェースについて

FreeBSD では、NS8250-、NS16450-、NS16550- および NS16550A- に基づ いた EIA RS-232C (CCITT V.24) 規格のシリアル インタフェースをサポート しています。8250 および 16450 ベースのディバイスには1文字のキャラクタ バッファが搭載されています。また、16550 系のディバイスには、 16文字分 のバッファが搭載されていて、 はるかによいパフォーマンスを得られます (ただし、無印の 16550 では、バグがあって 16 文字バッファが利用できませ んので、可能であれば 16550A 系のディバイスを利用してください)。1文字 のバッファの物は、 16550 系のものと比べて OS にかける負荷が大きいので、16550A 系ディバイスの利用を強く推奨します。多数のシリアル ポートを利 用する場合や、負荷の高いシステムにおいては、 16550A 系ディバイスを使う ことで、 エラー発生率を低く押さえることができます。

19.4.3. 概要

端末に関しては、 ダイアルイン接続に割り当てられたそれぞれのシリアルポートに対して、 initgetty を起動します。たとえば、モデムが /dev/ttyd0 に割り当てられていたら、ps ax コマンドを実行すると、以下のような出力が得られるはずです。

 4850 ??  I      0:00.09 /usr/libexec/getty V19200 ttyd0

ユーザがモデムに電話をかけ、モデム同士が接続されると、 モデムの CD (Carrier Detect) が検出されます。その結果、 kernel がキャリア信号を検出して、getty によるポートのオープンの処理が終了します。 getty は、login: プロンプトを指定されている初期回線速度で送信します。 getty は、 正常に文字列を受信できるかどうか監視し、通常の設定では、 もし異常な文字列を検出した場合 (理由としては、 getty の速度とモデ ムの接続速度が異なっているような場合が考えられます)、 正常に文字列が 受信できるまで、getty は速度を変え続けます。

ユーザがログイン名を入力すると、 getty/usr/bin/login を起動して、 パスワードの入力を要求し、その 後ユーザのシェルを起動します。

19.4.4. 設定ファイル

FreeBSD のシステムへのダイアルアップによるアクセスを実現するために編集が必要と思われる設定ファイルが、 /etc ディレクトリに 3 つあります。まず、 /etc/gettytab には、 /usr/libexec/getty デーモンの設定を記述します。つぎに、 /etc/ttys に保存されている情報から、 /sbin/init はどの tty デバイスに対して getty のプロセスを実行するべきか判断します。 最後に、/etc/rc.serial スクリプトに、 シリアルポートの初期化のためのコマンドを記述することができます。

Unix にダイアルアップモデムを接続する方法には、 二つの考え方があります。一つの方法は、 ダイアルインしてくるユーザの接続速度に関係なく、 常にモデムとローカルのコンピュータの RS-232 インタフェースの接続速度を一定に保つように設定する方法です。 この設定の長所は、ユーザがダイアルインして接続されると、 即座にシステムからのログインプロンプトが送信されるということです。 短所は、システムが実際のモデム間の速度を知ることができないために、 Emacs のようなフルスクリーンのプログラムが、 端末との接続速度が遅い場合でも、 そのような場合に効果的な方法で画面出力を行わない点です。

もう一つは、モデムの RS-232 インタフェースとコンピュータの接続速度を、 モデム間の接続速度に応じて変化させるような設定です。たとえば、 モデム間 の接続が V.32bis (14.4 Kbps) ならば、 モデムとコンピュータの間の接続を 19.2 Kbps とし、 モデム間の接続が 2400 bps の時には、モデムとコンピュータ間も 2400 bps で接続するような設定をします。この場合、 getty は、モデムが返すリザルトコードからモデムとコンピュータの接続速度を認識することができませんので、 getty は、まず初期速度で login: という文字列を送信して、それに対する応答の文字列を監視します。 ここで、ユーザ側の端末に無意味な文字列が表示された場合、 ユーザは意味のある文字列を受信するまで Enter キーを繰り返し押さなければならないということを知っていると仮定しています。 もし接続速度が間違っている場合、getty は、 ユーザから送られた文字を無意味な文字列として扱い、 次の速度を試します。そして、ここで再度 login: プロンプトを送信します。 この一連の動作が異常な回数繰り返されることも考えられますが、 普通は 1 度か 2 度のキー入力があれば、 ユーザはまともなプロンプトを受信できます。 このログインの動作が前者の固定速度による方法に比べて美しくないのは明らかですが、 この方法では、低速度で接続しているユーザに対するフルスクリーンのプログラムからのレスポンスが改善されます。

このセクションでは、両方の設定方法について解説しますが、 どちらかというとモデム間の速度に応じて RS-232 インタフェースの速度が変化するような 設定の方に偏った説明になってしまうと思います。

19.4.4.1. /etc/gettytab

/etc/gettytab は、getty(8) の設定ファイルで、termcap(5) と同様の形式で記述されます。ファイルのフォーマットや定 義できる機能についての詳細については、gettytab(5) のマニュアルを ご覧ください。

19.4.4.1.1. 固定速度の設定

モデムとコンピュータ間の通信速度を固定して使う場合、 おそらく /etc/gettytab に特に変更を加える必要はないはずです。

19.4.4.1.2. 可変速度の設定

getty が利用するモデムとコンピュータの接続速度に関する情報を /etc/gettytab に記述する必要があります。もし、2400 bps のモ デムをお使いになるのであれば、既存の D2400 のエントリがそのまま利 用できるでしょう。

#
# Fast dialup terminals, 2400/1200/300 rotary (can start either way)
#
D2400|d2400|Fast-Dial-2400:\
        :nx=D1200:tc=2400-baud:
3|D1200|Fast-Dial-1200:\
        :nx=D300:tc=1200-baud:
5|D300|Fast-Dial-300:\
        :nx=D2400:tc=300-baud:

高速モデムをお使いの場合は、おそらく /etc/gettytab に新たなエントリを追加する必要があります。 以下の例は、14.4 Kbps のモデムを、 最大インタフェース速度を 19.2 Kbps として利用するためのエントリです。

#
# Additions for a V.32bis Modem
#
um|V300|High Speed Modem at 300,8-bit:\
        :nx=V19200:tc=std.300:
un|V1200|High Speed Modem at 1200,8-bit:\
        :nx=V300:tc=std.1200:
uo|V2400|High Speed Modem at 2400,8-bit:\
        :nx=V1200:tc=std.2400:
up|V9600|High Speed Modem at 9600,8-bit:\
        :nx=V2400:tc=std.9600:
uq|V19200|High Speed Modem at 19200,8-bit:\
        :nx=V9600:tc=std.19200:

上記の例を利用した場合、 パリティなし、8ビットの接続が行われます。

上記の例では、まず 19.2 Kbps (V.32bis) によるモデムとコンピュータ間の接続を試み、続いて 9600 bps (V.32)、2400 bps、1200 bps、300 bpsと順に試み、再び 19.2 Kbps による接続を試みるという循環に入ります。 この接続速度の循環は、nx=(next table) の機能で実現されています。また、 各行はそれぞれ tc=(table continuation) の機能を使って、 その他の接続速度に依存した 標準的な 設定を取り込んでいます。

もし、お使いのモデムが 28.8 Kbps であったり、14.4 Kbps の圧縮転送の機能を有効に利用したい場合は、19.2 Kbps よりも速い速度を利用するように設定する必要があります。 以下に 57.6 Kbps から接続を試みる gettytab の設定例を示しておきます。

#
# Additions for a V.32bis or V.34 Modem
# Starting at 57.6 Kbps
#
vm|VH300|Very High Speed Modem at 300,8-bit:\
        :nx=VH57600:tc=std.300:
vn|VH1200|Very High Speed Modem at 1200,8-bit:\
        :nx=VH300:tc=std.1200:
vo|VH2400|Very High Speed Modem at 2400,8-bit:\
        :nx=VH1200:tc=std.2400:
vp|VH9600|Very High Speed Modem at 9600,8-bit:\
        :nx=VH2400:tc=std.9600:
vq|VH57600|Very High Speed Modem at 57600,8-bit:\
        :nx=VH9600:tc=std.57600:

もし、お使いの CPU が低速のものであったり、CPU に対する負荷が高い場合で、16550A 系のシリアルポートをお使いでない場合、 57.6 Kbps の接続において、siosilo エラーが発生するかもしれません。

19.4.4.2. /etc/ttys

/etc/ttys ファイルの設定は、例19.1「端末の項目を /etc/ttys に追加する」 で扱われています。 モデムの設定も似たようなものですが、getty に異なる引数を渡して、異なる端末種別を指定しなければなりません。 固定速度および可変速度両方に共通する形式は次のようになります。

ttyd0   "/usr/libexec/getty xxx"   dialup on

1 番目の項目は、このエントリで対象とするデバイススペシャルファイルです。 上の例では ttyd0 として、 /dev/ttyd0getty に監視させることを表しています。2 番目の項目 "/usr/libexec/getty xxx" (xxx は初期段階で使われる gettytab のエントリに置き換えてください) が、init がこのディバイスに対して起動するプロセスです。3 番目の dialup は、デフォルトのターミナルタイプです。 4 番目の on は、 この行が有効であることを init に対して示しています。5 番目の項目に secure を指定することもできますが、これは、 たとえばシステムのコンソールのように、 物理的に安全な端末に対してのみ指定するようにしてください。

デフォルトのターミナルタイプ (上記の例では dialup) は、ローカルのユーザの好みによって異なってきます。 ユーザがログインスクリプトをカスタマイズして、ターミナルタイプが dialup の時には自動的に他のターミナルタイプを設定できるように、 ダイアルアップのポートのデフォルトのターミナルタイプには dialup が伝統的に用いられています。 しかし、筆者のサイトでは、ほとんどのユーザが VT102 エミュレーションを使っているので、 ダイアルアップのポートのデフォルトターミナルタイプとして vt102 を指定しています。

/etc/ttys の修正がすんだら、 以下のようなコマンドを使って init プロセスに HUP シグナルを送り、/etc/ttys を読み込み直させてください。

# kill -HUP 1

ただ、もし初めてシステムを設定しているのであれば、 モデムが適切に設定されて接続されるまでは、 init に対してシグナルを送らない方がいいかもしれません。

19.4.4.2.1. 固定速度の設定

速度を固定する設定では、/etc/ttys の中で、getty に対し て固定速度のエントリを指定する必要があります。たとえば、 以下の例はポートのスピードが 19.2 Kbps に固定されたモデムのための ttys のエントリです。

ttyd0   "/usr/libexec/getty std.19200"   dialup on

モデムが異なる速度で固定されている場合は、 std.19200 のかわりに std.speed を適切な値に置き換えたものにしてください。 /etc/gettytab に挙がっている適切な種類を使うようにしてください。

19.4.4.2.2. 可変速度の設定

可変速度の設定では、ttys のエントリが、/etc/gettytab の中の適切な 自動速度調整 の初期設定のエントリを参照していなければな りません。 たとえば、もし前述の 19.2 Kbps から接続を試みる可変速度の設定例 (V19200gettytab エントリ)をそのまま ttys に追加したのであれば、 ttys エントリは以下のようになります。

ttyd0   "/usr/libexec/getty V19200"   dialup on

19.4.4.3. /etc/rc.serial

V.32、V.32bis または V.34 モデムのような高速モデムを利用する場合、ハードウェア (RTS/CTS) フロー制御を行う必要があります。FreeBSD kernel のモデムポートにハードウェアフロー制御のフラグを設定するための stty コマンドを、 /etc/rc.serial に記述できます。

たとえば、シリアルポート 1 番 (COM2) のダイヤルインおよびダイヤルアウト初期化デバイスに termios フラグ crtscts を設定するには、次の行を /etc/rc.serial に追加するとよいでしょう。

# Serial port initial configuration
stty -f /dev/ttyid1 crtscts
stty -f /dev/cuai01 crtscts

19.4.5. モデムの設定

もし、あなたのモデムがパラメータを不揮発ラムに 保存できるタイプならば、MS-DOS 上の Telix や FreeBSD 上の tip などのような通信プログラム を使って、 パラメータを設定してください。getty が利用する初期速度でモデムに接続して、以下の条件を満たすよ うに不揮発ラムの設定を変更してください。

  • 接続時に CD 信号がオンになる

  • 接続時に DTR がオンになり、 DTR オフで回線を切断しモ デムをリセットする。

  • 送信時フロー制御には CTS を利用。

  • XON/XOFF によるフロー制御を行わない。

  • 受信時のフロー制御は RTS を使用。

  • Quiet mode (リザルト コードを返さない)

  • コマンド エコーを返さない。

これらを実現するためのコマンドやディップ スイッチの設定に関しては、モ デムのマニュアルを参照してください。

以下に、USRobotics Sportster の 14,400 bps の外づけモデムの設定例を示 しておきます。

ATZ
AT&C1&D2&H1&I0&R2&W

ことのついでに、たとえば、V42.bis や MNP5 のデータ圧縮を使用するかど うかなどのモデムの他の設定について確認、 調整しておくのもよいかもしれま せん。

さらに、USRobotics Sportster の 14,400 bps の外づけモデムでは、以下の ようなディップ スイッチの設定も必要です。他のモデムをお使いの方も、以 下の例を設定の参考にしてください。

  • スイッチ 1: UP — DTR 標準

  • スイッチ 2: N/A (リザルトコードを単語形式にするか数値形式にするか)

  • スイッチ 3: UP — リザルトコードを返さない

  • スイッチ 4: DOWN — コマンドエコーを返さない

  • スイッチ 5: UP — 自動着信

  • スイッチ 6: UP — CD 標準

  • スイッチ 7: UP — 不揮発ラムからデフォルト値をロードする

  • スイッチ 8: N/A (Smart Mode/Dumb Mode)

リザルト コードを返さないように設定しておかないと、 getty が誤っ て login: プロンプトをコマンド モードのモデムに送信してしまった場 合に、 モデムがこの入力をエコーしたり、この入力に対するリザルト コード を返してしまったりすることになります。この結果として、 モデムと getty の間で延々と無意味なやりとりが続いてしまう可能性があります。

19.4.5.1. 固定速度の設定

固定速度の設定では、 モデムとコンピュータ間の通信速度をモデムとモデム間 の接続速度に関係なく、常に一定に保つように、 モデムを設定する必要があり ます。USRobotics Sportster の 14,400 bps 外づけモデムの場合、以下のコ マンドで、 モデムとコンピュータ間の速度が、コマンド送信時の速度に固定さ れます。

ATZ
AT&B1&W

19.4.5.2. 可変速度の設定

可変速度の設定では、シリアル ポートの速度が、 着信速度に応じて変化する ように設定しなければいけません。 USRobotics Sporster の 14,400 bps 外 づけモデムの場合、 以下のコマンドで、エラー訂正機能を利用した通信の場合 は、 コマンドを送信した時の通信速度にシリアル ポートの速度を固定し、エ ラー訂正機能を利用しない接続では、 シリアル ポートの速度が変化するよう に設定されます。

ATZ
AT&B2&W

19.4.5.3. モデムの設定の確認

ほとんどの高速モデムには、 現在の設定をある程度人間にも理解できる形式に して表示させるコマンドがあります。USRobotics Sporster の 14,400 bps 外づけモデムの場合は、ATI5 コマンドで、現在の不揮発ラムの設定を 表示することができます。 さらに、ディップ スイッチの設定も含めた現在の 設定を確認するためには、ATZ コマンドを送信してから、ATI4 コマンドを送信してください。

他のメーカーのモデムをお使いの場合は、 モデムのマニュアルで設定値の確認 方法を確認してください。

19.4.6. トラブルシューティング

以下の手順でダイアル アップ モデムの動作を確認することができます。

19.4.6.1. FreeBSD システムの動作確認

モデムを FreeBSD システムに接続し、 システムをブートします。あなたのモ デムにモデムの状態を確認するためのインジケータがあれば、 DTR のイ ンジケータの状態に注目してください。もし、 システムのコンソールに login: プロンプトが表示された時に、DTR のインジケータが点灯 すれば、FreeBSD が適切なポートに対して getty を起動し、モデムへ の着信を待っている状態であることを意味しています。

もし DTR のインジケータが点灯しない場合は、システムのコンソールから FreeBSD にログインして、ps ax を実行し、 FreeBSD が適切なポートに対してgetty プロセスを起動しようとしているのかどうか確認してください。 プロセスに関する情報の中に、 以下のような行が表示されるはずです。

  114 ??  I      0:00.10 /usr/libexec/getty V19200 ttyd0
  115 ??  I      0:00.10 /usr/libexec/getty V19200 ttyd1

モデムにまだ着信がない状態の時に、 以下のように上とは異なる出力があった 場合、getty は既にモデム ポートのオープンを終了したということに なります。

  114 d0  I      0:00.10 /usr/libexec/getty V19200 ttyd0

getty は、CD (carrier detect) 信号がオンの状態になるまで、 ポートのオープンを完了することはできませんので、 この場合は接続に問題が あるか、あるいはモデムの設定に問題があることが考えられます。

もし、期待した ttydN ポートをオープンしようとしている getty が見あたらない場合は、再度 /etc/ttys の内容を確認し、 書式などに誤りがないか 調べてみてください。また、ログ ファイル /var/log/messagesinit および getty から何か出力がないかどうかも確認してみてく ださい。 もし何かメッセージが記録されていたら、再度 /etc/ttys/etc/gettytab の二つの設定ファイルと、 ディバイス スペシャルファイル /dev/ttydN を確認し、 記述に誤りがないか、足りないエントリがないか、 足りないディバイス スペシャルファイルがないかといった 点について調べてみてください。

19.4.6.2. モデムで接続してみる

実際にモデムを使って別のコンピュータから 接続してみてください。この時、8 ビット、パリティなし、 1 ストップビットで接続するようにしてください。 接続後すぐにプロンプトが返ってこない場合や、 無意味な文字列が表示される 場合は、1秒に1回くらいの割合で Enter キーを押してみてください。 しばらくたって、なおも login: プロンプトが現れない場合 は、BREAK 信号を送信してみてください。この時、端末側で使って いるモデムが高速モデムならば、 このモデムのインタフェースの接続速度を固 定してから、 再度ダイアル インしてみてください。(たとえば、USRobotics Sportster の場合は、AT&B1)

それでもまだ login: プロンプトが表示されない場合は、 /etc/gettytab の以下の点について再度確認してみてください。

  • /etc/ttys の対応する行の 2番目の項目で、/etc/gettytab の中で定義されているエントリが指定されているか

  • nx=/etc/gettytab の中で定義されているもの が指定されているか

  • tc=/etc/gettytab の中で定義されているもの が指定されているか

もしダイアル インしても、FreeBSD システム側のモデムが応答しない場合は、FreeBSD 側のモデムが DTR がオンになった時に電話にでるように設定さ れているかを確認してください。 もしモデムの設定に問題がなさそうならば、 モデムのインジケータ (がもしあれば) で、 DTR がオンになっているか を確認してください。

この確認のステップを数回繰り返しても うまくいかない場合は、一度休憩して、 しばらくたってから挑戦してみましょう。それでもだめなら、 おそらく FreeBSD general questions メーリングリスト にあなたのモデムについての情報と問題を書いたメールを送れ ば、 メーリング リストのメンバーが問題の解決を助けるべく努力してくれる でしょう。

本文書、および他の文書は ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/ からダウンロードできます。

FreeBSD に関する質問がある場合には、 ドキュメント を読んだ上で <questions@FreeBSD.org> まで (英語で) 連絡してください。

本文書に関する質問については、 <doc@FreeBSD.org> まで電子メールを (英語で) 送ってください。