|
次のページ
前のページ
目次へ
8. 知っておくとよい便利なプログラムgetty に関する情報のほとんどは Modem-HOWTO に移動しました。 端末に直接接続する getty の使用法に関する情報が Text-Terminal-HOWTO に 少し書かれています。 8.1 シリアルポートの監視/診断用のプログラム各種モデム制御線を監視し、これが正(1 または緑)であるか負(0 または赤) であるかを示すプログラムがいくつかあります。
8.2 割り込みの優先度の変更
8.3 setserial とは何か?この節は 3 つの HOWTO(Modem, Serial, Text-Terminal)に入っています。 HOWTO によって内容が多少異なります。 はじめに ラップトップ機(PCMCIA)では絶対に 組み込みのシリアルポートが 1 つか 2 つしかなければ、普通は setserial
を使わなくても正しく設定されます。シリアルポートがこれ以上ある場合(ま
たはシリアルポートに問題がある場合)には、setserial を使う必要があるで
しょう。
setserial を使って、ポートがクローズされた後に動作し続ける時間を設定す ることができます(これは、メイン RAM 上のバッファにまだ残っている文字を 全て出力させるためです)。この設定はボーレートが遅い(1200 以下)場合には 必要です。また「フロー制御」によるウェイトが多くかかる場合には、速度が 速くても必要となります。 マニュアルページの "closing_wait" を見てください。
使用可能なコマンドの一覧は、単に引き数無しで
を実行すると、そのポートに関するデバイスドライバの設定状況が表示されま
す。詳しい情報を表示させるには "-g" オプションに "-a" を追加します。
ただし、ほとんどの人はこの追加の情報を扱う(あるいは理解する)必要はありま
せん。なぜなら普通はデフォルトの設定で十分だからです。普通の場合は、
ハードウェアは "setserial" が報告するのと同じ設定になっていますが、
問題がある場合には、"setserial" が間違っている可能性が高いでしょう。
実際、setserial を実行して全く嘘の I/O ポートアドレスや IRQ, UART
を設定することができます。それ以降に "setserial ..." を実行すると、この嘘
の値がエラーメッセージもなしに表示されます。もちろん、このような間違っ
た値ではシリアルポートドライバは(動くとしても)正しく動作しません。
探査適切なオプションを使えば、
setserial は UART の種類の自動検出以外にも IRQ の自動検出ができますが、
これも必ずしも正しく動作するとは限りません。バージョン 2.15 以上の
setserial では最後の探査の結果は保存され、設定ファイル
2 つのシリアルポートのハードウェアに同じ I/O アドレスが設定されている
ことがあります。もちろんこれは認められていないのですが、実際にそういう
ことは起こります。一つのアドレスに実際にシリアルポートが 2 つある時も、
探査では一つのシリアルポートしか検出されません。しかし、違う IRQ が設
定してあれば、IRQ の探査で IRQ = 0 が表示されるかもしれません。筆者の
場合は、こうなったのは最初に 起動時の設定 カーネルが serial モジュールをロードする時(または「モジュール相当
のもの」がカーネルに組み込まれている場合)には、 正しい IRQ を setserial に教えてこういった衝突を回避するために(あるい
は別の理由のために)、 設定スクリプト/ファイルここでの目的は /etc ツリーにあって起動時に setserial を実行する スクリプトを修正(または作成)することです。ほとんどの ディストリビューションにはそのためのファイルが付属しています(しかし最 初は /etc ツリーに置かれていないかもしれません)。さらに、バージョン 2.15 以降の setserial は大抵 /etc/serial.conf ファイルを持っています。 これは setserial を実行するスクリプトが使うファイルで、ユーザが スクリプトを直接編集する必要をなくすためのものです。さらに、 (バージョン 2.15 以降では)コマンドラインから setserial を使うだけで 最終的に設定ファイルを変更できます。 したがって、バージョン 2.15 より前ならばすべきことはスクリプトを編集す
ることだけです。バージョン 2.15 以降では、次の 3 つの作業のどれかを行えば
大丈夫です: 1. スクリプトを編集する。 2. スクリプトの編集 (バージョン 2.15 以降ではたぶん使いません)setserial のバージョンが 2.15 (1999年)より前の場合、setserial の 設定には /etc/serial.conf は使われません。したがって、起動時に "setserial" を実行しているファイルを探し、これを編集する必要があります。 このようなファイルが存在しなければ、新しく作る(または起動の初期段階に 実行されるファイルにコマンドを追加する)必要があります。このようなファイルが現在 使われているなら、/etc ディレクトリツリー内のどこかにあるでしょう。し かし、バージョン 6.0 より前の RedHat ではこのファイルは /usr/doc/setserial/ に置かれているので、使う前には /etc ツリーに移動さ せる必要があります。このようなファイルを見つけるには "locate" コマンド を使うとよいでしょう。例えば、'locate "*serial*" ' のように入力します。 以前は このようなファイルが用意されていれば、その中にはコメントアウトさ
れた指定例がたくさん入っているはずです。これらの一部をアンコメントした
り修正することにより、正しい設定を行えるはずです。
ttyS3 について UART や IRQ を自動的に setserial に調べさせたければ、 以下のような指定を追加します。
自動的に設定したい全てのシリアルポートに対してこれを行ってください。実
際にマシン上に存在するデバイス名を必ず使ってください。場合によっては、
これはハードウェアのせいで正しく動作しないので、IRQ や UART の実際の
設定がわかっているのなら、"setserial" を使って明示的にこれらの値を割り
当てるとよいでしょう。例えば、
のようにします。
バージョンが 2.15 以降の場合(お使いのディストリビューションが変更を行っ ている場合。RedHat は行っていません)には、これを行うのは比較的面倒 かもしれません。というのも、起動時に setserial を実行するファイル である /etc/init.d/setserial 等はユーザが編集するためのファイルではな いからです。 /etc/serial.conf を用いる新しい設定方法 の節を見てください。 /etc/serial.conf を用いる新しい設定方法バージョン 2.15 より前の setserial では、setserial の設定方法は、
起動時に setserial を実行するシェルスクリプトを手で編集することでした。
スクリプトの編集 (バージョン 2.15 以降ではたぶん使いません)
の節を見てください。
バージョン 2.15 (1999 年) 以降の この方式なら、わざわざ設定(あるいは設定変更)のためにファイルを編集しな くても、Linux を起動する度に setserial を正しく動作させられます。 ただし大きな落とし穴があります。というのも、serial.conf を編集する のは実際には "setserial" ではないということです。ディストリビューション ごとに扱いが違うため話はなおさらややこしくなっています。 さらに、動作を変えるためにユーザが serial.conf を編集することもできます。 よく起こるのはこういうことです: ユーザが PC をシャットダウンした時、
起動時に "setserial" を実行するスクリプトは再び実行されますが、今回は
"stop" の分岐に書かれている部分しか実行しません。この部分は
"setserial" を使って "setserial" の現在の状態を調べ、この情報を
ここまでくればどういう問題が起こる可能性があるのか想像がつくかもしれま せん。 シャットダウンが正常にできず(誰かが電源スイッチを切る等)、変更が保存さ れなかった場合を考えてください。また、"setserial" で試行錯誤をしていて、 最後に元の状態に戻すのを忘れていた場合(または元の状態に戻す時にミスを した場合)を考えてください。すると「試行錯誤中」の設定が保存されてしま います。 手動で serial.conf を編集すれば、編集した部分はシャットダウンの時に 破棄されます。なぜなら、シャットダウンの時にその時点の setserial の 状態に戻されるからです。シャットダウンの時に serial.conf を変更させな いための方法もあります。serial.conf の最初の行に書かれている "###AUTOSAVE###" といった部分を削除するのです。すくなくともある ディストリビューションでは、インストール直後の初めてのシャットダウンの 時に最初の行から "###AUTOSAVE###" を削除することは自動的に行われます。 serial.conf にはたぶん、参考になる情報がコメントの形で書かれているでしょ う。 起動時に(設定ファイルに従って) setserial を実行す るために通常使われるファイルは、/etc/init.d/setserial (Debian) や /etc/init.d/serial (Redhat) 等ですが、普通はこのファイルを編集すべきで はありません。バージョン 2.15 を使っている RedHat 6.0 では、 起動時に setserial を実行させたい場合に /etc/init.d/ に移動させる /usr/doc/setserial-2.15/rc.serial ファイルが付いています。 ポートを無効にするには BUG: 1999 年 7 月の時点では、###AUTOSAVE### に由来するバグ/問題があり ます。これは "setserial -Gg /dev/ttyS*" で表示される setserial のパラメータしか保存されず、他のパラメータが保存されないとい うものです。"setserial" の全てのパラメータを表示させるには -a フラグを 使います。 これはごく一部のユーザにしか影響を与えないでしょう。というのも普通、 保存されないパラメータはほとんどの場合はデフォルト値で大丈夫だからです。 これはバグとして報告されているので、現在は修正されているかもしれません。 setserial で設定した現在の設定をシャットダウンすることなく設定ファイル
(serial.conf)に保存するには、シャットダウンの時に通常行われる処理をさ
せます。
つまり、シェルスクリプト 場合によっては新旧両方の設定方法がインストールされているかもしれません が、起動時に実行されるのはたぶんそのうちの片方だけでしょう。Debian で は、古くて使わないファイルに "...pre-2.15" というラベルが付いています。 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 の設定をいくつか示すと、速度(ビット/秒)、パリティ、ビット/バイト、
ストップビットの数、8 番目のビットを落とすかどうか、モデム制御シグナル、
フロー制御、ブレーク信号、行末マーカー、文字ケースの変更、パディング、
バッファ溢れの際にビープ音をならすかどうか、入力した文字をエコー表示するか、
バックグラウンドタスクの端末への書き込みを許すかどうか、特殊(制御)文字
の定義(どのキーを押すと割り込みがかかるか等)があります。
詳しくは 一部の getty の実装(getty_ps パッケージ)では、stty に通常与えるコマン ドは getty の設定ファイル(/etc/gettydefs)に書かれます。この設定ファイ ルがなくても、getty のコマンドラインはユーザが stty を必要としないよう に十分な設定ができます。 stty の設定などを変更する C プログラムを書くことができます。これに関す る文書をいくつか見れば、stty コマンドの使い方(およびたくさんある使用可 能な引き数)もよく理解できるでしょう。Serial-Programming-HOWTO も役に立 ちます。マニュアルページ termios には C 言語の構造体(termios 型)の 説明があります。この構造体は stty の設定をコンピュータのメモリに格納し ます。C 言語の構造体のフラグ名の多くは、stty コマンドの引き数とほぼ同 じです(そして同じ動作をします)。 「別の」端末に対しての stty の使用 新しい方法は ``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 への標準入力とします。 すると、stty プログラムは「ファイル」である ttyS2 にリンクして これを「読み取る」ことができるようになります。しかし、ttyS2 に送られた バイトデータは普通に期待される通りに読み取るのではなく、ポートの読み取 りや変更ができるように、このリンクを使ってポートの設定を調べます。 ``stty ... > /dev/ttyS2'' を使って端末を設定しようとする人もいますが、 このコマンドで設定することはできません。この場合は設定は行われずに、使っ ている端末(例えば tty1)に対する stty コマンドで普通に表示されるメッセージ が得られ、これが ttyS2 に送られます。しかし、ttyS2 の設定は全く変わり ません。 端末の 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 -F dev/ttyS1 sane" (等)を実行したとしましょう。ところが、この方法は 使えません! もちろんぐちゃぐちゃになってしまった端末から "stty sane ..." の入力を試 みることはできますが、入力した文字を見ることはできません。上記の現象は ダム端末だけではなく、PC モニタ上で使う仮想端末や、X 上の端末ウィンド ウにも当てはまります。言い換えれば、これは Linux を使うほとんど全ての 人に当てはまります。幸運なことに、stty を起動時に実行するファイルはシェ ルが動作していない端末(あるいは端末が繋がっていないシリアルポート)を扱 えるので問題はありません。 どこに stty コマンドを置くか?コンピュータが起動する度に stty コマンドを置く場所の一つは、システムが起動する時に setserial を実行するファイルの内部です。この場所はディストリビューションや バージョンごとに異なります。低レベルの処理が先に行われるようにするため、 これは setserial の後に置くのが良いでしょう。 置かれているファイルが起動時に全て実行されるディレクトリ(System V Init) が /etc ディレクトリツリーの下にあれば、"stty" という名前のファイルを 作って stty コマンドを実行させても良いでしょう。 8.5 isapnp とは何か?
次のページ 前のページ 目次へ |
[ |