次のページ 前のページ 目次へ

14. コンピュータセットアップ (設定) の詳細

端末のためにコンピュータをセットアップするには各種ファイルを編集します。 幸運な場合は、/etc/inittab を編集するだけですむでしょう。コンソール (または、作業用端末) で編集することになります。

14.1 Getty (/etc/inittab ファイル)

コンピュータの起動時(あるいはランレベルを切り変えた時) に、シリアルポ ート上でログインプロセスが走った状態にしておくには、/etc/inittab ファ イル内に getty コマンドを書いておかなければいけません。getty は GET TT Y (端末) のことで、端末の状態を調べます。各端末には専用の getty コマン ドが必要です。どんな /etc/inittab ファイルにも、コンソール用の getty コマンドが少なくとも 1 つはあります。これを見つけて、その隣りに本当の 端末用の getty コマンドを追加してください。このファイルにはコメントに されたテキスト端末用の getty のサンプル行があるので、そこをコメントで はないようにして (先頭の # を消す)、2、3 の引数を変更する必要がありま す。

使用可能な引数は、あなたが使う getty によります。
端末の直接接続に最適な getty を 2 つ挙げます。

  1. agetty (時々 getty とだけ呼ばれる): かなりセットアップしやすくて、設定 ファイルもありません。 Agettyをご覧ください。
  2. getty (getty_ps の一部)をご覧ください。
モデム用に最適な getty を 2 つ挙げます。
  1. mgetty: モデムに最も的しています。 端末用としても動きますが、少し劣り ます。
  2. uugetty: モデム専用で、getty_ps パッケージの一部です。
モニターがコンソールである場合にだけ使えるシンプルな getty です。テキ ストインターフェースを使うほとんどの Linux ユーザは、これをセットアッ プして、本当のテキスト端末は使いません。
  1. mingetty: モニターコンソール専用です。

使いたい getty を持っていない場合、他のディストリビューションを調べま す。もし、それが RPM や Debian の package ならば、alianプログラムを使 えば RPMにも、debにも、tar ballにも相互に変換できます。 (紹介した gett y たちの)ソースコードは Serial Softwareからダウンロードできるでしょう。

モデムコントロール線を使わないのなら (例えば、最小限の 3 つの端子 -- 送信、受信、信号グランド -- を使うなら)、``ローカル'' フラグ を使って getty に認識させなさい。このフォーマットは使用する getty に依存します。

Agetty (多分 getty という名前でしょう)

/etc/inittab のサンプル行です。

S1:23:respawn:/sbin/getty -L 19200 ttyS1 vt102

S1 は ttyS1 を示します。23 は、ランレベル 2 か 3 で getty を起動するこ とを意味します。respawn は、getty が kill されたら自動的に再起動すると いうことです。/sbin/getty はgetty コマンドファイルです。 -L は、ローカ ル (モデムコントロールを無視する) という意味です。-h (例にはありませ ん) は、ハードウェアフロー制御を有効にします (stty crtscts と同じ)。 19200 はボーレートです。ttyS1 は /dev/ttyS1 のことです (MS-DOS での COM2)。vt102 は端末タイプで、getty が環境変数 TERM をこの値にセットします。 設定ファイルはありません。getty を編集した後で、コマンドラインで ``init q'' とタイプすれば、ログインプロンプトを見ることができます。

Agetty のパリティ検出

agetty プログラムは端末側でセットされたパリティを自動検出できます。た だし 8 ビットデータ + 1 パリティビットの設定を使うと、自動検出はうまく 働きません。 Agetty の 8 ビットデー タにお けるパリティをご覧ください。 stty を使ってパリティをセットしても、agetty はそれを解除して しまいます。なぜなら agetty は到着してきたパリティビットを、デー タビットと同じように処理しようとするからです。これはなぜかと言うと、 agetty がパリティを自動検出するためには、あなたのログイン名入力の 最終ビット (おそらくパリティビット) を取得することが必要だからです。で すからパリティを使う場合は、端末側だけで有効にし、agetty には自動 検出させて、コンピュータ側の設定も任せてしまいましょう。お使いの端末が 受信パリティをサポートしている場合には、何か入力して getty がパリ ティを検知するまで、当初ログインプロンプトは壊れたように見えるかもしれ ません。プロンプトが壊れていると、訪問者等にログインの試行をやめさせる 効果があるでしょう。これは望ましい効果かもしれません。

パリティの自動検出には時々問題があります。最初にログイン名をタイプした 後で、あなたをログインし終えるように、agetty が login プログ ラムを起動することで発生します。最初のログインの試みが失敗すると、 login はログインするための全ての試み (ログイン名の入力を含む) を 実行するために再び起動します。問題は、login プログラムがパリティ を検出しないのに、agetty だけがパリティを検出できることにあります。 ある理由から login プログラムを終わらせて、正しいパリティがまだ検 出できないなら、login はパリティを検出できないので問題が起るでしょ う。間違ったパリティなら、login プログラムはタイプした文字を正し く読めないのでログインできません。端末が受信パリティをサポートするなら、 誤った画面を見続けることになります。

様々な方法で、この ``ログイン'' ループに入るでしょう。一文字か二文字だ けのログイン名をタイプし、リターンキーを押したとしましょう。これらの文 字がパリティを検出するのに十分でないなら、パリティを検出する前にログイ ンが走るでしょう。端末に電源が入ってなくて、agetty が最初に走る時に接 続しなかったら、時々こういう問題が起ります。あなたがこのような ``ログ イン'' ループで立往生したら、解決は、agetty が ``タイムアウト'' で再度 走るまで 1 分程待つことです。

Agetty の 8 ビットデータにおけるパリティ

残念ながら agetty はデータ長が 8 ビットでのパリティを検出できません。 (1999 年後半現在) agetty にはパリティの自動検出を無効にするオプション がないために、間違った検出をしてしまうことがあります。結果として、ログ イン処理を間違って伝えたり、誤ったパリティをセットしてしまうのです。し たがって、8 ビットデータとパリティを一緒に使うことは不適切だと思います。

getty (getty_ps の一部)

(Greg Hankins 著 Serial-HOWTO(の古い版) を参考にしています)
getty 用の設定ファイル /etc/gettydefs に、あなたの端末を 使うためのエントリがなければ加えてください。

# 38400 bps ダム端末エントリ
DT38400# B38400 CS8 CLOCAL # B38400 SANE -ISTRIP CLOCAL #@S @L login: 
#DT38400

# 19200 bps ダム端末エントリ
DT19200# B19200 CS8 CLOCAL # B19200 SANE -ISTRIP CLOCAL #@S @L login: 
#DT19200

# 9600 bps ダム端末エントリ
DT9600# B9600 CS8 CLOCAL # B9600 SANE -ISTRIP CLOCAL #@S @L login: #DT
9600

望むなら、興味を引くようなものをログインバナーとして getty に表示させ ることができます。私の例ではシステムの名称とシリアルライン名を表示して います。以下のようなものを追加することができます。

@B    現在の (@B が評価された瞬間の) bps の値
@D    現在日付 MM/DD/YY 形式 
@L    getty がアタッチしているシリアルライン
@S    システム名称
@T    現在時刻 HH:MM:SS (24 時間制) 形式
@U    現在ログインしているユーザの数。これは非ヌル値の ut_name フィー
      ルドがある /etc/utmp ファイルのエントリー数です。
@V    デフォルトファイルで与えられる VERSION の値
1 つの '@' 記号を表示するには、'\@' か '@@' のどちらかを使います。

/etc/gettydefs の編集が終ったら、構文が正しいことを次の方法で確かめら れます。

linux# getty -c /etc/gettydefs

端末に接続されるシリアルポートの getty か uugetty の設定ファイル ((/etc/default/{uu}getty.ttySN か /etc/conf.{uu}getty.ttySN) がないことを確認してください。 おそらくこれがあると、端末で getty が動くのをじゃまするでしょうか ら、あれば削除しておいてください。

シリアルポートで getty が動くように、/etc/inittab を編集 してください (あなたの環境に合った正しい情報 -- ポート、通信速度、デフ ォルトの端末タイプ -- に置き換えます)。

S1:23:respawn:/sbin/getty ttyS1 DT9600 vt100
init を再起動します。
linux# init q 

この時点で、端末にログインプロンプトが表示されるはずです。プロンプトを 表示させるのにリターンキーを叩かないといけないかもしれません。

mgetty

``m'' はモデムを表します。このプログラムは主にモデムのためであって、 1999 年半ばの時点ではテキスト端末とは相性が悪いようです。端末用のドキュ メントは貧弱なもので、端末で使う方法を理解するのに、モデム用のドキュメ ントを苦労して読みながら設定する必要があるでしょう。端末用の設定は、 /etc/mgetty/mgetty.config の最終行を見てください。mgetty に(多くの端末 で使われる) ソフトウェアフロー制御(Xon/Xoff) をサポートさせるには、 mgetty を再コンパイルしてください。将来は最初からサポートされるんじゃな いでしょうか。端末でもモデムと同じ getty を使えるならいいのですが、 megetty は目的に合うように少しいじる必要があります。

14.2 Stty と Setserial

シリアルポートを設定するために ``stty'' コマンドと、``setserial'' コマ ンド (の両方) があります。stty で設定する必要のある幾つか (あるいは全 て) は、 getty を通じて設定でき、setserial を使うこともないので、stty と setserial のどちらも使わなくていいかもしれません。2 つのコマンド (getty と setserial) は、違う個所を設定します。stty がほとんどやって、 setserial は割込みやポートアドレス等の低レベル部分を設定します。設定を ``保存'' するために、コンピュータが起動する度にこれらのコマンドを実行 するように、あるファイル (シェルスクリプト) に書いておかねばなりません。 Linux のディストリビューションにはよく、setserial を実行するシェルスク リプトが準備されていますが、stty はあまり必要ないので、稀にしか実行す るようにはなっていません。

14.3 Setserial

本章は、モデム、シリアル、そしてテキスト端末の 3 つの HOWTO について書 いています。これらは、HOWTO の中にもあるように、少しマイナーな違いが幾 つかあります。

はじめに

ラップトップ (PCMCIA) では setserial を使用しないでください。 setserial は、シリアルポートの I/O アドレスをデバイスドライバに教 えたり、シリアルポートの割込み (IRQ) を設定したり、UART のタイプを調べ たりするプログラムです。またドライバが現在どのような設定になっているか を示します。加えて、ハードウェアを調べて UART のタイプや IRQ を決める こともできますが、これには厳しい制限があります。 検出をご覧ください。PnP シリアルポートのハードウェアで、IRQ や ポートアドレスの設定ができないことに注意してください。

訳注:PCMCIAや、PCCardのシリアルポートカードの設定は pcmcia_cs で行い ます。setserial はラップトップ本体に組み込まれたシリアルポートには使え ます。

もし 1 つか 2 つの組み込みのシリアルポートしかないなら、setserial を使 わなくても正しく設定できます。そうでなければ (またはシリルポートで問題 があれば)、おそらく setserial を使うことになります。 setserial の man ページの他に、/usr/doc/setserial.../ か /usr/share/doc/setserial にある情報も調べておきましょう。あ なたのディストリビューションで setserial をどのように扱うかわかる筈です。

Setserial は、ドライバに IRQ などを割当てる目的で、スタートアップのシ ェルスクリプトにより、たいていはブート時に自動的に実行されます。これは、 シリアルモジュールがロードされている時 (あるいは、同等機能がカーネルに 組み込みでコンパイルされている場合) にのみ働きます。 (何かの理由で) シリ アルモジュールを後でアンロードしたら、カーネルは、先に変更した内容を忘 れてしまいます。それで、設定を回復するのに setserial を再度実行しなけ ればならなくなるのです。始動時のスクリプトから実行するのに加えて、 setserial と同様なものを、シリアルモジュールがロードされた時に早い段階で実 行します。したがって、画面上の起動メッセージを見ている時に 2 度実行し たように見えますが、実際、2 度実行しているのです。

setserial は、ポートが閉じられた後に操作を持続する時間を設定できます (メインメモリのバッファに残っているデータを出力するため)。これは 1200 以下のボーレートで必要です。そしてまた、``フロー制御'' による待ちが多 発するなら高速の通信においても必要になるでしょう。man ページの ``closing_wait'' をご覧ください。シリアルポートがプラグアンドプレイな ら、プラグアンドプレイやシリアルについての他の HOWTO 文書を参照すると 良いでしょう。

setserial は、シリアルポートハードウェア自体の IRQ と I/O アドレスのど ちらも設定しません。それはジャンパーかプラグアンドプレイで設定されます。 あなたは、ハードウェアで設定されているのと同じ値を setserial に教えな ければなりません。使えそうな値をでっちあげて、setserial に教えたらダメ ですよ。でも I/O アドレスを知ってて IRQ を知らないなら、IRQ を決めるよ うに setserial に指示はできます。

引数をつけずに setserial とタイプすれば、使用可能なコマンドリスト (1 文字ではなくトラブルシューティングの時に使う -v の冗長オプションを付け たように) 見ることができます。setserial は I/O アドレスを ``ポート'' と呼びます。以下のようにタイプしたら、

setserial -g /dev/ttyS*
指定のポートでデバイスドライバがどのように設定されているかの情報を表示 します。``UART: unknown'' と表示されたら、おそらく UART が存 在しないということです。言い換えると、指定のシリアルポートがなくて、ポ ートに関する他の情報は無意味なので、無視すべきです。指定のシリアルポー トが本当にあるなら、setserial がそれを認識していないので、修正する必要 があります。

-g オプションに -a を追加すればさらに詳しい情報を表示しますが、小数の 人達がこれらの情報を処理 (あるいは理解) する必要があるので、デフォルト の設定にしておけばよいでしょう。普通の場合は、``setserial'' の報告する 通りにハードウェアを設定すればよいのですが、問題が起こったら、 ``setserial'' が誤作動することを知るよい機会です。実際、setserial によっ てまったく架空の I/O アドレスや IRQ を割り付けたり、欲しいと思うような UART の種類を設定したりできます。そして次に ``setserial ...'' とタイプす ると、そのインチキな値を文句なしに表示するでしょう。あるポートでそのよ うな設定を使ったとしても、もちろんシリアルポートドライバーはそんなイン チキな値でまともに動いたりしません。だから、``setserial'' にそんなパラ メータを与えたら何かが起ります。設定が不正であっても警告はなく、他と重 なった IRQ や I/O ポートアドレスを作ったりした結果、悲惨なことが起こる でしょう。

setserial で設定した値は PC の電源を切ると失なわれますが、PC が再起動 した時に設定ファイルによって設定値 (あるいは前回の値) をリストアします。 最新のバージョンでは、setserial による変更は自動的に設定ファイルに保存 されます。古いバージョンでは、設定ファイルは変更があったら手で編集され るので、ブートからブートの間の設定は同じものが残されます。 設定スクリプト / ファイルをご覧ください。

検出

適切なオプションでは setserial は (与えられた I/O アドレスで) シリアル ポートを検出できますが、あなたは I/O アドレスの見当をつけとかないとい けません。例えば、/dev/ttyS2 を検出しようとする場合、ttyS2 の I/O アド レスが 2F8 だと考えて、そこだけの検出をするでしょう。ttyS2 は違うアド レスだと setserial に教えてやれば、そのアドレスなどを使って検出するは ずです。

検出の目的は、UART がそこに存在するのか、もしあるなら IRQ の値はなにか を知ることです。検出を試みる早い方法として、モデムを検出する wvdialconf や、ごく早い段階でのブートメッセージ、あるいは pnpdump--dumpregs などがありますが、``setserial'' は主に最後の手段として使いなさい。物理的なアドレスを検出するには、 setserial に -v (冗長) と autoconfig オプションをつけて実行 します。UART のタイプは 16550A などと結果を表示すれば OK ですよ。代り に UART の種類が ``unknown'' と表示したら、その I/O アドレスには どんなシリアルポートもないんじゃないでしょうか。いくつかの安いシルアル ポートはきちんと認識できないので、unknown と表示されても、シリア ルポートがある可能性はあります。

UART の種類を自動で調べる以外にも、setserial は IRQ を自動で検出できま すが、常に正しく動作するわけではありません。setserial 2.15 以降のバー ジョンのものは、テスト検出した最後の結果を保存しておいて、次に Linux が起動するとき使えるように /etc/serial.conf に書き込みます。 ブートのときに、シリアルモジュールがロードされて (または似た動きで)、 UART の検出が自動で行われて、検出結果が画面に表示されます。でも IRQ は 間違って表示されるかもしれません。同様な 2 番目の報告はスクリプトによ るもので、普通は検出したものではないので、ハードウェアが実際にどのよう にセットされたかに関する情報は不正確です。それは単に誰かがスクリプトに 書いた日付か、 /etc/serial.conf ファイルに保存されたデータを表示するだ けなのです。

2 つのシリアルポートの両方共に、同じ IO アドレスがハードウェア上にセッ トされているかもしれません。もちろん、これは許されるものではありません が、時々起ります。実際にシリアルポートが 2 つあるのに 1 つだけ検出して しまいます。しかし、それぞれ違った IRQ が設定されているなら、IRQ の検 出では IRQ = 0 と表示されるかもしれません。筆者の場合、setserial を使 用したら架空の IRQ の値を検出しました。

ブート時の設定

カーネルがシリアルモジュールをロードした (あるいは ``モジュールと同等 のもの'' がカーネルに組み込まれた) 時に、ttyS{0-3} だけが自動で検出さ れ、ドライバは IRQ の 4 と 3 だけを使って (ハードウェアで実際にどの IR Q 値が使われているかに無頓着に) 設定します。これは setserial が走った ときのように、ブート時のメッセージとして確認できます。もし 3 つ以上の シリアルポートをお持ちなら、IRQ の衝突を招くかもしれません。

setserial に本当の IRQ (あるいは他の理由) を伝えることで、このような衝 突を避けるために、setserial を再起動するようなファイルがあるはずです。 これはプロセスがシリアルポートを使う前のブートの早い段階で処理されます。 実際に、あなたのお使いのディストリビューションでは、ブート時の起動スク リプトファイルから setserial プログラムを自動起動するように設定されて いるはずです。特定のディストリビューションでこのようなことを取り扱う方 法についてのより詳しい情報は、``setserial...'' という名前のファイルか、 /usr/doc/ や /usr/share/doc ディレクトリから見つけることができると思い ます。

設定スクリプト / ファイル

あなたの目的は、ブート時に setserial を起動する /etc ツリーのスクリプ トファイルを修正 (または生成) することです。ほとんどのディストリビュー ションがそのようなファイル (でも 始めは /etc ツリーにないかもしれませ ん) を提供しています。さらに、setserial 2.15 以上では上記スクリプトが 使う /etc/serial.conf ファイルがよく用いられるので、setserial を起動す るスクリプトのディレクトリを編集する必要はありません。加えて、単にコマ ンドライン上で setserial を使うなら、この設定ファイルを最終的に変更す ることになります。

バージョン 2.15 以前では、やることは全てスクリプトの編集です。2.15 以 降では 3 つの内どれか 1 つをやる必要があります。1. スクリプトの編集。 2. /etc/serial.conf の編集。3. /etc/serial.conf を自 動編集するために ``setserial'' を実行する。これら 3 つのどれを選択する かは、あなたのディストリビューションに依存することで、またどのようにセッ トアップしたかにもよります。

スクリプトの編集 (バージョン 2.15 以降 : 不正確です)

ssetserial 2.15 (1999年現在) 以前では、setserial を設定するための /etc/serial.conf ファイルはまだなかった。それで、ブート時に ``setserial'' を起動するファイルを探して、編集する必要がありました。も しなかったら、作らなければなりません (あるいは、ブート時の早い段階で実 行するファイルにコマンドを書いておく)。そのようなファイルが現在でも使 われているなら、それは /etc ディレクトリツリーのどこかにあるはずです。 でも Redhat 6.0 以前では /usr/doc/setserial/ にありましたが、それを使 う前に /etc ツリーに移動しておく必要があります。そんなファイルを探すの に ``locate'' を使うことができます。例えば、locate "*serial*" とタイプします。

スクリプト /etc/rc.d/rc.serial は以前は普通に使われていました。 Debian ディストリビューションでは /etc/rc.boot/0setserial が 使われました。/etc/rc.d/rc.local が一度使われたことがあります が、あまり使い易くなかったので、ごく早い段階で使われなくなりました。 rc.local がシリアル通信エラーを発する前に、他のプロセスがシリアルポー トをオープンしようとしていると報告されたりしました。

そんなファイルが提供されていたら、コメントアウトしたサンプル行を含んで いるはずです。これらの数行のコメントを外して、そしてまた編集すれば、正 確に設定できることでしょう。setserial へのパスと正確なデバイス名とがき ちんとセットされていることを確認してください。ちゃんと動くことを確認す るために、手動でこのファイルを実行してテストすることができます (スーパ ーユーザになって名前をタイプすればよい)。このようなテストをすることは、 確認のためにリブートを繰り返すよりはるかに早い方法です。もちろんコマン ドライン上で単に setserial コマンドをタイプすることでもテストはできま す。

ttyS3 の UART や IRQ を setserial に自動的に決定させたいなら、このよう に追加します。

/sbin/setserial /dev/ttyS3 auto_irq skip_test autoconfig

自動的に実行したいポート毎にこの行を追加します。あなたのシステムに本当 にあるデバイス名を指定するよう注意してください。幾つかの場合では、ハー ドウェアの原因でうまくいかないでしょうから、IRQ や UART の種類を知って いるなら ``setserial'' に明示的に割当ててください。例えばこのように。

/sbin/setserial /dev/ttyS3 irq 5 uart 16550A  skip_test 

バージョン 2.15 以上 (お使いのディストリビューションが対応済であるこ と) の場合、起動時に setserial を実行する /etc/init.d/setserial かその 類のスクリプトファイルがユーザによって編集されると思っていなかったので、 かなりやっかいです。 /etc/serial.conf を使った新しい設定方法 をご覧ください。

/etc/serial.conf を使った新しい設定方法

setserial 2.15 以前のバージョンでの設定方法は、起動時に setserial を実 行するシェルスクリプトを手で編集することでした。 スクリプトの編集 (バージョン 2.15 以降 :不 正確です)をご覧ください。setserial 2.15(1999年) になるとこのス クリプトファイルは編集されず、代りに /etc/serial.conf 設定ファ イルからデータを得るようになりました。その上、serial.conf さえも編集す る必要がなくなっていて、なぜかというと、コマンド行で ``setserial'' コ マンドを使えば自動で serial.conf を適切に編集してくれるからです。

これは、Linux がブートする毎に setserial がちゃんと動作するよう設定す るために、あなたがどんなファイルも編集しなくてすむようにするつもりだっ たのです。でもそこには重大な落し穴があって、なぜなら実際には ``setserial'' が serial.conf を編集していないからなのです。各ディスト リビューションがこのことを違って扱ったために混乱は増しています。加えて 、あなたがそれを編集することでも違った動きとなっています。

これでなにが起きるかというと : PC をシャットダウンした時に、ブート時に ``setserial'' を実行するスクリプトが再び実行しますが、今度は ``stop'' ケースの部分だけを実行するのです。スクリプトは ``setserial'' の現在状 態を知るために ``setserial'' を実行し、serial.conf にその情報を書き込 むのです。従って、serial.conf ファイルを変更するために ``setserial'' を実行した時はすぐに変更されませんが、シャットダウンの場合だけは通常は 変更がすぐ反映されます。

今はあなたはどのような問題が起きるか多分推測できるでしょう。普通にシャ ットダウンしなかったとしたら (誰かが突然電源を切ったりして...)、変更は 保存されません。``setserial'' をいろいろ試していて、最後にオリジナルの 設定に戻すのを忘れた (あるいはオリジナルを戻し間違った) としたら、``試 験的'' な設定が保存されてしまいます。

手で serial.conf を編集しても、シャットダウンの時に setserial の状態に 戻ってしまうので、変更は保存されませんよ。シャットダウンで serial.conf を変更しない方法は、serial.conf の最初の行にある ``###AUTOSAVE###'' あるいはその類の行を削除することです。最近のディストリビューションのな かには、インストール直後の最初のシャットダウンの後に最初の行にある ``# ##AUTOSAVE###'' が削除されるものもあります。serial.conf ファイルには多 分参考になるコメントが含まれています。

ブート時に setserial を実行するもっとも一般的なファイル (設定ファイル に準拠したもの) は、現在のところ /etc/init.d/setserial(Debian) や /etc/init.d/serial (Redhat) などですが、通常は編集すべきではありません。 Redhat 6.0 の setserial 2.15 には /usr/doc/setserial-2.15/rc.serial が ついていますが、ブート時に実行するようにしたいなら /etc/init.d/ に移さ なければなりません。

ポートを無効にするなら setserial を使って、``uart none'' と設定します。 /etc/serial.conf のフォーマットは、各ポート毎に 1 行あるコマンド行のう ち、``setserial'' の後にあるパラメータと同じです。もし自動保存しないな ら、/etc/serial.conf を手で編集してください。

バグ : 1999 年 7 月現在、###AUTOSAVE### にしたとき、``setserial -Gg /dev/ttyS?'' で表示するパラメータだけが保存され、他のパラメータが保存さ れないのはバグもしくは問題です。保存できないパラメータのデフォルト値は ほとんどの場合で問題がないので、少数のユーザにだけ影響するでしょう。こ れはバグとして報告され、今頃修正されたかもしれません。

setserial で設定した現在の設定値を設定ファイル (serial.conf) に強制的 に保存するには、通常、シャットダウン時に行なわれているように、 /etc/init.d/{set}serial stop スクリプトファイルを実行します。 ``stop'' コマンドは現在の設定を保存しますが、シリアルポートはまだ良好 に動き続けています。

幾つかの場合では、古いのと新しい設定方法の両方がインストールされていま すが、たぶんそのうちの一つだけがブート時に実行されます。 Debian では、 古いファイルには ``...pre-2.15'' などの名前がついています。

IRQs

デフォルトでは、ttyS0 と ttyS2 は IRQ 4 を共有し、ttyS1 と ttyS3 は IRQ 4 を共有します。しかし実際は、シリアル用の割込みの共有は以下の条件以 外では許されていません。1. バージョン 2.2 以降のカーネルを使っているこ と。2. 共有をサポートするようカーネルを構築していること。3. シルアルハ ードウェア自身がサポートしていること。Serial-HOWTO の割込みの共有とバ ージョン 2.2 以降のカーネルをご覧ください。

2 つのシリアルポート ttyS0 と ttyS1 だけなら、存在しないデバイスのため の IRQ の競合はありません。

ttyS0 と ttyS1 が使える環境で内蔵モデムを追加する場合、未使用の IRQ を 見つけて、共にシリアルポート (あるいはモデムカード) に設定して、 setserial を使ってデバイスドライバに割当てます。IRQ 5 が音源ボード用で使用 されてないなら、モデム用に使えますよ。ハードウェアで IRQ を設定するに は、isapnp ツールや、PnP BIOS、あるいは PnP をサポートするように Linux にパッチを当てる必要があります。空いてる IRQ のどれを使うかを決めるに は、``man setserial'' とタイプして、``IRQ 11'' を探すことです。

14.4 Stty

はじめに

stty はたくさんのシリアルポートを設定しますが、アプリケーションプログ ラム (それと getty プログラム) でも設定できるので、あまり使うことはな いでしょう。問題が起った時や、ポートの設定方法を知りたい場合には便利な のですが。現在の設定が見たければ、端末 / コンソールから ``stty -a'' と タイプしてください。 標準の表示とは違った短い一覧表示にするには、 -a (全て) を外してタイプしてみてください。serial のグルになるわけじゃなけ れば、全ての設定を修得しなくてもよいです。ほとんどはデフォルトで大丈夫 だし、設定の幾つかは 1970 年代に作られた時代遅れの端末にのみ必要だから です。

setserial は本当のシリアルポートだけを扱いますが、stty はシリアルポー トと、PC モニタでの標準的な Linux テキストインターフェースのような仮想 端末の両方で使われます。PC モニタでは stty の設定の多くは無意味です。 ボーレートの変更などは実際に目に見えるものではないからです。

stty の設定項目を幾つか示します。通信速度 (bit/sec)、パリティ、データ 長、ストップビット数、8 ビット目を落すかどうか、モデム制御信号、フロー 制御、ブレーク信号、行末マーカ、文字ケースの変更、パディング、バッファ 溢れの際にビープ音を鳴らすかどうか、タイプした文字の画面へのエコー、バ ックグランドタスクに端末への書き込みを許すかどうか ?、特殊 (制御) 文字 の定義 (どのキーを押すと割込みがかかる等) などです。詳しくは stty のオ ンラインマニュアルか info ファイルを見てください。termios のオンライン マニュアルを見てください。ここには stty で設定できるのと同じオプション が説明されてますが、(1999 年半ばの時点では) stty のマニュアルが説明で きていない機能にも言及しています。

一部の getty の実装 (gety_ps パッケージ) では、stty に通常与えるコマン ドは、getty の設定ファイル (/etc/gettydefs) に含まれます。この設定ファ イルがなくても、getty のコマンドラインは stty を必要としないほど十分な 設定ができます。

stty の設定などを変更する C プログラムを書くこともできます。これに関す る文書をいくつか見れば、stty コマンドの使い方 (およびたくさんある使用 可能な引数) もよく理解できるでしょう。Serial-Programming-HOWTO も役に 立ちます。オンラインマニュアル termios には C 言語の構造体 (termios 型) の説明があります。この構造体は、stty の設定をコンピュータのメモリ に格納します。C 言語の構造体メンバーのフラグ名の多くは、stty コマンド の引数とほぼ同じです (そして同じ動作をします)。

``よその'' 端末に対しての stty の使用

stty を使って、自分が現在使っている端末の調査や設定を行うのは簡単です。 これを別の (よその) 端末やシリアルポートに対して行うのは面倒です。例え ば、皆さんが PC のモニタ (tty1) の前にいて、そしてシリアルポート ttyS2 に対して stty を使いたいとします。2000 年以前なら、リダイレクト演算子 < を使う必要がありました。2000 年以降は (setserial 1.17 と stty 2.0 をお持ちなら) -F オプションを使った変更方法があります。これは、リダイ レクションという古い方法が失敗したときに使えます。最新版でさえも、 ttyS2 上に端末があり、そこでシェルが動作しているならば、表示される内容は あてにならず、設定しようとしてもうまくいかないでしょう。 その理由は 端末の 2 つのインタフェースをご覧になれ ば理解できます。

新しい方法は ``stty -F /dev/ttyS2 ...'' (または F の代りに --file ) です。... のところで -a としたら、stty の全ての設定 を表示します。古いリダイレクションの方法 (最新版においても動作します) では、``stty ... </dev/ttyS2'' とタイプします。新しい方法でうまくいっ て古い方法でハングするなら、モデム制御線の信号が落ちていることを意味し ています。このように古い方法はまだトラブルシューティングで使えます。次 の章をご覧ください。

古いリダイレクションの方法

古いリダイレクション演算子には問題があります (新しい -F オプションを使 えば問題はありません)。stty を使おうとすると時々、コマンドがハングし、 何もできなくなるのです(<リターンキー>を押しても、次のコマンドのプロンプ トが出ない)。これは大抵ポートがつまってしまったためで、モデム制御線の いずれかがアサート(肯定)になるのをポートがじっと待っている状態なのです。 例えば、モデム制御線を無視するように ``clocal'' を設定していない場合、 CD 信号がアサートにならなければポートはオープンできませんし、stty はポ ートに対して動作しません (新しい -F オプションを使ってもこうなります)。 同様の状況は、ハードウェアフロー制御でも起こるようです。アサートになら ないとまずい導線がポートにつないだケーブルになければ、ハングするのを防 ぐ簡単な方法はありません。

上記のハングを防ぐ方法の一つは、新しい -F オプションを使って ``clocal'' と ``crtscts'' をセットすることです。もし -F オプションに対応してな ければ、たとえ制御線がオフであってもポートを強制的に動作させるプログラ ムを使うことです。 多分このプログラムは、これ以降ポートをオープンする ために制御線が不要であるようにポートを設定します : すなわち clocal ま たは -crtscts を設定するのです。``minicom'' を使ってこれを行うには、別 の ttyS 等に合わせて minicom を再設定し、それから minicom の終了と再実 行を行わなければなりません。その後再び minicom を再設定しなければなら ないので、単に PC を再起動するだけの方が簡単かもしれません。

古いリダイレクションの方法は、ttyS2 を stty への標準入力にします。これ によって、ttyS2 は stty への標準入力となります。すると、stty プログラ ムは ''ファイル'' である ttyS2 へのリンクを得ることによって、 これを ''読み取る'' ことができます。しかし、ttyS2 に送られたバイトデータを期待 される通り普通に読み取るのではなく、ポートの読み取りや変更が できるよ うに、このリンクを使ってポートの設定を見つけます。 ``stty ... > /dev/ttyS2'' を使って端末を設定しようとする人もいますが、これでは設定できま せん。この場合は設定は行われずに、使っている端末 (例えば tty1) に対す る stty コマンドで普通に表示されるメッセージが得られ、これが ttyS2 に 送られます。しかし、ttyS2 の設定は全く変わりません。

端末での 2 つのインタフェース

コマンドライン編集機能を有効にしてシェル (bash など) を使うときには、 2 つの異なる端末インタフェース (stty -a を実行したときに表示されるも の) があります。コマンドラインで入力を行うときには、それぞれの文字を入 力するごとにコマンドラインエディタで読み込まれる一時的な ``raw'' イン タフェース (つまり ``raw'' モード)を使います。<リターン> キーを叩くと、 コマンドラインエディタは終了し、端末インタフェースはその端末の通常の ``cooked'' インタフェース (加工モード) に切り替わります。加工モードは次 のプロンプトが端末に送られるまで続きます。加工モードでは何も入力しませ んが、raw モードで入力された文字は <リターン> キーが押されると加工モー ドになります。

プロンプトが端末に送られると、端末は ``加工'' モードから ``raw'' モー ド に変わります (これはエディタを起動するときとちょうど同じように行わ れます。というのも、コマンドラインエディタを起動しようとしているからで す)。 ``raw'' モードの設定は、``加工'' モードから得た基本設定のみに基 づいて行われます。``raw'' モードはこれらの設定を保持しますが、他のいく つかの設定はモードを ``raw'' に変えるために変更します。前の ``raw'' モ ードで使われた設定には全く依存しません。したがって、stty を使って raw モードの設定を変えると、``設定された'' と思われる端末上で <リターン> キーを叩いた途端にこのような設定は無くなってしまいます。

ここで、stty で端末インタフェースを見るときには、加工モードか raw モー ドのどちらかの状態を表示することができます。その時にどちらを見るのかを はっきりさせる必要があります。コマンドラインを表示している端末を扱う ために別の端末から stty を使う場合には、raw モードでの表示になります。 行われた変更は raw モードにしか適用されず、``設定''しようとした端末上 で誰かが <リターン> を押すと消えてしまいます。しかし、自分のいる端末で (リダイレクトの < を使わずに) stty コマンドを入力し、それから < リターン>を押した場合は話が違ってきます。<リターン> キーによ り端末は加工モードになるからです。行われた変更は保存され、端末が raw モードに戻ったときにも残っています (もちろん raw モードで変更できない 設定は除きます)。

この状況では問題が起こることがあります。例えば、端末インタフェースを腐 らせてしまい、これを戻すために別の端末に行って ``stty -F dev/ttyS1 sane'' (またはこれに類するコマンド) を実行したとしましょう。ところがこの 方法は使えません! もちろん腐ってしまった端末から ``stty sane ...'' の 入力を試 みることはできますが、入力した文字を見ることはできません。上 記の現象はダム端末だけではなく、PC モニタ上で使う仮想端末や X 上の端末 ウィンドウにも当てはまります。言い換えれば、これは Linux を使っている と逃れられない問題なのです。幸運なことに、起動時に stty を実行するファ イルはシェルが動作していない端末 (あるいは端末がつながっていないシリア ルポート) を扱えるので問題はありません。

どこに stty コマンドを置くか ?

コンピュータが起動する度に stty にシリアルインタフェースを設定させる必 要があるので、コンピュータが起動する (Linux が起動する) 度に実行するフ ァイルに stty コマンドを入れておくべきです。このファイルはシリアルポー トが使われる (ポートにおける getty の実行も含みます) 前に実行されなけ ればなりません。これの置き場所はたくさんあります。複数の場所に置いたの に、そのうちの一つの場所しか知ってないなら (覚えていなければ) 衝突が起 きてしまうでしょう。したがって、設定したことはちゃんと記録しておきまし ょう。

stty コマンドを置く場所の一つは、システムが起動するときに setserial を 実行するファイルと同じところです。この場所はディストリビューションやバ ージョンごとに異なります。低レベルの処理が先に行われるようにするため、 setserial の後に置くのが良いでしょう。 置かれているファイルが起動時に 全て実行されるディレクトリ (System V Init) が、/etc ディレクトリツリー の下にあれば、``stty'' という名前でファイルを作れば良いでしょう。

14.5 Terminfo と Termcap (簡易版)

termcap の詳細については Terminfo と Termcap (詳細)をご覧ください。あなたが使うアプリケーションプログラムの多くは terminfo (以前は termcap) データベースを使用します。これには端末の型式 やタイプ (vt100 のような) のエントリ (またはファイル) があり、どんな端 末を使うべきか、各種動作のために送るコードは何か、また初期化のコードな どについて示してくれます。

多くの端末 (PC も同様) は他の端末をエミュレートでき、また各種の操作 `` モード'' があるので、指定した実際の端末を選択できるようにいくつかの端 末エントリがあります。それらは普通、似かよった名前になります。getty の 最後のパラメータ (agetty と getty_ps の両方のための) は使用している端 末 (もしくは端末エミュレータ) の terminfo に登録されている名前 (vt100 のような) にすべきです。

terminfo には、端末が実行可能な能力を指定したり、それらのことを実行さ せるために端末に送るコードを明らかにする以上の役割があります。文字色が 黒やその他の色なら、``ボールド'' の見かけ (反転表示や、高輝度表示など) やカーソルの形状がどのようになるかも指定します。PC の用語では、 ``初 期設定'' と呼んでいます。端末に初期化コードを送ったりもします (モデム に初期化文字を送るのに似ています)。このような文字列は Linux が勝手に送 ったりしません。 初期化文字をご覧ください。もし画面の表示や動 きが気にいらなければ、terminfo (または termcap) ファイルを編集 (そして アップデートも) する必要があります。アップデートの方法は Terminfo コンパイラ (tic)をご覧ください。

14.6 TERM と TERMINFO の設定

端末用には TERM と TERMINFO の 2 つの環境変数がありますが、これについ ては何も知る必要ありません。TERM は使用する端末のタイプ (vt100 のよう な) を設定します。もしタイプ (名前) を知らなければ、 私の端末の terminfo の名前は何 ?をご覧ください。TERMINFO は terminfo データベースへのパスを含みますが、データベースがデフォルトの 位置にあるなら (あるいは、あなたの Linux ディストリビューションに含ま れるスクリプトファイルで TERMIFO を自動的に設定するなら) 必要ないかも しれません。 データベースの位置の翻訳 が参考になると思います。

幸い、プログラム getty はログインする前に TERM を設定するのが普通です。 単に getty のコマンドライン (/etc/inittab) で指定した端末タイプを使い ます。これによりアプリケーションプログラムが端末の名前を見つけたり、 t erminfo データベースから端末の能力を探すことが可能になります。TERM の 詳細については TERM 変数をご覧ください。

terminfo データベースを見つからなければ、端末でそれに関するエラーメッ セージを探したほうがよいと思います。もしエラーが起っていたら terminfo が記録されている場所を調べて、必要なら TERMINFO を設定しましょう。 ``l ocate'' コマンドを使って、一般的な terminfo ファイルから ``vt100'' の ような語句を探すことで terminfo データベースがどこにあるか探すことがで きます。お使いの端末がこのデータベースにあるかどうか確認してみてくださ い。例えば TERMINFO の設定は export TERMINFO=/usr/share/terminfo とし ます (/etc/profile かそれに類するファイルに書いておきます)。もしデータ ベース内の端末データがお気に召さなければ、それを編集する必要があります。 Terminfo & Termcap (簡易版)をご覧ください。

私の端末の terminfo の名前は何 ?

TERM 環境変数にセットしたり、getty に渡すために正しい名前が必要です。 同じ名前が termcap と terminfo データベースの両方で用いられているので、 一度だけ確認しておく必要があります。普通は端末にはエイリアスがあります が、二つ以上の名前がある場合は最初のものを使います。

見つけるには、/etc/termcap ファイル (もし存在するなら) で探してみてく ださい。もしなければ、terminfo ツリー ( データベースの位置の翻訳をご覧ください) か、terminfo ソースコードファイル ( ソー スコードデータベースの位置をご覧ください) のどちらかをご覧ください。

14.7 めったに必要ない /etc/ttytype ファイル

設定ファイル /etc/ttytype は、terminfo 毎の端末名称に /dev/ttySn を割 当てるために使います。tset が使っていますが、TERM 環境変数がすでに正し く設定されているならこのファイルは不要です。Linux の getty は各 tty 毎 に TERM を設定するので、このファイルは不要です。FreeBSD のような Unix ライクな他のシステムでの /etc/ttys ファイルは、適切な getty コマンドや、 接続の種類 (``ダイアルアップ'' のような) などより多くの tty にマップし ます。Linux の ttytype のサンプル行 : vt220 ttyS1

14.8 ログインの制限

デフォルトでは、root ユーザは端末からはログインできません。これを許可 するには、man ページの ``securetty'' により /etc/securetty ファイルを 作成しなければなりません。しかしこれを使うには、Suse などは /etc/securetty を使わなかったりするので、ディストリビューションの仕様 によることになります。特定のユーザや端末からのログインを制限するには /etc/login.access (これは古い /etc/usertty ファイルを置き換えたもので す ??) を編集します。/etc/login.def は /etc/securetty が使われるかどう か、編集可能にするかどうかを決めます。つまり /etc/securetty を不要にす るか (あるいは使用しないようにするか) を決めるのです。 /etc/porttime はあるユーザと端末がコンピュータを使える時間を制限します。ユーザが試み たログインが何度も失敗したら、そのユーザは再びログインすることを禁じら れるでしょう。これを設定する方法は man ページ ``faillog'' をご覧ください。

14.9 TERM=my_term_type はコマンドだけを実行する

起動時に、特定のタイプの端末だけにコマンドを実行したいことがあります。 stty コマンドの場合は問題ありません。リダイレクション演算子 < を使っ て、コマンドの対象となる端末を指定できるからです。しかしシェルのエイリ アスや関数はどうしましょう ? 例えば ls 用の関数を作って、ディレクトリ 表示のカラー化を、カラー端末・コンソールだけで行いたいような場合もある かもしれません。モノクロの端末では、同じ名前の関数 (しかし実体は違う) で、カラー表示の代わりにシンボルを使うようにさせたいかもしれません。こ のような関数定義を、異なる端末に対して異なるように行うには、どこに置く のが良いのでしょうか ?

ログオンする度に起動する /etc/profile の ``if'' 文の中にこれらを書いて おけば良いのです。条件式 ``if'' は端末が指定したタイプのときだけ特定の 関数などを定義します。

コマンド ls の例

この if 文が行なうことの多くは dircolors 用の設定ファイル内で実行され ます。以下は bash シェルの場合のサンプルです。


if [ "$TERM" = linux ]; then
    eval `dircolors`;
elif [ "$TERM" = vt220 ]; then
    ls () { command ls -F $* ; }# to export the function ls():
    declare -xf ls
else echo "From /etc/profile: Unknown terminal type $TERM"
fi


次のページ 前のページ 目次へ