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

8. 知っておくとよい便利なプログラム

getty に関する情報のほとんどは Modem-HOWTO に移動しました。 端末に直接接続する getty の使用法に関する情報が Text-Terminal-HOWTO に 少し書かれています。

8.1 シリアルポートの監視/診断用のプログラム

各種モデム制御線を監視し、これが正(1 または緑)であるか負(0 または赤) であるかを示すプログラムがいくつかあります。

これらのプログラムのいくつかは既に使えるようになっているかもしれません。 そうでない場合には、 シリアル用ソフトウェア から入手してください。1998 年 6 月の時点では、筆者は Linux 用のシリア ルポート監視プログラムを知りません。

8.2 割り込みの優先度の変更

8.3 setserial とは何か?

はじめに

ラップトップ機(PCMCIA)では絶対に setserial を使わないでくださ い。 setserial は、シリアルポートの I/O アドレスやポートのアドレスに設 定されている割り込み(IRQ)、使用している UART の種類等をデバイスドライ バのソフトウェアに伝えることを可能にするプログラムです。このプログラム は、現在ドライバに設定されている内容の表示も行います。加えて、(特定の オプションが指定されると)ハードウェアの探査を行うこともできます。

シリアルポートが 1 つか 2 つしかなければ、普通は setserial を使わなく ても正しく設定されます。シリアルポートがこれ以上ある場合(またはシリア ルポートに問題がある場合)には、setserial を使う必要があるでしょう。 setserial のマニュアル以外にも、/usr/doc/setserial.../ などに書かれている情報を調べてください。お使いの Linux ディストリビュー ションで setserial がどのように扱われているかがそれに書かれているはず です。

setserial はしばしば起動時に自動的に起動スクリプトから実行されま す。setserial は serial モジュールがロードされている場合にしか動 作しません。serial モジュールを後からアンロードしなければならなくなる と、以前に setserial で行った設定はカーネルに忘れられます(しかし /etc/serial.conf は忘れません)。したがって、設定 を元に戻すためには setserial を再び実行しなければなりません。起動 スクリプト経由での実行に加え、serial モジュールがロードされた時にも いくらか setserial に似たものが実行されます。したがって、画面上で 起動メッセージを見る時に setserial が 2 度実行されたように見える ことがありますが、実際に 2 度実行されているのです。

setserial を使って、ポートがクローズされた後に動作し続ける時間を設定す ることができます(これは、メイン RAM 上のバッファにまだ残っている文字を 全て出力させるためです)。この設定はボーレートが遅い(1200 以下)場合には 必要です。また「フロー制御」によるウェイトが多くかかる場合には、速度が 速くても必要となります。

適切なオプションを与えれば、setserial は(指定された I/O アドレス で)シリアルポートの探査を行うこともできますが、I/O アドレス自体は推測 しなければなりません。例えば /dev/ttyS2 の探査を行うように指示した場合 は、setserial は ttyS2 があると考えているアドレスしか探査しません。 ttyS2 が異なるアドレスにあると setserial に指示すれば、setserial はそ のアドレスを探査します。 探査をご覧ください。

setserial は、シリアルポートのハードウェアそのものの IRQ や I/O アドレスの設定は行いません。ハードウェアの設定は、ジャンパまたはプラグ &プレイで行います。setserial には、ハードウェアに既に設定され ているのと同じ値を指定しなければなりません。使えると思うアドレスを勝手 にでっちあげて、それを setserial に教えてはいけません。しかし、I/O ア ドレスが分かっているけれど IRQ が分からない場合には、setserial に IRQ を調べるように指示することもできます。

使用可能なコマンドの一覧は、単に引き数無しで setserial を実行すれ ば表示されます(このコマンドは、詳細表示を行わせる -v のような 1 文字オ プションではありません。これらはトラブル処理の際に使います)。 setserial では I/O アドレスのことを「ポート」と呼ぶ点に注意してく ださい。

setserial -g /dev/ttyS*
を実行すると、そのポートに関するデバイスドライバの設定状況が表示されま す。詳しく表示するには "-g" オプションに "v" を追加します。しかし、 setserial はハードウェアに設定されている実際の値は表示しません。 実際、setserial を実行して全く嘘の I/O アドレスや IRQ, UART を設 定することができます。それ以降に "setserial ..." を実行すると、この嘘 の値がエラーメッセージもなしに表示されます。setserial による設定 は PC の電源を切ると消えるので、普通は Linux が起動する時に自動的に setserial が実行されるようにします。

探査

ある特定のシリアルハードウェアを持っているかどうかを調べるためには、 まず I/O アドレスを知らなければ(あるいは推定しなければ)なりません(ある いはデバイスドライバに I/O アドレスが設定されていなければなりません。この値は多分 setserial が以前に設定したものでしょう)。物理的なハードウェアの検出を試す場合に は、setserial の -v オプション(詳細表示)と autoconfig コマン ドを使ってください。得られる出力が 16550A といった UART の種類であれば 成功です。逆に UART の種類について "unknown" と表示された場合には、 その I/O アドレスにはシリアルポートは全くないと思われます。一部の安物 のシリアルポートはうまく認識されないので、"unknown" と表示されて もそこにシリアルポートが存在することもあります。

UART の種類の自動検出以外にも、setserial は IRQ も自動検出できますが、 これも必ずしも正しく動作するとは限りません。バージョン 2.15 以上の setserial では最後の探査の結果を保存することができ、設定ファイル /etc/serial.conf に格納されます。このファイルは、次に Linux を起動する時に使われます。起動時に setserial を実行するスクリプト は普通は探査は行いませんが、探査を行うように変更することもできます。次 の節を見てください。

Linux はシリアルデバイスを自動的に設定できますか?

はい、ただし…。お使いのディストリビューションが起動時に既に設定し ているかもしれません。しかしこれをカスタマイズしたいこともあるでしょう。 バージョン 2.15 より前の setserial ではこれは容易です。 起動時に setserial を実行するファイルに数行を追加するだけです。 以前の設定方法: スクリプトの編集 を見てください。例えば ttyS3 の場合は、起動時に setserial を実行するファ イルに以下の行を追加します:

/sbin/setserial /dev/ttyS3 auto_irq skip_test autoconfig
自動的に設定したい全てのシリアルポートに対してこれを行ってください。実 際にマシン上に存在するデバイス名を必ず使ってください。場合によっては、 これはハードウェアのせいで正しく動作しないので、IRQ や UART の種類を設 定するとよいでしょう。例えば、
/sbin/setserial /dev/ttyS3 irq 5 uart 16550A  skip_test 
のようにします。

バージョンが 2.15 以降の場合(お使いのディストリビューションが変更を行っ ている場合。RedHat は行っていません)には、これを行うのは比較的難しくな ります。というのも、起動時に setserial を実行するファイルである /etc/init.d/setserial 等はユーザが設定するためのファイルではないからで す。前のバージョンとは違って、役に立つコメントが入っていません。

起動時の設定

カーネルが serial モジュールをロードする時(または「モジュール」が カーネルに組み込まれている場合)には、ttyS{0-3} だけが自動検出され、 ドライバには IRQ 4 と 3 が設定されます(ハードウェアの実際の設定に関わ らず)。これは setserial を実行したときのように、起動メッセージと して表示されます。3 つ以上のシリアルポートを使っていると、IRQ の衝突が 起きてしまうかもしれません。

正しい IRQ を setserial に教えてこういった衝突を回避するために(あるい は別の理由のために)、setserial を再び実行するファイルがどこかにあ るかもしれません。これはシリアルポートを使う他のどのプロセスよりも前に、 起動の最初の方のステップで実行されます。実際、読者の皆さんが使っている ディストリビューションでも、起動時に setserial プログラムが起動スクリ プトから自動的に実行されるように設定されているかもしれません。これをど う扱うかについては、/usr/doc/setserial.../ 等にあるファイルを見てくだ さい。

/etc/serial.conf を用いる新しい設定方法

バージョン 2.15 より前の setserial では、setserial の設定方法は、起 動時に setserial を実行するシェルスクリプトを手で編集することでした。 バージョン 2.15 (1999 年) 以降の setserial では、このシェルスクリ プトを編集することはなくなり、設定ファイルである /etc/serial.conf から データを読み込むようになりました。さらに、serial.conf さえ編集するファ イルではありません。編集する代わりに、コマンドラインからただ setserial と入力します。

普通、setserial コマンドを使って変更した設定は、シャットダウン(正常)か リブートした時に設定ファイル(serial.conf)に保存されます。これが行われ るのは、serial.conf の最初の行に "###AUTOSAVE###" といった行がある場合 だけです。setserial を試しに使い、それでうまく動作しなかった場合 には、実験で使った設定が誤って保存されないように変更点を元に戻すのを 忘れないでください。起動時に(設定ファイルに従って) setserial を実行す るために通常使われるファイルは、/etc/init.d/setserial (Debian) や /etc/init.d/serial (Redhat) 等ですが、普通はこのファイルを編集すべきで はありません。

ポートを無効にするには setserial を使って "uart none" を設定しま す。/etc/serial.conf のフォーマットは、コマンドラインで "setserial" の 後に置くパラメータとほぼ同じものを各ポートについて 1 行ずつ書く形式で す。自動保存を行っていなければ、/etc/serial.conf を手で編集してくださ い。バージョン 2.15 の場合、Debian は自動保存を有効にした状態でシステ ムをインストールしますが、RedHat 6.0 では /usr/doc/setserial-2.15/rc.serial というファイルがあるだけで、これは /etc/init.d/ に移さなければなりません。

BUG: 1999 年 7 月の時点では、###AUTOSAVE### に由来するバグ/問題があり ます。これは "setserial -G /dev/ttyS?" (? は 1, 2, 3, ...)で表示される setserial のパラメータしか保存されず、他のパラメータが保存されないとい うものです。これはごく一部のユーザにしか影響を与えないでしょう。という のも、保存されないパラメータはいずれにせよ滅多に使われないからです。こ れはバグとして報告されているので、現在は修正されているかもしれません。

setserial で設定した現在の設定をシャットダウンすることなく設定ファイル (serial.conf)に保存するには、シャットダウンの時に通常行われる処理をさ せます。つまり、/etc/init.d/{set}serial stop を実行します。 "stop" コマンドにより現在の設定が保存されますが、シリアルポート自体は 動作したままです。

場合によっては新旧両方の設定方法がインストールされているかもしれません が、起動時に実行されるのはたぶんそのうちの片方だけでしょう。Debian で は、古くて使わないファイルに "...pre-2.15" というラベルが付いています。

以前の設定方法: スクリプトの編集

setserial のバージョンが 2.15 (1999年)より前の場合、setserial の 設定には /etc/serial.conf は使われません。したがって、起動時に "setserial" を実行しているファイルを探し、これを編集する必要があります。 このようなファイルが存在しなければ、新しく作る(または起動の初期段階に 実行されるファイルに追加する)必要があります。このようなファイルが現在 使われているなら、/etc ディレクトリツリー内のどこかにあるでしょう。し かし、バージョン 6.0 より前の RedHat ではこのファイルは /usr/doc/setserial/ に置かれているので、使う前には /etc ツリーに移動さ せる必要があります。このようなファイルを見つけるには "locate" コマンド を使うとよいでしょう。例えば、'locate "*serial*" ' のように入力します。

ここで探しているファイルは rc.serial, 0setserial (Debian) といった名前 です。このようなファイルが用意されていれば、その中にはコメントアウトさ れた指定例がたくさん入っているはずです。これらの一部をアンコメントした り修正することにより、正しい設定を行うことができるはずです。 setserial へのパスが正しいことと、デバイス名が正しいことを確かめ てください。このファイルを手で実行して(単にスーパーユーザとしてファイ ル名を入力します)正しく動作するかどうか調べることにより、テストを行う ことができます。こういったテストは何度も再起動して正しい設定にするより もずっと早く行えます。もちろん、コマンドラインから setserial を実 行することによりコマンド単独のテストも行えます。

以前は /etc/rc.d/rc.serial というスクリプトが共通して使われて いました。Debian は /etc/rc.boot/0setserial を使っていました。 かつては /etc/rc.d/rc.local という別のファイルが使われていま したが、このファイルはあまり初期には実行されないので、適切とは言えませ んでした。rc.local が実行されるよりも前に他のプロセスがシリアルポート をオープンしようとして、シリアル通信が失敗するという問題が報告されまし た。

IRQ

デフォルトでは、ttyS0 と ttyS2 が IRQ 4 を共有し、ttyS0 と ttyS3 が IRQ 3 を共有しています。しかし、次の条件が成り立たなければシリアルの割 り込みの共有はできません: すなわち (1) カーネルが 2.2 以降である、 (2) 割り込みの共有をサポートするようにカーネルをコンパイルしている、 (3) シリアルポートが割り込みの共有をサポートしているという条件です。

割り込みの共有とバージョン 2.2 以降のカーネル をご覧ください。

ttyS0 と ttyS1 の 2 つのシリアルポートしか使っていない場合にも問題はあ りません。というのも、存在しないデバイスについては共有する IRQ の衝突 が起きないからです。

内蔵モデムを追加した状態でも ttyS0 と ttyS1 をそのままにするならば、未 使用の IRQ を見つけ、これをシリアルポートの両側(またはモデムカード)に 設定し、setserial を使ってデバイスドライバに割り当てなければな りません。IRQ 5 がサウンドカードに使われて いなければ、これをモデム用に使ってもよいでしょう。ハードウェアの IRQ を設定するには、isapnp や PnP BIOS, あるいは Linux を PnP にするための パッチを使う必要があるかもしれません。余っている IRQ を調べる参考とし て、"man setserial" を実行して "IRQ 11" などを検索してみてください。

8.4 stty

はじめに

stty はシリアルポートの設定の大部分を行いますが、多くの場合は アプリケーションプログラム(および getty プログラム)がこれを処理するた め、ユーザが使う必要はあまりありません。このプログラムは、問題がある時 やポートの設定を見たい時には便利です。端末やコンソールで ``stty -a'' を実行すればポートの設定を見ることができます。また、-a (all) オプショ ンを付けずに stty を実行すれば、通常と異なる設定になっている部分が短く リスト表示されます。シリアルポートの達人になろうというのでなければ、全 ての設定を覚える必要はありません。ほとんどはデフォルトのままで大丈夫な はずで、1970 年代(ただし、それ以降の期間はそんなに長くありません)に作 られた特定の古いダム端末に対してだけ設定がいくつか必要となります。

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

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

一部の getty の実装(getty_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 を使いたいと考えているとします。この 場合はリダイレクト演算子 < を使う必要があります。ttyS2 上に端末があ り、そこでシェルが動作しているならば、表示されるものは確かではなく、設 定しようとしてもうまくいかないだろうということを最初に注意しておきます。 その理由を理解したければ 端末の 2 つのインタフェース をご覧ください。

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

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

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

バージョン 1.17 (1999 年半ばの時点でもまだリリースされていません)以降 では、リダイレクション(<)を使う必要はもはやなく、その代わり に ``stty ... -F /dev/ttyS2'' (または -F の代わりに --file)等を使います。 これはポートを強制的にオープンし、リダイレクションに関する二番目の問題 を回避できるはずです。

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

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

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

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

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

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

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

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

8.5 isapnp とは何か?

isapnp は、内部モデムを含めた ISA バス用のプラグ&プレイ (PnP)デバイスを設定するためのプログラムです。このプログラムは "isapnptools" と呼ばれるパッケージに他のプログラム("pnpdump")と一緒に 入っています。"pnpdump" は全ての ISA PnP デバイスを全て見つけ、これら のデバイスを設定するオプションを出力します。この出力は、PnP の設定ファ イルである /etc/isapnp.conf に追加できる形式です。コンピュータの起動時 に毎回実行され、ISA PnP デバイスを設定できるように、isapnp コマンドは システムの起動ファイルに書かれます。BIOS が PnP をサポートしていなくて も、これを行うことは可能です。詳しくは Plug-and-Play-HOWTO を見てくだ さい。


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