The Linux Modem-HOWTO David S.Lawyer v0.08, 4 January 2000 さいとうかん can-s@geocities.jp 2000年 2月 4日 PC のモデムを選択、接続、設定、トラブルシューティング、そしてモデムを 理解する際に、この文書は役立ちます。マルチポートシリアルボードに関して は、Serial-HOWTO を参照してください。 ______________________________________________________________________ 目次 1. はじめに 1.1 DSL モデム、ケーブル、および ISDN モデムは他の HOWTO にあります 1.2 PCMCIA モデムと PPP にはついては書いてありません 1.3 著作権、免責事項、登録商標およびクレジット 1.3.1 著作権 1.3.2 免責事項 1.3.3 登録商標 1.3.4 クレジット 1.4 著者への連絡 1.5 この HOWTO の新しいバージョン 1.6 モデムとは ? 1.7 クイックインストール 1.7.1 外付けモデムのインストール 1.7.2 (ISA バス用の)内蔵モデム 1.7.3 すべてのモデムに共通の設定 2. Linux PC 用のモデム 2.1 内蔵と外付けのどちらが良いのか 2.2 外付けモデム 2.2.1 PnP 外付けモデム 2.2.2 ケーブル接続とインストール 2.2.3 ライト (LED) の意味 2.3 内蔵モデム 2.4 (内蔵)ソフトウェアモデム 2.5 PCI モデム 2.6 Linux で動作しない内蔵モデムは? 2.6.1 MWave および DSP モデム 2.6.2 Rockwell (RPI) ドライバ 3. マルチポートモデムボード 4. モデムとシリアルポートの基礎 4.1 モデムのデジタル-アナログ変換(およびその逆) 4.2 シリアルポートとは? 4.2.1 シリアルの基礎 4.2.2 ピンと配線 4.2.3 内蔵モデムのシリアルポート 4.3 IO アドレスおよび IRQ 4.4 名前: ttyS0, ttyS1 など 4.5 割込み 4.6 (モデムによる)データ圧縮 4.7 エラー訂正 4.8 データフロー(速度) 4.9 フロー制御 4.9.1 フロー制御の例 4.9.2 ハードウェアフロー制御対ソフトウェアフロー制御 4.9.3 フロー制御がないときの症状 4.9.4 モデム間のフロー制御 4.10 データフロー経路 - バッファ 4.11 モデムコマンド 4.12 シリアル操作ソフトウェア: デバイスドライバモジュール 5. 設定の概要 6. シリアルポートの設定 6.1 PCI バスはまだサポートされていません 6.2 設定の概要 6.3 ありふれた間違いで起きた低レベル設定のやり直し 6.4 I/O アドレスと IRQ: 起動時のメッセージ 6.5 シリアルポートの現在の I/O アドレスと IRQ の設定は? 6.5.1 デバイスドライバの設定は? 6.5.2 シリアルポートのハードウェアの設定は? 6.5.3 PnP シリアルポートのハードウェアの設定は? 6.6 シリアルの IRQ の選択 6.6.1 IRQ 0 は IRQ ではない 6.6.2 割込みの共有とバージョン 2.2 以降のカーネル 6.6.3 どの IRQ を選ぶか? 6.7 アドレスの選択 --ttyS3 と衝突するビデオボード 6.8 I/O と IRQ のハードウェアへの設定 (ほぼ PnP 向け) 6.8.1 PnP BIOS を使った I/O アドレスと IRQ の設定 6.9 IRQ と I/O アドレスを setserial に与える 6.10 その他の設定 6.10.1 ハードウェアフロー制御 (RTS/CTS) の設定 7. (シリアルポートを除く)モデムの設定 7.1 モデムの検出 7.2 AT コマンド 7.3 初期化文字列: 保存および再呼出し 7.4 その他のモデムコマンド 8. /dev/ttyS2 などのシリアルポートデバイス 8.1 シリアルポートデバイスの名前と番号 8.2 ttySN を /dev/modem へリンク? 8.3 cua デバイス 9. 知っていると良いおもしろいプログラム 9.1 setserial とは何か? 9.1.1 はじめに 9.1.2 検出 9.1.3 Linux は自動的にシリアルデバイスを設定できますか? 9.1.4 起動時の設定 9.1.5 /etc/serial.conf を用いた新しい設定手法 9.1.5.1 古典的な設定手法 : スクリプトの編集 9.1.6 割込み (IRQ) 9.2 isapnp とは何でしょう? 9.3 wvdialconf とは? 9.4 stty とは何でしょう? 10. モデムを試す (電話をかける) 10.1 電話をかける準備ができていますか? 10.2 Minicom で電話をかける 10.3 Kermit で電話をかける 11. ダイヤルイン 11.1 概要 11.2 getty 11.2.1 mgetty について 11.2.2 uugetty について 11.2.3 getty_em について 11.2.4 agetty および mingetty について 11.3 ダイヤルインの際に何が起こりますか? 11.4 なぜ手動応答が最も良いのか 11.5 コールバック 11.6 ボイスメール 12. ダイヤルイン用の uugetty (古い Serial-HOWTO から引用) 12.1 getty_ps のインストール 12.2 uugetty の設定 12.2.1 最近のモデム 12.2.2 古い低速のモデム 12.2.3 ログインバナー 12.3 uugetty のカスタマイズ 13. モデムで使うべき速度は? 13.1 速度とデータ圧縮 13.2 どこで速度を設定するの? 13.3 充分に高い速度へ設定できない 13.3.1 どのようにハードウェア中で速度が設定されているか : 除数とボーレート 13.3.2 速度設定のおまけ 13.3.3 水晶の振動数は baud_base ではありません 13.4 速度表 14. 通信プログラムとユーティリティ 14.1 Minicom と Kermit 14.2 プログラムのリスト 14.2.1 最も人気のないダイヤルアウトプログラム 14.2.2 最も人気のあるダイヤルアウトプログラム 14.2.3 Fax 14.2.4 ボイスメールソフトウェア 14.2.5 (getty を用いた) ダイヤルイン 14.2.6 その他 14.3 SLiRP と term 15. UART って何ですか? 性能にどんな影響を与えますか? 15.1 UART の概要 15.2 2 種類の UART 15.3 FIFO 15.4 UART のモデル番号 16. トラブルシューティング 16.1 モデムが物理的には存在するのに検出できません 16.2 56k モデムで 56k に近い速度が出ません 16.3 アップロード(ダウンロード)したファイルが壊れる、あるいは遅い 16.4 ダイヤルインの際に ``line NNN of inittab invalid'' と出続ける 16.5 ``Id "S3" respawning too fast: disabled for 5 minutes'' と出続ける 16.6 誰かが電話を切ったあとモデムが止まる、あるいは uugetty が再生 成しない 16.7 uugetty がいまだに動作しない 16.8 以下の節は Serial-HOWTO にも Modem-HOWTO にもあります : 16.9 物理的にはシリアルポートがあるのに、検出されません 16.10 この上なく遅い: テキストがすごく遅れてゆっくり画面に表示されます 16.11 なぜか遅い: あと数倍は速いはずなのですが 16.12 システム起動時の画面で、シリアルポートの IRQ が間違っていると 表示されます 16.13 "Cannot open /dev/ttyS?: Permission denied" というエラーが出ます 16.14 ttySx について "Operation not supported by device" 16.15 "Cannot create lockfile. Sorry" 16.16 "Device /dev/ttyS? is locked." (デバイス /dev/ttyS? がロックされています) 16.17 "/dev/ttyS?: Device or resource busy" 16.18 トラブル対処のためのツール 17. フラシュメモリのアップグレード 18. 他の情報源 18.1 その他 18.2 書籍 18.3 HOWTO 18.4 ニュースグループ 18.5 Web サイト 19. 付録 A: (技術的に)モデムがどのように動作するのか (未完成) 19.1 変調の詳細 19.1.1 変調の序論 19.1.2 周波数変調 19.1.3 振幅変調 19.1.4 位相変調 19.1.5 複合変調 19.1.6 56k モデム (v.90) 20. 付録 B: ``ボー'' と ``bps'' 20.1 簡単な例 20.2 実際の例 21. 付録 C: 端末サーバ接続 22. 付録 D: 他の種類のモデム 22.1 デジタル「モデム」 22.2 ISDN 「モデム」 22.3 デジタル加入者線 (Digital Subscriber Line = DSL) 22.4 56k デジタルモデム 22.5 専用線モデム 23. 日本語訳について ______________________________________________________________________ 1. はじめに 1.1. DSL モデム、ケーブル、および ISDN モデムは他の HOWTO にあります 本文書では通常の PC 用モデムを扱い、主として ISA バスのものを扱います( ただし、PCI バスのモデムにも適用できるはずです)。 o DSL モデム: ADSL mini-HOWTO をご覧ください。 o Cable-Modems-HOWTO (かつて LDP の mini-HOWTO でした) o ISDN HOWTO (LDP の HOWTO ではありません) : ISDN 「モデム」用のドラ イバです。多くの関連する情報がありますが、ドイツ語です。ISDN の チュートリアルは を ご覧ください。 ``付録 D: 他の種類のモデム'' もご覧ください。 [訳注 : JF プロジェクトによる日本語訳 ADSL-mini-HOWTO , Cable-Modem-HOWTO ] 1.2. PCMCIA モデムと PPP にはついては書いてありません PCMCIA のモデムおよびシリアルカードについては、PCMCIA-HOWTO をご覧くだ さい。(モデム経由でインターネットへ接続する際に用いる) PPP、そして通信 プログラムに関しては、この HOWTO では扱っていません。通信プログラムの 使い方のうち、モデムが正常に機能しているか、あるいは正しく電話をかけら れるかをテストする方法のみを示します。モデムを用いてインターネットへ接 続したいのなら、PPP を設定する必要があります。PPP に関しては (改定中の PPP-HOWTO を含む)多くの文書があります。そのうちいくつかは /usr/doc/ppp などのディレクトリで見つかるかもしれません。 [訳注 : JF プロジェクトによる日本語訳 PCMCIA-HOWTO , PPP-HOWTO ] 1.3. 著作権、免責事項、登録商標およびクレジット 1.3.1. 著作権 Copyright (c) 1998-9 by David S. Lawyer この文書をあらゆる形式で自由に複製し配布(販売あるいは贈与)してくださ い。訂正および小さな修正はメンテナにご連絡ください。また、本文書の派生 著作物を作り、それを配布してもかまいません。: 1. あなたが作成した派生著作物を (SGML のような最もふさわしい形式で) LDP (Linux Documentation Project) へ送るか、あるいはインターネット へ投稿するなどしてください。LDP 以外へ送ったのなら、どこで読めるか を LDP へ知らせてください。翻訳を除き、最新バージョンに書いてある、 以前のメンテナへコピーを送ってください。 2. その派生著作物は本文書のライセンスの精神、あるいは GPL に従ってくだ さい。著作権の告知、そして最低でも使用するライセンスへのポインタを 載せてください。 3. 以前の著者と多くの貢献者のおかげであると、明示してください。 翻訳だけでなくそれ以上の作業を行おうと考えているのなら、現在のメンテナ とあなたの計画について話し合ってください。 1.3.2. 免責事項 あなたを故意に欺こうとしたわけではありませんが、おそらく本文書にいくつ かの誤りがあるでしょう。この誤りを私に教えてください。本文書はフリーの 文書ですから、私あるいは以前の著者に、文書のいかなる誤りについても法的 な責任がないことは明らかなはずです。 1.3.3. 登録商標 ある単語が登録商標であるとしても、それがだれに帰属するものかは文脈上明 らかなはずです。例えば、``MS Windows'' (あるいは単に ``Windows'') とい う表記は ``Windows'' が Microsoft 社 (MS) の登録商標であることに配慮し たものです。``Hayes'' は Microcomputer Products Inc. の登録商標です。 [訳注 : 英文の原著には以下のように書いてあります。 著者は ``winmodem'' を MS-Windows でしか動かないモデムを指す ときに使い、登録商標の意味では用いません。 ``Winmodem'' は 3Com 社の登録商標です。 原著では、登録商標を ``Winmodem'' と大文字で表記し、一般名詞は ``winmodem'' と小文字で表記して区別しています。しかし、ややわかりにく くなってしまいます。そこで日本語訳では、原著で ``winmodem'' と表記して いる一般名詞は「ソフトウェアモデム」と書き換えています。] 1.3.4. クレジット 本文書の version 0.0 は、大まかに言って、次のような経緯で作成されまし た。本文書の素材の約 3/1 は Greg Hankins さん の Serial-HOWTO v. 1.11 から(許可のもと) 直接頂いたものです。他の約 3/1 は Serial-HOWTO を修正したものです。残 りの 3/1 は著者の David S. Lawyer が新しく書い たものです。 [ 訳注 : 訳者も JF の Serial-HOWTO から多くの訳を頂 きました。翻訳された永田靖人さん、藤原輝嘉さん、ありがとうございま す。] 1.4. 著者への連絡 どのモデムを買うべきかの相談や、特定のモデムが Linux で動作するかどう かの質問などの目的で著者に尋ねないでください。``(内蔵)ソフトウェアモデ ム'' 節の巨大なリストをご覧ください。また、この HOWTO を精読してもまだ 設定できない場合以外は、どのようにモデムを設定するのか著者に尋ねないで ください。 事実、意見、論法、綴り、文法、明快さ、あるいはリンクなどのいかなる誤り に関しても、著者までお知らせください。しかしまず、あなたが読んでいる文 書の日付が 1 ヶ月以上古かったら、最新のバージョンかどうか、まず御確認 ください。本文書に関してあなたが思ったことはどんなことでも、著者までお 送りください。 [訳注 : 日本語訳に関しては、さいとうかん およ び JF プロジェクト までご連絡ください。] 1.5. この HOWTO の新しいバージョン (著者もまだ勉強中ですが) モデムをとりまく環境は急速に変化しているの で、この Modem-HOWTO の新しいバージョンはほぼ毎月出ています。あなたの 抱えている問題が、本文書の最新バージョンでは解決できるかもしれません。 最新バージョンは LDP のミラーサイトで閲覧、ダウンロードできます。ミ ラーサイトの一覧は以下の Web ページで見ることができます。 最新バージョンの作成日を手短 かに確認したい場合は を見て、今読んでいるバージョン v0.08, 1 Jan. 2000 とどちら が新しいか比べてください。 [訳注 : 最新の日本語訳は Modem-HOWTO にあります。] 1.6. モデムとは ? モデムとはデジタル信号用に設計されていない、通常の電話回線を使ってデジ タル信号を送る装置です。もし電話回線がすべてデジタル化されているのな ら、モデムは必要ありません。モデムはあなたと世界中のコンピュータを接続 し、通信することを可能にします。モデムを使う際には、モデムを正しく扱っ て電話をかけるために、通常は通信プログラムや Web ブラウザなどを使いま す。上級のモデムユーザはモデムに電話をかけてコンピュータを使えるよう設 定できます。これを「ダイヤルイン」と呼びます。 PC のモデムには外付けと内蔵の2種類のタイプがあります。外付けモデムは PC 外部に設置します。一方、内蔵モデムは PC の中にあるため、外から見る ことができません。外付けモデムは PC の背面にある「シリアルポート」とし て知られているコネクタへ接続します。内蔵モデムはコンピュータの内部に挿 入するボードで、内部に(見えない)シリアルポートがあります。詳細な比較に ついては、``外付けと内蔵'' をご覧ください。内蔵モデムを使用する際に は、(そのモデムだけが使用し、他のモデムやプリンタが使用しない)シリアル ポートとして検出されます。Linux においては、シリアルポートは ttyS0, ttyS1 などの名前が付いています(DOS や Windows では、通常 COM1, COM2 に それぞれ対応します)。 着脱可能なコネクタで将来はモデムとともに使用するかもしれない、 ``Universal Serial Bus (USB)'' とシリアルポートは全く異なったもので す。モデムとシリアルポートに関する詳細は ``モデムと シリアルポートの基 礎'' をご覧ください。 Fax 送信機能を備えたモデムもたくさんあります。(これを FAX モデムと呼び ます。) ``Fax'' の項目に FAX ソフトウェアの一覧があります。ボイスモデ ムは音声自動応答装置のように動作し、ボイスメールを扱えます。``ボイス メール'' の項目をご覧ください。 1.7. クイックインストール 1.7.1. 外付けモデムのインストール ストレートケーブルあるいはモデムケーブルを用いて、モデムと PC の使って いないシリアルポートを接続します。多くの場合、シリアルポートの名前が COM1 は ttyS0、COM2 は ttyS1、などになることを知っておいてください。こ こで、シリアルポートに関する BIOS の設定を確認する必要があるかもしれま せん。モデムへ電力を供給するために、電源コードを接続します。更なる説明 に関しては ``すべてのモデム'' をご覧ください。 1.7.2. (ISA バス用の)内蔵モデム (PCI バスに関しては ``PCI バスはまだサポートさ れていません'' および ``PCI モデム'' をご覧ください。) モデムに MS Windows 上でのみ動作する と書いてあったなら、あなたは不運です。シリアルポートが既に2つあるな ら、このボードを3番目のシリアルポート (ttyS2 = COM3) にします。未使用 の IRQ を探してください。以前は IRQ5 を内蔵モデムに使用しましたが、今 ではサウンドカードが使用しています。内蔵モデム上のジャンパ(あるいはそ れに類するもの)を使い、未使用の IRQ へ設定し IO アドレスを 3E8 (ttyS2) に設定してください。 (前の文における)「それに類するもの」[訳注:PnP 設定用のプログラムなど] は若干扱いにくいかもしれません。そのモデムが ISA バスのプラグ&プレイ (PnP) 対応であるなら、恐らく ``isapnptools'' で配布している ``isapnp'' を用いて同等のことができます。``man isapnp'' あるいは FAQ をご覧くださ い。また、Plug-and-Play-HOWTO もご覧ください。PnP OS を持っていなくと も、PnP-BIOS の CMOS セットアップメニューを用いて、モデムボードに適切 な IRQ および IO アドレスを設定できるかもしれません。特定の IRQ および IO アドレスを設定するよう BIOS に「強制」したいのなら、同じ PC 上で Windows9x を使用すればできるかもしれません。Windows と同様に、Linux で も設定に用いる PnP-BIOS のフラッシュメモリへ、IRQ および IO アドレスを 設定できます。Plug-and-Play-HOWTO を読み、(何ヶ所かに出てくる) 「強 制」を探してください。Windows 3.x では ICU [ 訳注: ISA Configuration Utility ] を用いて同じことができます。同様に、モデムと同梱されている (Windows の)ソフトウェアで PnP を無効にできる方法があるかもしれませ ん。 [訳注 : JF プロジェクトによる日本語訳 Plug-and-Play-HOWTO ] 最後に、``setserial'' を起動しているファイルを探し、以下のような記述を 追加してください : ``setserial /dev/ttyS2 irq5''。setserial v2.15 以降 を除き、(ディストリビューションが許すなら)コマンドラインで ``setserial'' を動かすだけでよく、その結果は設定ファイルに保存されま す。詳細は ``setserial とは何か?'' をご覧ください。クイックインストー ルに関する更なる説明については ``すべてのモデム'' をご覧ください。 1.7.3. すべてのモデムに共通の設定 モデムを電話線に接続します。minicom のような通信プログラムを起動し、シ リアルポートの設定メニューへ移ります。シリアルポートへモデムより 2 〜 3 倍速いビットレートを割り当てます。最適なスピードは``速度表''をご覧く ださい。/dev/ttyS1 のような、シリアルポートの完全な名前を記述します。 ハードウェアフロー制御 (RTS/CTS) を使うように設定します。これらの設定 を保存し、minicom を終了します。minicom を再び動かし、モデムが OK と応 答するかどうか確かめるために、AT とタイプします。その後ダイアルを行う ディレクトリ (あるいはメニュー)へ移動し、電話番号をダイアルします。 [訳注 : cu コマンドも使えます。cu はたいていのディストリビューションで uucp パッケージに入っています。 $ cu -l ttyS1 AT (キーボードから入力・モデムが応答するか実験) OK (モデムの応答) ~. (キーボードから入力・cu の終了) ] 2. Linux PC 用のモデム 2.1. 内蔵と外付けのどちらが良いのか PC 用のモデムには内蔵あるいは外付けのものがあります。内蔵のものは PC の内部に取り付けます(取り付けるためにはねじを外すなどが必要です)。外付 けのものは PC のシリアルポートコネクタへ差し込むだけです。内蔵モデムは 低価格でバッファ溢れによるデータ喪失が発生しにくく、たいてい消費電力も 少なく机の上に余分な空間が要りません。 外付けモデムは取付けが非常に簡単で設定もほとんど必要ありません。そして 何が起こっているのかを知る手がかりになる表示灯があります。シリアルポー トとモデムが物理的に分かれていることは、トラブル解決にも役立ちます。ま た、外付けモデムは他のコンピュータへ簡単に移動できます。 残念なことに、多くの外付けモデムは非使用時に電源を切るスイッチがないの で、(壁のコンセントからプラグを抜かない限り)電源を切っていても若干の電 力を消費します。電気料金は年間 $1 程度でしょう。外付けモデムのもうひと つ不利な点は、115,200 kbps 以上の速度をサポートしないシリアルポートを 使わざるをえない場合があることです(しかし、1998年の終わりには多くの新 型の内蔵モデムでもこの速度は出ず、一部のものだけが出せませんでした)。 新型の内蔵モデムが 16650 UART を持っているなら、CPU の負荷は低くなりま す(しかし 1998 年の終わりごろには、そのようなものはほとんどありません でした)。 内蔵モデムは Linux で使用すると、固有の問題が発生します。しかし、MS Windows でしか動かないモデムを避ければ、正しく設定するために(ときには 非常に多くの)時間がかかるものの、外付けモデムと同様に動作します。残念 なことに、MS Windows でしか動作しないモデムの中には、その旨を明記して いないものもあります。。もし新しいモデムを買うなら、Linux で動作しな かった際に返品できるかどうか確かめてください。 新しいモデムの多くはプラグ&プレイであり、それを扱うには多くの方法があ ります : o ``isapnp'' プログラムを使用する o 設定を行う PnP BIOS を手に入れる o PnP Linux を作るためにカーネルにパッチを当てる(今は利用できません) 上記の手法にはそれぞれ欠点があります。(現在はまだ不完全な) Plug-and- Play-HOWTO が理解を助けるとはいえ、isapnp の文書は理解しにくいもので す。PnP BIOS の設定を行いたいなら、PnP OS を使っていないことを PnP BIOS に伝えなければなりません。それでも正しく設定できないかもしれませ ん。何をするのか知りたければ、``シリア ルポートのハードウェアの設定 は?'' をご覧ください。以前はパッチを当てたカーネルが動作していました。 しかし、現在有効なパッチは存在しないようです。関連する Web サイトを御 確認ください。 外付けモデムの方が簡単に入手して接続できると言う Linux ユーザが多くい ます。しかし、現在新しい周辺機器はたいていプラグ&プレイになりました。 いずれ PnP を扱うことになるかもしれないのに、なぜやらないのでしょうか? でもまだ今のところは、(空いているシリアルポートがあるなら)最も好都合 な(そして高価な)解決策は外付けモデムです。 2.2. 外付けモデム 2.2.1. PnP 外付けモデム 多くの外付けモデムは ``Plug and Play'' (PnP) のラベルがついています が、PnP ではないモデムとしても同様に正常に動作するはずです。固有の IRQ と IO アドレスを持つシリアルポートにモデムを接続するので、モデムに PnP の機能は必要ありません。しかし、デフォルトの設定で正常に動作しない限 り、シリアルポート自体には (IRQ と IO アドレスの)設定作業が必要です。 PnP で設定しないのに、なぜ外付けモデムを PnP と呼ぶのでしょうか。PnP OS が(シリアルポートを通じて)読み込める特別な PnP 識別情報を、モデムは 自身の中に持っています。PnP OS にはモデムが特定のポートにつながってい ること、そしてモデムの型番が分かります。そして、モデムが (/dev/ttsS2 あるいは COM3 など)どのポートにつながっているのか、アプリケーションを 設定する必要がなくなるかもしれません。しかし、このような PnP OS を持っ ていないなら、(/dev/ttyS2 といった)デバイス識別子をアプリケーションに 手動で設定する必要があるでしょう。 2.2.2. ケーブル接続とインストール 様々なタイプの「ヌルモデム」ケーブルを必要とするその他の装置をシリアル ポートへ接続することと比べて、外付けモデムを接続することは簡単です。モ デムは交差するピンのないストレートケーブルを使います。多くのコンピュー タショップはストレートケーブルを売っているはずです。正しいケーブルを手 に入れるよう気を付けてください。コンピュータに DB9 あるいは DB25 のシ リアルポートがあるなら、シリアルポートは常にオスコネクタであり、ケーブ ルはメスコネクタになります。シリアルポートへモデムを接続してください。 接続したポートのデフォルト IRQ と IO アドレスで構わないなら、これで通 信プログラムを起動しモデム自体の設定を行う準備が整いました。 [訳注 : DB9 は D-Sub 9 ピンコネクタ、DB25 は D-Sub 25 ピンコネクタで す。] 2.2.3. ライト (LED) の意味 o TM テストモデム o AA 自動応答 (on ならモデムは着信に応答します) o RD データ受信線 = RxD o SD データ送信線 = TxD o TR データ端末レディ = DTR (PC がセットします) o RI 着信音表示 (on なら誰かがモデムに電話をかけてきています) o OH オフフック (off ならモデムが電話を切ったことを示します) o MR モデムレディ = DSR ?? o EC エラー訂正 o DC データ圧縮 o HS (そのモデムにとって)ハイスピード [訳注 : 訳者のモデムでは MR = Modem Ready で、モデムの電源が入っている ときに ON になります。] 2.3. 内蔵モデム PC のカバーを取り外しマザーボード上の空きスロットへモデムボードを挿入 して、内蔵モデムを取り付けます。内蔵モデムにはISA スロット用のモデムが あり、その他には PCI スロット用のものがあります。外付けモデムはシリア ルポートへ(短いケーブルを介して)接続したのに対し、内蔵モデムにはモデム 自身の中にシリアルポートがあります。言い換えると、モデムボードはシリア ルポートとモデムの双方の役割をします。 昔は、シリアルポートへの IO アドレスと IRQ の設定を、ボード上のジャン パで行いました。ボード上のピンへ押し込む、5x4x2mm 程度の黒く小さい長方 形の「サイコロ」があります。PnP モデム(実際はモデムの一部であるシリア ルポート)は設定のためにジャンパは用いず、モデム(コンピュータの中にある ISA バスの IO アドレス空間)へ設定コマンドを送ることにより設定を行いま す。PnP BIOS、(ISA バスは) isapnp プログラム、あるいは PnP OS が、こう いった設定コマンドを送ることができます。モデムを設定する手段は、 Windows 95/98 には組み込まれています。Linux では、IO と IRQ の設定方法 は(常に簡単な方法はありませんが)いくつかの方法から選ぶことができます: 1. 起動の度に ``isapnp'' を自動的に動かす 2. (起動ごとに動く) PnP BIOS を単独で使用する 3. Linux にパッチを当て PnP OS にする 2.4. (内蔵)ソフトウェアモデム ソフトウェアモデムはモデムとして必要な処理の多く(あるいはほぼすべて) を(Pentium など)コンピュータの CPU へ委託します。複雑な専用ソフトウェ ア(ドライバ)が CPU でこの処理を行います。1998 年中頃以降に製造された内 蔵モデムの多くは Windows でしか動作しないソフトウェアモデムであり、 Linux では動作しません。数人の有志がこのモデム用の Linux ドライバを書 こうとしているものの、仕様書が入手できないのでドライバを完成できませ ん。2000 年以前は、ドライバがないために Linux で動作するソフトウェアモ デムはありませんでした。 1999 年の終りには、やっと 2 つのソフトウェアモデムが Linux で動作する ようになりました。残念なことに、Lucent Technologies 社は PCI ソフト ウェアモデムのドライバをバイナリを非公式に公開しているだけです。このド ライバの初期のバージョンにはバグがありました。PC-TEL 社は Linux 用の新 しいソフトウェアモデムを売り出しました。他の企業も先行企業に続いて、 ``linmodem'' を作るのでしょうか? Linux におけるモデムの動作状況一覧が modem list にあります。ソ フトウェアモデムを Linux で動作させようとするプロジェクトがあります。 をご覧ください。メーリングリストもあります。現 在、複数のリバースエンジニアリング作業が進行中です。ソフトウェアモデム を Linux で動作させた報告が、少なくともひとつあります(しかし、まだすべ ての機能を利用できるわけではありません)。従って、皆さんがこれを読むこ ろには、linmodem がもっと増えているかもしれません。 ソフトウェアモデム(いわゆる winmodem) を Lunux で扱えるドライバが手に 入るようになったら、それを ``linmodem'' と呼ぶ人もいるでしょう。それで もまだ ``winmodem'' なのでしょうか? そのモデムは MS Windows でも動作 するので、恐らく ``winmodem'' ということになるでしょう。``Winmodem'' という単語は特定のタイプのソフトウェアモデムを指す登録商標です。 [訳注 : 原著ではソフトウェアモデム一般を ``winmodem'' と表記してい て、winmodem と linmodem を対比させる形になっています。] ここではソフトウェアモデムに関して、より正確な技術用語を解説します。 HSP (Host Signal Processor) とは電話回線に流す電気信号を生成するために 必要となる信号を、ホストのプロセッサ (CPU チップ)で作り出すことを意味 します。モデム自身は CPU が伝えた電気的な波形を生成しているにすぎませ ん。これとは対照的に、「制御装置のない」モデムは(モデム自身を制御でき ないものの)自分自身で波形を生成できます。HSP には送受信データを処理す る機能はありません。データ列を圧縮できず、誤りも検出できず、パケットに データを入れられません。言い換えると、HSP はモデムを制御できず、ソフト ウェアを使用し CPU がすべての作業を行います。Rockwell 社の HCF (Host Controlled Family) はこの作業を行います。このすべてを行うソフトウェア が Linux へ移植できたなら、前述の問題はなくなります。上記の問題が解決 したとしても、Linux からシリアルポートに見えないモデムは Linux では動 作ないでしょう。 特定の内蔵モデムが Linux で動くかどうかを判断するにはどうすれば良いの でしょうか? まず、ソフトウェアモデムを示す名前や記述があるかどうか確か めてください : HSP, HCF, HSF、制御装置なし、ホスト制御型、ホストベー ス、そして soft- モデムなどです。ソフトウェアモデムの Linux ドライバが 入手できたごくまれな場合にのみ、正常に動作するでしょう。そのモデムの型 名が分からなくて、そして Linux PC に Windows も入っているなら、「コン トロールパネル」で「モデム」のアイコンをクリックしてください。まず、4 つ前の段落で述べた Web の一覧を確認してください。もしモデムが動作しな い(あるいはうまく動かない)なら、モデムの箱(あるいはマニュアル) を見 て、「最小システム要件」あるいは「システム要求」といった記述のある部分 を探すと良いでしょう。それは小さな字で印刷されているかもしれません。 じっくり読んでください。要求の中に Windows が載っていたら、おそらく Linux では動作しないでしょう。 一方、Windows が必要だと明言しないモデムは、Linux で動作するかもしれま せん。「Windows 用に設計した」ということは、Microsoft の PnP を完全に サポートしていることを意味しているだけかもしれません。Linux が同じ PnP 機能を使用しているなら問題なく動作します(しかし、Linux を使用して設定 するのは難しいです)。「Windows 用に設計した」という記述は、Linux で動 作するか否かを判断する手がかりにはなりません。製造元の Web サイトを確 かめるか、メールで尋ねるのが良いでしょう。あるモデルは Linux で動作 し、他のモデルは動作しないと明言する Web ページを、著者はかつて見たこ とがあります。 ドライバを手に入れるという問題のほかにも、ソフトウェアモデムには利害得 失があります。ソフトウェアモデムは処理の大部分に CPU を使用するので ボード上の電子部品が少なくて済み、製造コストが安くなります。ですが、モ デムが CPU に高い負荷をかけるので、他の処理が遅くなる可能性がありま す。実際、CPU を激しく使用するタスクが同時に動いていると、特に処理が遅 くなります。もちろん、ソフトウェアモデムを使っていないときには、全く処 理能力の低下は発生しません。このコスト削減には価値があるのでしょうか? モデムをあまり使わなかったり、モデムの使用中に高い CPU 負荷をかけるタ スクがない場合には、その答えは yes になります。このように、ソフトウェ アモデムの使用が経済的に正解である場合もあります。モデムにかける経費を 削った分をつぎ込んで高性能の CPU を手にいれたところで、処理速度はほん のちょっとしか上がらないでしょう。しかし、モデムボードの電子部品は汎用 CPU よりも効率的に処理を行えます。従って、多くの場合、多分ソフトウェア モデムの使用を避ける方が良いでしょう。 2.5. PCI モデム PCI モデムボードは PC のマザーボード上の PCI バススロットへ挿入するも のです。不幸なことに、多くの PCI モデムが Linux では動作しないようで す。しかし、その一部をサポートする努力が進行中です。``PCI バスはまだサ ポートされていません'' をご覧ください。 2.6. Linux で動作しない内蔵モデムは? o ``(内蔵)ソフトウェアモデム'' など。全く動作しません。 o ``PCI モデム'' Linux ではめったに動作しません。 o ``MWave および DSP モデム'' 動くかもしれません。しかし、PC の起動時 に毎回、まず Windows あるいは DOS を起動する必要があります。 o ``RPI (Rockwell)'' モデムは動作するものの、性能は劣ります。 2.6.1. MWave および DSP モデム この種のモデムは DSP (Digital Signal Processor) を使っています。モデム を使う直前に、ハードディスクから DSP のメモリへプログラムをダウンロー ドするよう、DSP は作られています。不運にも、DOS あるいは Windows のプ ログラムでそのダウンロードを行うなら、Linux では動作しません。通常、 Linux で動作するモデムも DSP を持っていますが(パッケージに書いてあるか もしれません)、動作プログラムはモデム中に格納されています。これは本節 でいう意味の「DSP モデム」ではなく、Linux でも正常に動作するはずです。 DSP モデムの一例に IBM Aptiva の MWAVE があります。 DSP モデムがシリアルポートをシミュレートするなら、Linux でシリアルポー トを経由しモデムと通信できます。同じ PC 上に DOS あるいは Windows が 入っているなら、モデムを使えるかもしれません : まず (Windows 用ドライ バを使わずに DOS を使って)、DOS でドライバをインストールします。DOS か Windows を起動し(モデムが初期化されることを確かめ)、電源を切らずに Linux を起動します。DOS から Linux へ移行する方法のひとつは、 loadlin.exe を使用することです (Config-HOWTO をご覧ください)。もうひと つの方法は CTRL-ALT-DEL を押すだけです。モデムは DOS で使用したものと 同じ COM ポート(同じ IO アドレス)を記憶しています。 [訳注 : JF プロジェクトによる日本語訳 Config-HOWTO ] 2.6.2. Rockwell (RPI) ドライバ Rockwell RPI (Rockwell Protocol Interface) ドライバを必要とするモデム は、そのドライバが Windows でしか動かないにもかかわらず、Linux で使用 できます。なぜなら、MS Windows のソフトウェアはデータ圧縮とエラー訂正 しか行わないからです。データ圧縮とエラー訂正をせずにモデムを使えば、 Linux でも使用できます。そのためには、モデムの電源を入れる度に、モデム へ(初期化文字列で)「RPI 無効化」コマンドを送り、RPI を無効にする必要が あります。このコマンドは著者のモデムでは +H0 です。インターネットから ダウンロードする多くのファイルは圧縮済みです。更に圧縮を試みてもダウン ロードを遅くするので、データ圧縮を利用しなくてもそれほど多くの不利益は ないかもしれません。 3. マルチポートモデムボード 内蔵モデムには、1 枚のボード上に複数のモデムを持つボードもあります。通 常は、ボード 1 枚あたり 8 個のモデムがあります。あなたのコンピュータ へ、数人が同時にダイヤルインおよびダイヤルアウトできるようにしたいのな ら、マルチポートモデムボードが必要になるでしょう。こういったモデムはデ ジタルモデムではないので、ダイヤルインするユーザは 56k を使えないこと に、注意してください。従って、これは ISP には向いていません。以下に、 Linux で動作するボードの一覧を挙げます。Web サイトにドライバへのリンク があるはずです。 Multi-Tech Systems 社の MultiModemISI 56K あるいは 33.6K の PCI か ISA で、4 ポートまたは 8 ポートのモ デムで、ISDN/56K 共用です。 Moreton Bay Products 社の RAStel PCI あるいはISA の 4 または 8 ポートの56Kモデムで、2 つのモデム と 2 つの空きシリアルポートがあります。 Comtrol 社の RocketModem ISA の 4 あるいは 8 ポートの 33.6K モデム。 Digi 社の AccelePort (RAS Family) 電話会社へのデジタル回線が必要となる 56k モデムは多少複雑になります。 従って、ISP が使うモデムに関しては、この HOWTO では扱いません。 What do I need to be an ISP? をご覧ください。Cyclades 社はここで製品を宣伝 しています。ですから、購入前に製品を比較してください。デジタルモデムの 載っている高価な専用 PCI ボードを買えば、PC を「リモートアクセスサー バ」の代わりになることを、覚えておいてください。 4. モデムとシリアルポートの基礎 モデムを使用するあるいは取り付けるために、その基礎を必ずしも理解する必 要はありません。しかし、何か問題が起こった際にモデムの動作原理を理解し ていれば、何が悪いのかを見定めるのに役立つかもしれません。本章を読んだ あと、更に理解を深めたいのなら、(まだ不完全ですが)本文書中の ``モデム がどのように動作するのか'' の章を読みたくなるでしょう。シリアルポート に関する(本章の内容以上の)詳細については、Serial-HOWTO に記述がありま す。 [ 訳注 : JF プロジェクトによる日本語訳 Serial-HOWTO ] 4.1. モデムのデジタル-アナログ変換(およびその逆) 既に電話網の基幹部はほぼすべてデジタル回線になってるものの、家庭 (ある いはオフィス)への回線はたいていアナログ回線です。つまり、発声した音声 波形の正確な複製を電圧波形として送るように設計してあります。このような 電圧波形を「アナログ」と呼びます。オシロスコープで観測すると、アナログ 波形は周波数と振幅が変化する正弦波のように見えます。デジタル信号は方形 波に似ています。例えば、3 ボルトは 1 に、0 ボルトは 0 に割り当てま す。(外付けモデムが使用する)大抵のシリアルポートは +12 ボルトが 0 を、- 12 ボルトが 1 を表します(いくつかは ±5 ボルトのものもありま す)。 電話回線を通してコンピュータからデータを送るために、モデムはコンピュー タからのデジタル信号をアナログ信号に変換します。モデムはアナログ正弦波 を生成し、それを変調 (MODulating) します。変調の結果はデジタルデータを 表現しているので、この信号もまたアナログ信号ではなくデジタル信号と呼び ます。しかし、その信号はアナログ信号と類似しており、ほぼすべての人がア ナログ信号と呼んでいます。電話回線のもう一方の端で、他のモデムがこの信 号を復調し (DEModulate)、もとのデジタル信号を復元します。この変調 (MODulating) と復調 (DEModulate) をまとめて(2つの d のうちひとつを落と して)、モデム (modem) という語になります。従って、モデム (modem) とは 変調 - 復調器 (MODulator - DEModulator) を意味します。変調に関しては ``変調の詳細'' の節に記述があります。 4.2. シリアルポートとは? 4.2.1. シリアルの基礎 シリアルポートは入出力装置です。 モデムにはコンピュータとの間にシリアルポートがあり、モデムと同様にシリ アルポートについても理解する必要があります。 ほとんどの PC はシリアルポートを 1 つあるいは 2 つ持っています。各ポー トはコンピュータの裏側に 9 ピン (25 ピンのこともあります)コネクタを 持っています。コンピュータのプログラムは送信ピン(出力)にデータ(バイト 列)を送ることができますし、受信ピン(入力)からデータを受け取ることもで きます。他のピンはフロー制御と接地のために使います。 シリアルポートは単なるコネクタではありません。シリアルポートは並列の データを直列に変換し、データの電気的な表現を変えます。コンピュータ内部 では、データを表すビット群は並列に流れます(同時に複数の配線を用いま す)。データを直列に流すことは、1 本の配線(シリアルコネクタの送信ピンや 受信ピン等) にビットのストリームを流すことです。シリアルポートでこのよ うにデータを流すため、シリアルポートはデータを並列(コンピュータ内部の 形式)から直列に変換できなければなりません(その逆の変換も必要です)。 シリアルポートの電子回路のほとんどは、UART と呼ばれるチップ(あるいは チップの一部)です。UART の詳細については、``UART って 何ですか? 性能 にどんな影響を与えますか?'' の章を見てください。しかし、まずはこの章か ら読むとよいでしょう。全体における UART の位置づけが分かるからです。 4.2.2. ピンと配線 古い PC では 25 ピンのコネクタが使われていましたが、このうち実際に使わ れていたのは 9 本のピンだけです。従って、現在ではほとんどのコネクタは 9 ピンです。9 本のピンはそれぞれ配線につながっています。データの送信と 受信用に 1 本ずつの配線が使われ、信号の接地用に 1 本のピン(配線) が使 われます。各配線の電圧は、この接地電圧に対して計測されます。従って、双 方向のデータ送信に必要となる最小の配線数は3本です。接地線を用いなくと も動作しますが、この場合には性能が落ちたり、エラーが起きたりします。 他にも配線がありますが、これらは制御用(シグナリング)に使われるだけであ り、データの送信には使われません。全種類の信号を同じ線で共有することも できますが、シリアルポートはそうなっておらず、信号の種類ごとに別々の専 用線が用意されています。これらの制御用配線の一部(あるいは全部)は「モデ ム制御線 (modem control line)」と呼ばれます。モデム制御線の状態は、 +12 ボルトの有効 (on) 状態か、-12 ボルトの無効 (off) 状態のどちらかで す。これらのモデム制御線の 1 つは、コンピュータにシリアルポートからの データ送信を止めさせる信号を送るためのものです。この反対に、シリアル ポートに接続されたデバイスからコンピュータへのデータ送信を止めさせるた めの制御線もあります。この他にも、接続されているデバイスがモデムの場合 にモデムに電話を取るように指示したり、接続が確立していることや電話が 鳴っている(誰かが電話をかけてきている)状態であることをコンピュータに教 えるための線もあります。ピンおよび制御信号の詳細については、Serial- HOWTO をご覧ください。 [ 訳注 : JF プロジェクトによる日本語訳 Serial-HOWTO ] 4.2.3. 内蔵モデムのシリアルポート 内蔵モデムには9ピンのコネクタはありませんが、ちょうど前述の配線が存在 するかのように振る舞います。モデム制御線の12ボルト信号ではなく、内蔵モ デムには存在しない「配線」の状態を表すため、自分自身にメモリ(レジスタ) を持ち、その状態ビットを使用します。コンピュータには、内蔵モデムのシリ アルポートが本物のシリアルポートのように見えます。そして、通常のシリア ルポートと同様に、115200 bits/sec といった回線速度制限もあります。現在 では不幸なことに、多くの内蔵モデムが上記のような方法では動作せず、 (CPU で動く)ソフトウェアがモデムの処理の大部分を行います。ときには、こ ういったソフトウェアは MS Windows 用のものしかありません(Linux へ移植 されていません)。こういったモデムの多くは Linux で動作しません。``(内 蔵)ソフトウェアモデム''の節をご覧ください。 4.3. IO アドレスおよび IRQ コンピュータはそれぞれのシリアルデバイスと通信する必要があるので、 OS はそれぞれのシリアルポートが存在することと、それらがある場所 (I/O アド レス)を知っていなければなりません。 また、OS はシリアルポートが CPU に サービスを要求するときにどの線(IRQ 番号)を使うかも知っている必要があり ます。シリアルポートはこの線に割込みを送ることによってサービスを要求し ます。したがって、それぞれのシリアルポートデバイスは I/O アドレスと IRQ (Interrupt ReQuest number)の両方を不揮発性メモリに保存していなけれ ばなりません。``割込み'' の節をご覧ください。PCI バスの場合は、全くこ のように動作するわけではありません。というのも、PCI には独自の割込みシ ステムがあるからです。しかし、PCI 対応の BIOS はチップの設定を行って PCI の割込みを IRQ にマッピングするため、見かけ上は先の説明の通りに動 作します。ただし、割込みの共有が許されている点は除きます(2 つあるいは それ以上のデバイスが同じ IRQ 番号を使うことができます)。 I/O アドレスはメモリのアドレスとは異なります。I/O アドレスがコンピュー タのアドレスバスに設定されると、他の配線に信号が流れます。この信号は、 メインメモリにアドレスを無視させることと、I/O アドレスを持っている全て のデバイス(シリアルポート等)にそのアドレスを監視させ、それがデバイスの アドレスにマッチするかどうかを調べさせることを指示します。もしアドレス がマッチすれば、その I/O デバイスはデータバス上のデータを読み込みま す。 4.4. 名前: ttyS0, ttyS1 など シリアルポートには ttyS0, ttyS1 といった名前が付けられます(そしてこれ は普通 DOS や Windows における COM1, COM2 等に対応します)。 /dev ディ レクトリには、それぞれのポートに関するスペシャルファイルがあります。 ``ls /dev/ttyS*'' を実行してこれらのファイルを見てみましょう。ただし、 (例えば)ttyS3 ファイルがあるからといって、必ずしもそこに物理的なシリア ルポートが存在するわけではありません。 (ttyS0, ttyS1 等の)名前がどの物理シリアルポートを指すのかは、以下のよ うにして決まります。シリアルドライバ(ソフトウェア)は、どの I/O アドレ スがどの ttyS に対応するのかを示す表を管理しています。このような名 前(ttyS1 等)から I/O アドレス(と IRQ)への対応は、設定も表示も ``setserial'' コマンドで行うことができます。``setserial とは何か?''の 節をご覧ください。このプログラムはハードウェアそのものの I/O アドレス や IRQ の設定は行いません (ハードウェアの設定はジャンパやプラグ&プレイ の設定プログラムで行います)。このように、どの物理ポートが ttyS1 などに 対応するのかは、シリアルドライバの設定 (setserial による)とハードウェ アの設定の両方に依存します。これに間違いがあると、物理ポートは (ttyS2 などの)どの名前にも対応せず、従って使えないかもしれません。詳しくは ``/dev/ttyS2 などのシリアルポートデバイス'' の章をご覧ください。 4.5. 割込み 電話回線を通じモデムにやってくるデータは、モデムがアナログからデジタル へ変換します。そして、シリアルポートを通りコンピュータ中の目的地に到着 します。 シリアルポートは、ある数のバイトデータ(1, 4, 8, 14 のいずれかに設定さ れていると思います)のデータを FIFO バッファに受け取ります。すると、通 常はそのポートだけが使う特定の配線上に割込みとして知られる電気信号を流 すことにより、そのデータを取り込むように CPU に伝えます。このように FIFO は、ある数のバイトデータを待って、それから割込みを発行します。 しかし、この割込みは、次のバイトデータが届くのを待っている間に、予期し ない遅延が生じたときにも送られます(タイムアウトといいます)。このよう に、 (端末のキーボードで入力しているときのように)バイトデータがゆっく り受信されていると、1 バイトを受け取るごとに割込みが発行されるかもしれ ません。一部の UART チップでは、以下のような規則になります: 4 バイトを 連続して受け取れるかもしれなかったのに、これらの 4 バイトのデータがい ずれも出てこなければ、シリアルポートは次のバイトデータを待つのをあきら め、現在 FIFO に入っているバイトデータを取得させるために割込みを発行し ます。もちろん、FIFO が空であれば割込みは発行されません。 それぞれの(コンピュータ内部の)割込み線には番号 (IRQ) が付いており、シ リアルポートは信号を送るためにどの線を使うのかを知らなければなりませ ん。例えば、ttyS0 は通常、IRQ 番号 4 を使います。これは IRQ4 (または IRQ 4) と書きます。IRQ 番号のリストなどは ``man setserial'' に書いてあ ります( 「シリアルポートのコンフィギュレーション上の注意事項 (Configuring Serial Ports)」の章を見てください)。シリアルポートが CPU の注意を引きつける必要がある際には、必ず割込みを発行します。割込みの発 行を適切なタイミングで行うことは重要です。というのも、シリアルポートの バッファは入ってくるデータを 16 バイト(古いシリアルポートでは 1 バイ ト) しか保持できないからです。このような受信データをバッファからうまく 取り出すことに CPU が失敗すると、これ以上のデータが入る場所がなくな り、小さなバッファがあふれて(オーバーラン)が起こってしまい、データは無 くなります。 外付けモデムに関しては、この現象をすみやかに防ぎオーバーフローを止める (フロー制御のような)方法はありません。内蔵モデムに関しては、16バイトの FIFO バッファがモデムボード上にあり、出来の良いモデムはバッファに空き がなければ書込みを行いません。従って、良い内蔵モデムはこの16バイトの バッファをあふれさせることがありません。しかし、モデム自体がオーバーフ ローすることを防ぐには``モデム間のフロー制御'' を使う必要があるかもし れません。以上のことは外付けモデムに対する、内蔵モデムのひとつの利点に なっています。 割込みは、シリアルポートが 16 バイトのデータを小さい送信バッファから外 部ケーブルに全て送り出した直後にも発行されます。この送信バッファには、 送り出すデータ用の 16 バイトの空きができます。割込みはこの事実を CPU に伝え、小さい送信バッファに送信すべき新しいデータを入れさせるために用 います。また、モデム制御ラインの状態が変化したときにも割込みが発行され ます。 前述のバッファはすべてハードウェアバッファのことです。シリアルポートは 主記憶上にも大きなバッファを持っています。これに関しては後ほど説明しま す。 割込みは多くの情報を伝えますが、これは間接的にしか行いません。割込みそ のものは、特定のポートが注意を求めていることを割込みコントローラと呼ば れるチップに知らせるだけです。割込みコントローラはこれを受けて CPU に 信号を送ります。CPU はシリアルポートにサービスを提供する特殊なプログラ ム(シリアルデバイスドライバの一部)を実行します。このプログラムは割込み サービスルーチン(または割込みハンドラ)と呼ばれます。割込みサービスルー チンはシリアルポートで起きた出来事を調べ、その問題 (シリアルポートの ハードウェアバッファのデータ入出力など)を処理します。このルーチンはシ リアルポートで起きたことを簡単に知ることができます。というのも、シリア ルポートのレジスタはシリアルデバイスドライバが知っている I/O アドレス にあるからです。このレジスタは、シリアルポートの状態に関する情報を保持 しています。デバイスドライバはこのレジスタを読んでその内容を調べること により、シリアルポートで起きたことを知り、適切な動作を行うことができま す。 4.6. (モデムによる)データ圧縮 シリアルポートの基礎を続ける前に、モデムが行っているデータ圧縮に関して 理解する必要があります。コンピュータの CPU がソフトウェア処理によりこ の圧縮を行うこともあります。しかし不幸なことに、現在ではこういったソフ トウェアは MS Windows 上でしか動作しません。これは Linux でモデムを動 作させるために必ず発生する問題であり、この議論はモデム自身がどこで圧縮 を行うのかに関するものです。 電話回線を通じデータをより高速に送るためには、ひとつにはデータに依存し た特定の符号化方式を用いて圧縮を行う方法があるでしょう。符号化したデー タはもとのデータよりも小さくなり、短い時間でインターネットを通じて送る ことができます。この過程を「データ圧縮」と呼びます。 インターネットからファイルをダウンロードする際、ファイルは既に圧縮して あり、モデムが更に圧縮を試みてもうまくいきません。モデムは既に圧縮済み のものを感知し、更なる圧縮を試みないかもしれません。対向するモデムから 圧縮済みのデータを受け取ったたら、モデムはデータを展開し、電話回線を通 じ送られたデータより多くのデータを作成します。従って、モデムからコン ピュータへ送られるデータ量は、電話回線上での流量よりも多くなるでしょ う。これらの流量の比率を圧縮率と呼びます。圧縮率は最高でも 4 程度です が、ほとんどありえないことです。 4.7. エラー訂正 モデムがエラー訂正を行うように設定されているかもしれません。これはデー タ圧縮に似ています。エラー訂正には送信速度(フローレート)を減少させる オーバーヘッドが伴うものの、エラー訂正はスタートビットおよびストップ ビットを削ぎ落し、送信速度を向上させます。 外界とのインターフェイスであるシリアルポートは、各 8 ビット(1バイト)に スタートビットおよびストップビットの 2 ビット分を付加します。エラー訂 正がなければ、これらの付加されたスタートビットおよびストップビットは、 モデムと電話回線を通過していきます。しかし、エラー訂正を有効にすると、 こういった付加ビットは取り除かれ、8 ビット分がパケットに入ります。パ ケットヘッダおよびエラー訂正用の付加情報があるにも関わらず、これは効率 が良くより高い送信速度をもたらします。 4.8. データフロー(速度) (文字、画像などを表すバイト列である)データはコンピュータからモデムへと 流れ、電話回線を通じ外界へ、あるいはその逆方向に送られます。データが流 れる速度である (56k (56000) ビット/秒などの)フローレートは、(不正確で すが) 「速度」と呼ばれます。ですが大抵の人は「フローレート」ではなく 「速度」の方を使います。もしデータ圧縮を行わなければ、コンピュータから モデムへのフローレートは電話回線上での伝送速度と等しいはずです。 実際、電話回線の終端にはふたつの異なったスピードがあります。 o モデム - モデム間の電話回線そのものの速度(DCE スピード) o シリアルポートからモデムまでの速度(DTE スピード) 電話回線のもう一端にあるモデムに電話をかけて接続すると、モデムは ``CONNECT 28800'' あるいは ``CONNECT 115200'' といったメッセージをあな たに送ります。これは何を意味しているのでしょうか? これは DCE スピード あるいは DTE スピードを示します。表示されたスピードがモデムのスピード より高速なら、それはモデムとコンピュータ間の DTE 速度のはずで す。115200 を示した上記の場合がそれにあたります。28800 に関しては、シ リアルポートにはその速度がないので、DCE (モデム - モデム間)速度のはず です。どちらか一方の速度を示すよう、モデムを設定する人がいるかもしれま せん。また、両方の速度、そして(例えば) ``CARRIER 28800'' のようなモデ ム間の速度を示すモデムもあるでしょう。 内蔵モデムの場合には、モデムがコンピュータの内部にあってほとんどコン ピュータの部品なので、モデムからコンピュータへの DTE 速度には速度上の 限界はないでしょう。しかし、内蔵モデムは内部に専用のシリアルポートがあ ります。 平均速度は仕様で決められている速度よりも遅い場合が多いことを理解してお くことが大切です。待ち時間(あるいはアイドル時間)があると、平均速度は低 くなります。このような待ち時間には、 ``フロー 制御'' による 1 秒程度も ある長い待ち時間も含まれます。別の極端な例としては、バイトデータを送る 間の数ミリ秒という非常に短い待ち時間があります。それに加え、電話回線の 状態が良くない場合、モデムは速度を落とすこともあります。 最良の DTE 速度に関する議論は ``使うべき速度は?'' の章をご覧くださ い。 4.9. フロー制御 フロー制御とは、配線を流れるバイトデータを止める機能のことです。これに は、バイトデータを失うことなくデータを再び流し始める機能も含まれます。 フロー制御は、モデムが瞬間のフローレートを非連続的に変えられるようにす るために必要です。 4.9.1. フロー制御の例 例として、33.6k の外部モデムを短いケーブルを使ってシリアルポートに接続 する場合を考えましょう。このモデムは電話回線上で 33.6k bps (ビット毎 秒)でデータを送受信します。データ圧縮やエラー訂正は全く行わないものと します。シリアルポートの速度は 115.2k bps に設定してあり、データをコン ピュータから電話回線に送ります。すると、コンピュータからモデムへは短い ケーブルを通って 115.2k bps でデータが流れます。しかし、モデムから電話 回線へは 33.6k bps でしかデータが流れません。データが出て行くよりも速 くデータが入ってくるので、モデムは超過分のデータ (115.2k -33.6k = 81.6k bps)をバッファに保持しなければなりません。 115.2k bps のデータの 流れが止まらない限り、結局はこのバッファは溢れて (空き容量がなくなっ て) しまいます。 ですが、ここでフロー制御が役立ちます。モデムのバッファが溢れそうになる と、モデムはシリアルポートに停止信号を送ります。シリアルポートはこの停 止信号をデバイスドライバに渡し、115.2k bps のデータの流れは停止しま す。モデムは、今までバッファに蓄えたデータを取り出しながら、そのまま 33.6k bps でデータを送り続けます。するとバッファには何も入ってこないた め、バッファ内のデータ量は減り始めます。バッファ内のデータがほとんどな くなると、モデムは開始信号をシリアルポートに送り、コンピュータからモデ ムへ再び 115.2k bps でデータが流れ始めます。フロー制御により事実上、短 いケーブル上での平均的なフロー速度(この場合は 33.6k bps)は、データを 「流し続けた」場合の速度である 115.2k bps よりもずっと遅くなります。こ れが「開始- 停止」フロー制御です。 上記の簡単な例はコンピュータからモデムへの流れのフロー制御でしたが、反 対向きの流れ(モデムからコンピュータへの向き)に対して用いるフロー制御も あります。すなわちモデム(または他のデバイス)からコンピュータの向きで す。どちらの向きの流れにも 3 つのバッファ(1. モデム内のバッファ、 2. UART チップ(いわゆる FIFO)の内部、3. シリアルドライバが管理するメイン メモリ中のバッファ)があります。フロー制御は、特定のバッファが溢れない ように保護します。小さい UART FIFO バッファはこのような保護を受けてい ませんが、その代わりに、このバッファが発行する割込みへの応答が高速であ ることを期待して動作します。FIFO は「First In, First Out(先に入った データが先に出る)」という、バイトデータの扱い方を表しています。 3 つの バッファ全てが FIFO の規則で動作しますが、これを名前として持っているの は 1 つだけです。これがフロー制御の本質ですが、説明することはもっとた くさんあります。 この(モデムから PC への)方向のフロー制御は必要ないことが多いです。これ が必要となる複雑な例に関しては Serial-HOWTO の ``複雑なフロー制御の 例'' をご覧ください。しかし、モデムとコンピュータ間(シリアルポート)に 充分に高速な設定がない場合、モデムから PC への流れを減らす必要がありま す。そのためには、電話回線からのデータの流入を停止しなければなりませ ん。モデムは対向するモデムに送信を停止するよう伝えなければいけませ ん。``モデム間のフロー制御'' をご覧ください。 [ 訳注 : JF プロジェクトによる日本語訳 Serial-HOWTO ] 4.9.2. ハードウェアフロー制御対ソフトウェアフロー制御 可能であれば、できるだけ「ハードウェア」のフロー制御を使いましょう。こ れは専用の「モデム制御線」を 2 本使い、「停止(stop)」と「開始(start)」 の信号を送るものです。 最近のモデムはシリアルポートとの間で、ハードウェアフロー制御をほぼ常時 用います。 ソフトウェアフロー制御は、制御信号を送るために ASCII 制御文字の DC1(開 始)と DC3(停止)を使います。この制御文字は単に、通常のデータストリーム 内に挿入されます。ソフトウェアのフロー制御は反応が遅いだけでなく、特別 な対策を講じなければモデムを使ってバイナリデータを送ることもできませ ん。バイナリデータには大抵、フロー制御用の制御文字 DC1, DC3 が入ってい ます。従って、特殊な対策を立てて、フロー制御の停止信号である DC3 とバ イナリコードの一部である DC3 を区別しなければなりません。DC1 について も同様です。 バイナリデータに対してソフトウェアフロー制御を行うためには、モデム( ハードウェア)とソフトウェアの両方での対応が必要です。 4.9.3. フロー制御がないときの症状 フロー制御の理屈が分かっていると、実際に役立つこともあります。例えば、 著者はモデムを使ってインターネットにアクセスし、問題なく稼動しているか に見えました。しかし、数ヶ月後に PC から ISP へ大きなファイルを送ろう とした際、大量の再送および送信誤りが生じました。(結局 Kermit は多くの 再送をしたののち、ファイルを送ることができました。) (ISP から著者への) 逆方向の受信では快適に動いていました。この問題はモデムのフロー制御が無 効になるハードウェアの欠陥によるものでした。著者のモデムはデータ送信を 止めるための「停止」信号をコンピュータに送らなかったので、大きな送信 ファイルでバッファがオーバーフロー(オーバーラン)しました。モデムからコ ンピュータへの方向では、電話回線上の流量よりも( 115.2k という)モデムか らコンピュータへの容量のほうが常に大きいため、問題が発生しませんでし た。初期化文字列にフロー制御を有効にするコマンドを付加しフロー制御を有 効にすることで、この問題を解決しました(デフォルトで有効になっているは ずなのに、何かがおかしくてそうなっていませんでした)。 4.9.4. モデム間のフロー制御 これは電話回線を通じ 2 つのモデム間でデータを送る際の、フロー制御に関 する記述です。エラー訂正が有効な場合のみ、モデム間のフロー制御は可能と なります。実際、エラー訂正を行わなければ、モデム間のソフトウェアフロー 制御を有効にできますが、バイナリデータの送信を妨げるかもしれないので、 あまり用いません。 4.10. データフロー経路 - バッファ この話題については、フロー制御、(ハードウェアが持つ) 16 バイトの FIFO バッファの対、モデムにある大きなバッファ対を含めた大部分を既に説明しま した。しかし、これ以外にもまだバッファの対があります。メインメモリ上に ある大きな(多分 8kB の)バッファがあり、これもシリアルポートのバッファ と呼ばれます。アプリケーションプログラムがデータをシリアルポート (そし てモデム)に送ると、このデータはまずメインメモリ上の方の(シリアルポート の) 送信バッファに格納されます。バッファの対はデータの流れの向きが反対 である、送信バッファと受信バッファの組み合せです。 シリアルポートのデバイスドライバは、例えば 16 バイトのデータを 1 バイ トずつ送信バッファから取り出し、これをシリアルポートのハードウェアが送 信用に持っている送信バッファに入れます。一度データが送信バッファに入る と、その送信を止める方法はありません。そしてこのデータはシリアルポート から適切な大きさ(恐らく 1KB )のバッファを持つモデムへ送り出されます。 デバイスドライバが(フロー制御の指示を受けて)コンピュータから送信される データの流れを止めたとき、実際に止まるのはメインメモリ上の大きな送信 バッファから送り出されるデータの流れです。データが止められ、モデムへ送 り出されるデータの流れが止まった後であっても、アプリケーションプログラ ムは、8kB の送信バッファがいっぱいになるまでは、ここにデータを送り続け ることができます。 このバッファがいっぱいになると、アプリケーションプログラムはそれ以上の データを送る(C 言語では ``write'' 文を使います) ことができなくなり、ア プリケーションの実行を一時的に停止してバッファに空きができるのを待ちま す。このように、フロー制御の ``stop'' 信号は結局、データを送るプログラ ムを止めることができます。このプログラムが止まっても、コンピュータは計 算を止める必要はありません。フロー制御の stop 信号を受けて待っている間 は、別のプロセスに切替えればよいのです。以上の説明は多少簡略化しすぎて いますが、``write'' 文を待っている間にアプリケーションプログラム自体に 別処理をさせる方法がこれとは別にあるからです。 4.11. モデムコマンド 通信ソフトウェアはデータを送る配線と同じ配線を用いて、モデムへコマンド を送ります。このコマンドは短い ASCII 文字列です。例えば、 ``AT&K3'' は コンピュータとモデム間のハードウェアフロー制御 (RTS/CTS) を有効にしま す。``ATDT5393401'' は電話番号 5393401 をダイヤルします。すべてのコマ ンドが ``AT'' で始まることに注意してください。こういったコマンドはフ ロー制御を有効にするなど、モデムを設定するために役立ちます。その他のコ マンドは電話番号をダイヤルするなど、何らかの動作を行います。約 100 以 上の異なった使用可能なコマンドがあります。通信ソフトウェアが動き出す と、モデムを設定するためにコマンドの「初期化」文字列をモデムに送りま す。モデムがダイヤルする(あるいは電話を受ける)前に、すべてのコマンドが 通常のデータ通信線を用いて送られます。 モデムを他のモデムに接続した(オンラインモードの)とき、コンピュータから モデムへ送ったすべてのデータはもう一方のモデムへ直接到達し、コマンドの ようにモデムが解釈することはありません。オペレーションモードから、送信 データすべてをモデムが解釈するコマンドモードへ「エスケープする」方法が あります。コンピュータが特定の時間間隔で ``+++''のみを送信します。この 間隔が正しければ、モデムはコマンドモードへ復帰します。もうひとつの方法 はモデム制御線に信号を送ることです。 インターネット上には多くのモデムコマンドのリストがあります。``Web サイ ト'' の節では、こういったウェブサイトへのリンクを載せています。異なっ た型番やブランドのモデムは、異なったコマンドセットを使用します。従っ て、あるモデムのコマンドが他のモデムでは動作しない可能性があります。( すべてのモデムで動作する保証はありませんが)共通のコマンドは、この HOWTO の ``モデムの設定 '' の節に載せてあります。 4.12. シリアル操作ソフトウェア: デバイスドライバモジュール シリアルポート用のデバイスドライバは、シリアルポートを操作するソフト ウェアです。現在はこれはシリアルモジュールとして用意されています。この モジュールは普通、必要なときに自動的に読み込まれます。バージョン 2.2 以降のカーネルはこれを行います。これより古いカーネルでは、必要なときに モジュールを自動的に読み込むためには kerneld を実行する必要がありまし た。これを行わない場合には、/etc/modules に明示的に列挙する必要があり ました。モジュールが Linux で一般的になる前は、シリアルドライバはカー ネルに組み込むのが普通でした。もし、シリアルドライバがまだカーネルに組 み込んであるのなら(カーネルのコンパイル時にそう選択したのかもしれませ ん)、シリアルモジュールをロードしてはいけません。もしこれをロードして シリアルドライバが 2 つになってしまうと、シリアルポートは使えなくなり ます。この場合にシリアルポートをオープンしようとすると ``I/O error'' となります。 シリアルモジュールが読み込まれると、存在するシリアルポートに関するメッ セージが画面に表示されます(間違った IRQ を表示することもよくありま す)。しかし、一度 setserial を使ってデバイスドライバに(たぶん)正しい IRQ を教えれば、次には一度目と似た形式で正しい IRQ 等が表示されるはず です。setserial の詳細については ``setserial とは何か?'' をご覧くださ い。 カーネルのソースコードを編集してドライバを修正することができます。シリ アルドライバの大部分は serial.c ファイルにあります。シリアルポートを使 うプログラムの詳しい書き方については、Serial-Programming-HOWTO をご覧 ください(現在 Vern Hoxie さんが改訂中です)。 [訳注 : JF プロジェクトによる日本語訳 Serial-Programming-HOWTO ] 5. 設定の概要 MS Windows あるいは DOS 上のみでモデムを使いたいなら、たいていのモデム はただ取り付けるだけでよく、正しく動作するでしょう。外付けモデムでない 限り、Linux ではたいていの場合このように簡単にはいきません。 (``Plug and Play'' とラベルが貼ってあるとしても) 外付けモデムは正しく動作する はずです。しかし、最近の内蔵モデムの多くはプラグ&プレイ (PnP) であ り、PnP のシリアルポートがあります。ISA のモデムなら、Linux の ``isapnp'' プログラムを使う必要があるかもしれません。詳細は Plug-and- Play-HOWTO をご覧ください。 [訳注 : JF プロジェクトによる日本語訳 Plug-and-Play-HOWTO ] モデムはシリアルポートと連携するため、モデムの設定にはふたつの部分があ ります。 o モデム自身の設定 - 通信端末で設定する o モデムのシリアルポートの設定 - *一部だけ*を通信端末で設定する (推奨項目であって必要ではない)上記設定の多くは、モデムとともに使う minicom, seyon, wvdial などの通信プログラムや PPP で設定します。モデム をダイヤルインに使用しているのなら、訪問者にログインプロンプトを出力す る getty プログラムがモデムの設定に役立ちます。従って、モデム(そしてシ リアルポートの大部分)を設定するためには、通信プログラムを(あるいは PPP や getty を)設定する必要があります。 上記の設定作業では、シリアルポートの IO アドレスや IRQ をハードウェア とドライバに設定するような、低レベルの設定は行いません。運が良ければ、 Linux を起動する際に自動的に設定されます。以前はジャンパでハードウェア の設定を行いましたが、現在は「プラグ&プレイ」によりソフトウェアで設定 します。 しかし、深刻な問題があります - (1999年の終りでは) Linux はプラグ& プレ イのオペレーティングシステムではありません。しかし、使いにくいけれども プラグ&プレイを設定できるツールがあります。次節では更に詳しく述べま す。 6. シリアルポートの設定 6.1. PCI バスはまだサポートされていません カーネル 2.2 のシリアルドライバは PCI バスをサポートしていません。しか し、カーネル 2.3 と 2.4 では、ついに一部の PCI シリアルボード(およびモ デムボード)に対応します。ほとんどの PCI ボードは、ドライバによる特殊な サポートが必要です。ドライバはボードにデジタル的に格納されている ID を 読み込み、そのボードにどうやって対応するか(あるいはサポートするかどう か)を決めます。確実にソフトウェアモデムではないのに動作しない PCI ボー ドをお持ちであれば、そのボード用のドライバを作る手助けができます。その ためには、シリアルドライバのメンテナである Theodore (Ted) Y. Ts'o さん に連絡する必要があります。 この際には、``lspci -vv'' の出力のコピーと PCI モデム(またはシリアル ポート)のモデルとメーカーに関する詳しい情報を電子メールで送る必要があ ります。そうすれば、彼は動作するかもしれないテスト用ドライバの場所をで きるだけ教えてくれるでしょう。次に、このドライバを入手してコンパイルし ます。カーネルも多分再コンパイルすることになるでしょう。そして、このド ライバをテストしてうまく動作するかどうかを調べ、その結果を Ted Ts'o さ んに報告します。上記の手順全てをちゃんと行うつもりがあるなら(そしてこ の文書が最新版なら)、彼に必要な情報を送ってください。メールアドレスは です。 PCI モデムはあまり標準化されていません。一部のボードは PC との I/O に メインメモリを使います(ISA ボードはこういった場合には I/O アドレス空間 を使います)。一部のボードは、特殊な方法を使わないと IRQ が有効になりま せん。``lspci'' の出力を見れば、ボードがサポートされているかどうかを調 べる役に立つでしょう。細かい話があまり難しくなければ、筆者がこの方法に ついて調べ、この文書の将来のバージョンで説明するかもしれません。 6.2. 設定の概要 多くの場合、設定は自動的に行われるので、ユーザがすることは何もありませ ん。しかし場合によっては設定を行う必要があります(単に設定を確かめるだ けのこともあるでしょう)。こういった場合に最初にすべきことは、Linux に おけるシリアルポートの設定の 2 つの部分を知ることです。 最初の部分(低レベル設定)は、I/O アドレス、IRQ、名前 (ttyS2 など) を割 り当てることです。この I/O と IRQ の組は、ハードウェアとシリアルドライ バの両方に設定しなければなりません。これを簡単に「IO と IRQ の設定」と 呼ぶことにしましょう。setserial はドライバを設定するために使います。 PnP の機構やジャンパなどはハードウェアの設定に用います。詳しくは後述し ます。設定をする必要があるにも関わらず詳しいことが分かっていなければ、 すぐに問題に出会ってしまうでしょう。 2 番目の部分(高レベルの設定)は速度(38.4K ビット/秒など)の設定やフロー 制御の選択などです。これはときには PPP や minicom といった通信プログラ ムや、getty (他の人があなたのコンピュータへログインできるようにポート 上で動作します)が行います。しかし、設定メニューや設定ファイルにより、 使いたい速度をプログラムへ指定する必要があります。この高レベルの設定 は、 stty プログラムによっても行えます。 stty は、問題があるときに現在 の状態を表示する役にも立ちます。Serial-HOWTO 中の ``stty'' の章をご覧 ください。Linux が起動するときには、いくつかのシリアルポートの検出と( 低レベル)設定が試みられます。正確にどうなるのかは、お使いの BIOS, ハー ドウェア、 Linux ディストリビューションなどによって違います。シリアル ポートがうまく動作しているならば、何もする必要はありません。アプリケー ションプログラムは多くの場合、高レベルの設定を行いますが、必要な情報を 与える必要があるかもしれません。(内蔵モデムに組み込まれることが多い)プ ラグ&プレイのシリアルポートでは、事情はずっと複雑になります。低レベル の設定(IRQ と I/O アドレスの設定)を行う必要がある場合を以下に示します: o 3 つ以上のシリアルポートを使う場合 o 新しいシリアルポート(内蔵モデムなど)をインストールする場合 o シリアルポートで問題が起きた場合 バージョン 2.2 以降のカーネルでは、割込みの共有を使えば低レベルの設定 を行わなくても 3 つ以上のシリアルポートを使えます。この共有はシリアル ポートのハードウェアが対応している場合にのみ動作しますが、低レベルの設 定より簡単とはいえません。``2.2 以降のカー ネルと割込みの共有'' をご覧 ください。 低レベルの設定(IRQ と I/O アドレスの設定)は、(高レベルの設定と比べる と) 比較的問題を起こしやすいようです。多くの場合は完全に自動で、何も設 定することがないのにです。そこで、この章の大部分はその話題を扱います。 シリアルドライバが正しい IRQ と I/O アドレスを知るまでは、ポートは全く 動作しないでしょう。Linux では検出さえされないでしょう。検出されたとし ても、 IRQ が間違っていれば、動作は極めて遅いかもしれません。 ``この上 なく遅い: テキストがすごく遅れてゆっくり画面に表示されます '' を見てく ださい。 Wintel の世界では、I/O アドレスと IRQ は「リソース」と呼ばれます。従っ て、我々は特定のリソースを設定していることになります。しかし、「リソー ス」には多くの種類があるので、この単語には他にも色々な意味があります。 復習になりますが、低レベルの設定は 2 つの値(IRQ 番号と I/O )アドレスを 2 つの場所に設定することです: 1. デバイスドライバ(多くの場合、起動時に ``setserial'' を実行して設定 します) 2. シリアルポートのハードウェアそのもののメモリレジスタ 起動(= ブート時)メッセージを見てください。これは通常は正しいです。しか し問題が起きている場合には、これらのメッセージの一部がハードウェアの正 しい設定を示していない(そして正しくないと思われる)可能性が高いです。 ``I/O アドレスと IRQ: 起動時のメッセージ'' をご覧ください。 6.3. ありふれた間違いで起きた低レベル設定のやり直し 多くの人がやってしまう一般的な間違いを示します: o setserial コマンド: (autoconfig オプションを付けずに) setserial を 実行し、ハードウェアも調べられたと思い込む(実際には調べられません) o setserial のメッセージ: 起動時に画面に表示されるメッセージを見て、 ハードウェアが実際に設定された結果だと間違って信じてしまう o /proc/interrupt: シリアルポートが使われていないときは、その割込みは /proc/interrupts に現われないが、それを見てシリアルポートが見つから ない(あるいは割込みが設定されていない)と誤って信じてしまう o /proc/ioports: このファイルが(たぶん間違いで) setserial と同じデー タしか表示していないとき、これがハードウェア設定を表示すると考えて しまう 6.4. I/O アドレスと IRQ: 起動時のメッセージ 多くの場合、ポートの低レベルの設定は起動時に自動的に行われます(しかし 常に正しいとは限りません)。何が起きているか調べるには、画面上の起動 メッセージを見ましょう。Linux がロードされる前に BIOS が出すメッセー ジ(例は挙げません)の確認も怠らないでください。BIOS のメッセージは Pause キーを押せば一旦止まります。スクロールして流れてしまったメッセー ジを見るには、Shift-PageUp を使います。Shift-PageDown では下向きにスク ロールします。dmesg コマンドを使えばいつでも起動メッセージの一部を見る ことができますが、大事な部分が抜け落ちていることもよくあります。起動 メッセージ(1999 半ばの時点)の例を以下に示します: ttyS00 は /dev/ttyS0 と同じである点に注意してください。 検出されたものが最初に表示されます(ただし IRQ は大雑把に推定したものに 過ぎません): Serial driver version 4.27 with no serial options enabled ttyS00 at 0x03f8 (irq = 4) is a 16550A ttyS01 at 0x02f8 (irq = 3) is a 16550A ttyS02 at 0x03e8 (irq = 4) is a 16550A 保存された値が後で表示されますが、これも正しいとは限りません: Loading the saved-state of the serial devices... /dev/ttyS0 at 0x03f8 (irq = 4) is a 16550A /dev/ttyS1 at 0x02f8 (irq = 3) is a 16550A /dev/ttyS2 at 0x03e8 (irq = 5) is a 16550A ちょっとした不一致がある点に注意してください。最初のメッセージでは IRQ=4 に ttyS2 があるように表示されていますが、二番目のメッセージでは IRQ=5 になっています。最初のメッセージしか表示されないこともあります。 ほとんどの場合は最後に表示されるものが正しいメッセージです。しかし問題 がある場合には紛らわしいかもしれません。この章の残りに書かれているこの 難しい現象の説明を読む前に、とりあえずシリアルポートを使ってみて、正し く動作するかどうかを調べるとよいでしょう。ちゃんと動作しているならば、 この先は特に読まなくてもかまいません。 2 番目のメッセージは、起動時に実行される setserial プログラムが出力し ます。このメッセージは、デバイスドライバが正しいと思っている設定を示し ます。しかし、これも間違っていることがあります。例えば、ハードウェアの IRQ が実際には IRQ=8 に設定されていることもあります(どちらのメッセージ も間違っています)。IRQ=5 が表示されるのは、誰かが間違ってその情報を設 定ファイルに入れたから(あるいはこれと同様の理由)です。Linux がときどき 間違った IRQ を取得するのは、Linux が IRQ の探査を行わないからです。 Linux は単に「標準」の IRQ を仮定するか(最初のメッセージ)、ユーザが 行った設定をそのまま使います(2番目のメッセージ)。この両者はいずれも、 正しいとは限りません。シリアルドライバの IRQ が間違っていると、シリア ルポートの動作が非常に遅くなったり、まったく動作していないように見えた りします。 最初のメッセージは、Linux がシリアルポートの探査を行った結果ですが、 IRQ を検出できていません。ポートがここに現われた場合、そのポートは存在 しますが、IRQ は間違っていることがあります。Linux は IRQ のチェックは 行いません。なぜなら、チェックをしてもフールプルーフにならないからで す。 Linux は IRQ が先に示した値であることを仮定します。なぜなら、これ らが「標準的」な値だからです。 setserial に autoconfig オプションと auto_irq オプションを付けて実行し、手動で確認を行うことができます。し かし、この値が正しい保証はありません。 BIOS のメッセージに表示されるデータ(最初に表示される)はハードウェアに 設定されている値です。シリアルポートがプラグ&プレイならば、 isapnp を 実行してこれらの設定を変えることができます。Linux が起動した後に、これ に関するメッセージを探しましょう。先の例に挙げられている、最後のシリア ルポートのメッセージは、BIOS のメッセージと一致していなければなりませ ん。一致しない場合には、ポートのハードウェアの設定を変更するか、ハード ウェアに実際に設定されている内容を setserial を使ってドライバに教えな くてはなりません。 また、プラグ&プレイのシリアルポートをお使いの場合には、プラグ& プレイ のソフトウェアがハードウェア内部の IRQ と I/O を設定しなければ、 Linux はこれらを検出しません。これは、物理的に存在するシリアルポートが起動 メッセージで表示されない一般的な理由です。PC のハードウェア(PnP BIOS) はこのようなシリアルポートの低レベルな設定を自動的に行います。 PnP の 設定は後で説明します。 6.5. シリアルポートの現在の I/O アドレスと IRQ の設定は? 前の節では、起動メッセージを見て設定を調べる方法を説明しました。起動 メッセージで十分な情報が得られれば、この節を読む必要はありません。情報 が十分でなければ、これを調べる方法がいくつかあります。 「I/O と IRQ の設定はどうなっているの?」という問への答えは実際には 2 通りあります。 o デバイスドライバに設定されている値(たいてい setserial で設定と表示 を行います)。 o 実際にハードウェアに設定されている値。 両者は同じ値でなければなりません。そうなっていないと、ドライバが持って いる物理的なシリアルポートに関する情報が間違っているので、問題を引き起 こします。間違った I/O アドレスがドライバに設定されていると、ドライバ は存在しないポートにデータを送ろうとします。あるいはもっと悪いケースと しては、シリアルポートでない実在のポートにデータを送ろうとします。間 違った IRQ がドライバに設定されていると、ドライバがシリアルポートから の割込みサービス要求を受け取れずに、シリアルポートのバッファが溢れたり 反応が非常に遅くなる可能性があります。 ``この上なく遅 い: テキストがす ごく遅れてゆっくり画面に表示されます'' をご覧ください。ドライバに設定 されている UART のモデルが間違っている場合にも問題が起きやすいで す。I/O - IRQ の組がドライバとハードウェアで同じかどうかを確かめるに は、ドライバとハードウェアの双方がどのように設定されたか確かめる必要が あります。 6.5.1. デバイスドライバの設定は? これを調べるのは簡単です。単に起動メッセージを見るか、 ``setserial - g /dev/ttyS*'' を実行するだけです。シリアルポートがうまく動作していれ ば、この表示内容がハードウェアにも設定されているでしょう。この情報を調 べる別の方法としては、/proc ディレクトリにある「ファイル」を見る方法が あります。このような別の方法を説明する重要な理由は、これらはデバイスド ライバに設定されている情報しか表示しないことに注意してもらうためです。 一部の人は、/proc ディレクトリにある特定のファイルを見て、これがハード ウェアに設定されていると勘違いしてしまいますが、「必ずしもそうではあり ません」。 /proc/ioports は、ドライバが使っている I/O アドレスを表示します。 /proc/interrupt は、現在動作している(デバイスをオープンした)プロセスの ドライバが使っている IRQ を表示します。上記のいずれの場合も、表示され るのはドライバの設定内容であり、ハードウェアの実際の設定内容では必ずし もありません。/proc/interrupt は、それぞれのデバイスに対して割込みがい くつ発行されたのかも表示します(数千個のこともよくあります)。この情報か ら問題解決の手がかりをつかむことができます。なぜなら、大量の割込みが発 行されていれば、その割込みを使っているハードウェアがどこかにあるという ことだからです。割込みが少ししか表示されないことは、ときにその割込みが 実際にはどのシリアルポートによっても物理的に生成されていないことを意味 します。従って、使おうとしているシリアルポートに対してほとんど割込みが 発行されていなければ、ハードウェアには割込みが設定されていないかもしれ ず、つまりドライバが間違った割込みを使っているということかもしれませ ん。現在実行中の(``minicom'' のような)プログラムをチェックするために /proc/interruputs を見るには、このファイルを見ている間はずっとプログラ ムを実行し続ける必要があります。これを行うには、プログラムを終了せずに シェルに行ってみましょう。 6.5.2. シリアルポートのハードウェアの設定は? デバイスのハードウェアに実際にどの I/O アドレスと IRQ が設定されている のかを調べるにはどうすればいいのでしょうか? Linux が起動を始める前に、 多分 BIOS のメッセージがある程度の情報を教えてくれるでしょう。 Shift- PageUp キーを使って起動メッセージの表示を戻し、BIOS が出した一番最初の メッセージを見ましょう。これは Linux が起動する前の設定です。 setserial はこの設定を変えることはできませんが、isapnp や pciutils は 設定を変えることができます。 大雑把な方法の一つとして、``autoconfig'' オプションを付けて setserial に検出を行わせてみる方法があります。この方法では、検出を行うアドレスを 推定する必要があります。 ``setserial とは何か? '' を見てください。PCI シリアルポートの場合には、``lspci'' コマンドを使ってください(カーネル 2.2 未満では /proc/pci を見てください)。お使いのシリアルポートがプラグ &プレイならば、以下の 2 つの節を見てください。 ジャンパで設定したポートの場合は、これはジャンパで設定した内容です。 ポートがプラグ&プレイ(PnP)ではないけれど DOS プログラムを使って設定さ れている場合には、そのプログラムを実行した人が設定したように設定されて います。 6.5.3. PnP シリアルポートのハードウェアの設定は? PnP シリアルポートは、電源を切ったときに設定をハードウェアに保存しませ ん。これは、電源を切っても設定が変わらないジャンパ(非 PnP)と対照的で す。ISA PnP シリアルポートをお使いであれば、シリアルポートが全く I/O アドレスや IRQ を持たず、事実上使えない状態になる可能性があります。こ の場合でもまだ、pnpdump を使ってそのシリアルポートを見つけることが可能 なはずです。 ISA バスでのプラグ&プレイの場合、pnpdump (isapnptools に含まれていま す)を試すとよいでしょう。--dumpregs オプションを使うと、ポートに設定さ れている実際の I/O アドレスと IRQ が表示されるはずです。 pnpdump が 「試した」アドレスはデバイスの I/O アドレスではなく、特殊なものです。 PnP ポートを調べるに当たっては、DOS/Windows での設定内容はあまり役に立 ちません。Windows は設定情報をレジストリに保存しますが、これは Linux では使われません。これは何らかの情報付きで BIOS の不揮発性メモリに設定 されることもありますが、レジストリ内にある Windows の現在の設定とは同 期が取れていないことがあります。Linux の起動時に PnP BIOS に自動設定を させているのならば(そして Linux を起動する際には、PnP オペレーティング システムでないと BIOS を設定しているならば)、Linux は BIOS の不揮発性 メモリ内の設定を使うはずです。 6.6. シリアルの IRQ の選択 OS か PnP BIOS が全てのデバイスを設定するという本物のプラグ&プレイ設定 を行っているならば、IRQ を選ぶことはありません。PnP は最も良いと思われ る割り当てを選んでこれを設定します。しかし、Linux でプラグ &プレイ用の ツール (isapnp と pcitools) を使っている場合には、IRQ の選択を行う必要 があります。使いたい IRQ を既に知っている場合には、この節を飛ばしても かまいませんが、IRQ 0 の使い方が特殊であることだけは知っておいてくださ い(次の段落を読んでください)。 6.6.1. IRQ 0 は IRQ ではない IRQ 0 は実際には(ハードウェアでは)タイマですが、setserial を使ったシリ アルポートの設定においては特殊な意味を持っています。この指定は、その ポートには割込みがないことをドライバに伝え、ドライバはポーリングを使っ た動作を行います。ポーリングは非常に効率が悪いのですが、割込みが衝突し た場合や、割込みの設定ミスがあった場合には試すとよいでしょう。 IRQ 0 を設定する利点は、ハードウェアに設定されている割込み番号を知る必要がな い点です。IRQ 0 は、実際に使える割込みが見つかるまでの急場をしのぐため だけに使うべきです。 6.6.2. 割込みの共有とバージョン 2.2 以降のカーネル 一般的な規則では、全てのデバイスが固有の IRQ を持ち、IRQ の共有を行わ ないことになっています。しかし大抵のマルチポートを使う場合のように、 IRQ の共有が許されている場合もあります。ただし、共有が許されているとし ても、効率は良くないかもしれません。というのも、共有されている割込みが 与えられる度に、どこで割込みが発行されたのかを調べなければならないから です。したがって、可能であれば、全てのデバイスに固有の割込みを与えると いいでしょう。 バージョン 2.2 より前のカーネルでは、IRQ はほとんどのマルチポートボー ド同士だけでしか共有できませんでした。バージョン 2.2 のカーネル以降 は、場合によっては全てのシリアルポートで IRQ を共有できます。バージョ ン 2.2 のカーネルで共有を動作させるには、CONFIG_SERIAL_SHARE_IRQ を設 定してカーネルをコンパイルしなければなりません。また、シリアルポートの ハードウェアも共有に対応していなければなりません(したがって、2 つのシ リアルボードが 1 つの割込み線に異なる電圧を流しても、「これが割込みで す」という意味の電圧しか受け取られません)。よってバージョン 2.2 のカー ネルであっても、割込みの共有はしない方が良いかもしれません。 6.6.3. どの IRQ を選ぶか? シリアルポートのハードウェアには、限られた IRQ しか設定できないことが よくあります。しかし IRQ が衝突するも嫌でしょう。したがって、選択の余 地はあまりありません。PC では普通、ttyS0 と ttyS2 が IRQ4 に、ttyS1 と ttyS3 が IRQ3 にあります。 /proc/interrupts を見れば、現在動作中のプロ グラムがどの IRQ を使っているのかがわかります。このような IRQ は使わな い方がいいでしょう。昔は IRQ 5 はサウンドカードが使っていましたが、よ くシリアルポートでも使われていました。 以下に、Greg (Serial-HOWTO の元々の著者)がどのように /etc/rc.d/rc.serial を設定しているかを示します。 rc.serial は起動時に 実行されるファイル(シェルスクリプト)です(場所や名前は違うことがありま す)。バージョン 2.15 以降の ``setserial'' では、必ずしもこのように設定 が行われるわけではありませんが、これは IRQ の選択の例にもなります。 /sbin/setserial /dev/ttyS0 irq 3 # シリアルマウス /sbin/setserial /dev/ttyS1 irq 4 # Wyse 製のダム端末 /sbin/setserial /dev/ttyS2 irq 5 # Zoom 製のモデム /sbin/setserial /dev/ttyS3 irq 9 # US Robotics 製のモデム 標準の IRQ 割り当てを示します: IRQ 0 タイマチャネル 0 (「割込み無し」を意味することもあります。詳しくは後述します) IRQ 1 キーボード IRQ 2 コントローラ 2 へのカスケード IRQ 3 シリアルポート 2 IRQ 4 シリアルポート 1 IRQ 5 パラレルポート 2, サウンドカード IRQ 6 フロッピーディスク IRQ 7 パラレルポート 1 IRQ 8 リアルタイムクロック IRQ 9 IRQ2 にリダイレクト IRQ 10 割り当て無し IRQ 11 割り当て無し IRQ 12 割り当て無し IRQ 13 数値コプロセッサ IRQ 14 ハードディスクコントローラ 1 IRQ 15 ハードディスクコントローラ 2 割込みを選ぶための決定的な方法はありません。割込みをマザーボードや、他 のボードが使っていないことを確かめるしかありません。2, 3, 4, 5, 7, 10, 11, 12, 15 を選ぶことができます。IRQ 2 と 9 は同じであることに注意して ください。IRQ 2 と 9 のどちらを使っても、シリアルドライバはこれをうま く認識します。非常に古いシリアルボードをお使いの場合には、8 以上の IRQ は使えないかもしれません。 IRQ 1, 6, 8, 13, 14 は使わないでください! これらの IRQ はマザーボード が使うからです。マザーボードが使っている IRQ を取り上げると、とても悲 しいことになります。設定が終わったら、割込みを使うプログラムを実行する ときに /proc/interrupts を再確認し、IRQ の衝突が起こっていないことを確 かめてください。 6.7. アドレスの選択 --ttyS3 と衝突するビデオボード IBM 8514 ビデオボード(とその類似品)の I/O アドレスは、聞くところでは 0x?2e8 です(? は 2, 4, 8, 9 のいずれか)。16 進値の先頭の 0 である桁を シリアルポートが無視する場合には(多くの場合はそうです)、これは 0x02e8 にある ttyS3 と衝突するかもしれません(しかし、シリアルポートがうまく設 計されていれば衝突しないはずです)。このアドレスで ttyS3 を使おうとして いる場合には、これは悪い知らせです。 ほとんどの場合は、可能であればデフォルトのアドレスを使うべきです。ここ で言うアドレスは、8 バイトの範囲の最初のアドレスを表しています。例え ば、 3f8 は実際には 3f8-3ff の範囲です。それぞれのシリアルデバイス は(I/O アドレスを必要とする他のタイプのデバイスと同じく)固有のアドレス 範囲を必要とします。これは重なっては(衝突しては)いけません。シリアル ポートのデフォルトのアドレスを以下に示します: ttyS0 のアドレス 0x3f8 ttyS1 のアドレス 0x2f8 ttyS2 のアドレス 0x3e8 ttyS3 のアドレス 0x2e8 6.8. I/O と IRQ のハードウェアへの設定 (ほぼ PnP 向け) これをハードウェアに設定した後には、setserial を使ってドライバも設定す ることを忘れないでください。非 PnP のシリアルポートの場合には、ポート のハードウェアの設定はジャンパか、(「ジャンパレス」の場合には) 設定を 行うための DOS プログラムの実行によって行います(このプログラムで PnP が無効になるかもしれません)。PnP シリアルポートを設定する際に考えられ る方法のリストを以下に示します: o PnP BIOS の CMOS 設定メニューを使う(普通は ttyS0 (Com1) と ttyS1 (Com2) にある外付けデバイスだけに使います) o PnP BIOS に PnP シリアルポートを自動的に設定させる。``PnP BIOS を 使った I/O アドレスと IRQ の設定'' を参照してください o PnP シリアルポートと PnP 対応の Linux を使っているならば何もしなく てかまいません(Plug-and-Play-HOWTO を参照) o PCI でない PnP シリアルポートの場合には isapnp を用いる o PCI バスの場合には pciutils (pcitools) を用いる I/O アドレスと IRQ は電源を入れる度に(PnP を使って)シリアルポートのレ ジスタに設定しなければなりません。というのも、PnP ハードウェアは電源が 切られたときの設定内容を覚えていないからです。これを行う簡単な方法は、 PnP OS を使っておらず、起動する度に BIOS が自動的に設定を行うことを PnP BIOS に教えてやることです。(PnP OS である)Windows が PnP OS でない と BIOS に設定して Windows を起動すると、問題が起こることがあります。 詳しくは Plug-and-Play-HOWTO をご覧ください。 [訳注 : JF プロジェクトによる日本語訳 Plug-and-Play-HOWTO ] プラグ&プレイは IO と IRQ の設定を自動化するために設計されました。しか し現時点の Linux では、話をややこしくしているだけです。標準の Linux カーネルはプラグ&プレイをあまりうまくサポートしていません。 Linux カー ネルをプラグ&プレイ OS にするパッチを使っているならば、上記のことは全 て OS が自動的に処理できるはずです。しかし、これを使ってシリアルポート 以外のデバイスの設定を自動化しようとしても、手動でドライバの設定をしな ければなりません。というのも、Linux のドライバは PnP 対応の Linux 向け に書かれていないからです。isapnptools や BIOS を使ってプラグ&プレイの 設定を行っているならば、これは 2 つの値をモデムボードのシリアルポート 部分のレジスタに設定するだけであり、setserial の設定はユーザが行う必要 があります。1999 年初めの時点では、これらの設定は簡単でもありません し、詳しい文書にもされてもいません。 Plug-and-Play-HOWTO と isapnptools FAQ をご覧ください。 [訳注 : JF プロジェクトによる日本語訳 Plug-and-Play-HOWTO ] 6.8.1. PnP BIOS を使った I/O アドレスと IRQ の設定 PnP OS や isapnp を使って IO と IRQ の設定を行う方法の説明がそれらのソ フトウェアに付いてくるにもかかわらず、PnP BIOS にそういった設定をさせ ようと思っていたらそれは間違いです。全ての PnP BIOS がこれを行えるわけ ではありません。BIOS には普通、最初の 2 つのシリアルポートを設定するた めの CMOS メニューがあります。このメニューは見つけにくいかもしれません が、Award 製の BIOS ならば ``chipset features setup'' の下にあります。 多くの場合、ここではほとんど何も選べません。他のものがメニューになけれ ば、最初の 2 つのシリアルポートには標準の I/O アドレスと IRQ が設定さ れます。``シリアルポートデバイスの名前と 番号'' をご覧ください。 好むと好まざるとに関わらず、PC を起動すると PnP BIOS が PnP によるハー ドウェアデバイスの(I/O と IRQ の)設定を始めます。PnP BIOS が行う処理が 不十分で、残りの設定が(読者の皆さんがおそらく持っていない) PnP OS に残 されるかもしれません。あるいは PnP OS を持っていないと設定されている場 合には、全ての PnP デバイスを完全に設定するかもしれませんが、デバイス ドライバの設定は行いません。これは読者の皆さんが望む動作ですが、PnP BIOS が行った設定を正確に調べることは必ずしも容易ではありません。 PnP OS を持っていないことを BIOS に設定してあれば、PnP BIOS は最初の 2 つだけでなく全ての PnP シリアルポートの設定を行うはずです。 BIOS の動 作を間接的に制御する方法は(もし MS Windows9x を同じ PC で使っていれ ば)、 Windows における設定を「強制」することです。 Plug-and-Play-HOWTO を「forced」で検索してください。Windows 上で「強制」した設定を CMOS BIOS メニューを使って上書きするのは簡単です。この「上書き」機能の設 定・解除が行える BIOS オプションがあると思います。 [訳注 : JF プロジェクトによる日本語訳 Plug-and-Play-HOWTO ] 新しい PnP デバイスが追加されると、BIOS は PnP 設定を変更して調整を行 わなければなりません。衝突を避ける必要が生じれば、既存のデバイスの I/O と IRQ の設定が変わることもあります。この目的のため、非 PnP デバイスの I/O と IRQ をどのように設定しているのかを BIOS に教えてあれば、BIOS は 非 PnP デバイスのリストを保存しています。これを BIOS に教える方法の一 つは、DOS/Windows 上で ICU と呼ばれるプログラムを実行することです。 しかし、この情報でデバイスドライバを設定するために、BIOS が行った設定 を調べるにはどうすればよいでしょうか? BIOS 自身もある程度の情報を出し ます。これは設定メニューや、コンピュータの起動時に画面に現われるメッ セージを通じて得られます。``シリアルポートのハー ドウェアの設定は?'' をご覧ください。 6.9. IRQ と I/O アドレスを setserial に与える ハードウェアの IRQ と I/O アドレスをいったん設定すると(あるいは PnP で 割り当てられるようにすると)、Linux を起動する度に ``setserial'' コマン ドを実行する必要があります。``起動 時の設定'' をご覧ください。 6.10. その他の設定 6.10.1. ハードウェアフロー制御 (RTS/CTS) の設定 解説が ``フロー制御'' にあるので、そちらもご覧ください。可能ならば常に ハードウェアフロー制御を使う方がいいでしょう。通信プログラムあるいは ``getty'' にはフロー制御を設定するオプションがあります(運が良ければ、 デフォルトでハードウェアフロー制御が有効になっているでしょう)。フロー 制御は(初期化文字列あるいはデフォルト設定により)モデムとシリアルドライ バの両方に設定しなければなりません。 (設定が正しければ)通信プログラム は両方の設定を行うはずです。 上記の設定によりハードウェアフロー制御を完全に有効にできない場合、自分 でその設定を行わなければいけません。モデムでは初期化文字列あるいはデ フォルト設定により、ハードウェアフロー制御設定を行うことを確認してくだ さい。デバイスドライバに設定を伝える必要がある場合、起動時に実行する ファイルに書きこむのが良いでしょう。``起動時の設 定'' をご覧ください。 ハードウェアフロー制御を行いたい(例えば ttyS2 などの)シリアルポートそ れぞれについて、こういったファイルに以下の記述を追加する必要がありま す。 stty crtscts < /dev/ttyS2 フロー制御が有効になっているかどうか見たいなら、以下のようにしてくださ い: minicom (あるいは類似の)ソフトウェアで、モデムの設定を見る際には AT&V をタイプし、ハードウェアフロー制御を意味する &K3 の出力を見てくだ さい。デバイスドライバがフロー制御の設定を知っているかどうか、stty -a < /dev/ttyS2 をタイプし、(ハードウェアフロー制御無効を示すマイナス符号 がない) ``crtscts'' を調べてください。 7. (シリアルポートを除く)モデムの設定 7.1. モデムの検出 モデムの設定に多くの時間を費やす前に、モデムを検出できているか、そして AT コマンドなどをモデムへ送出できるかどうか確認する必要があります。 従って、まず最初に使用予定の通信プログラムを非常に単純な設定で動かし て、正常に動作するか確かめることを勧めます。動作しているなら、モデムを 検出できています。動作しなければ、``モデムが 物理的には存在するのに検 出できません'' をご覧ください。ソフトウェアモデムは検出が難しく、Linux で動作しないかもしれません。 7.2. AT コマンド モデムを接続するシリアルポートの設定が必要であると同時に、モデム自体に も設定が必要です。データを送信するのと同じシリアル回線へ AT コマンド( あるいはそれに類似したコマンド)を送って、モデムを設定します。 多くのモデムは AT コマンドセットを使用します。すべてのコマンド文字列は AT で始まり、暗号のような短い ASCII 文字のコマンドです。例: ATZ&K3 こ れには Z と &K3 の 2 つのコマンドが含まれています。不幸なことに、AT コ マンドセットには多くの異なる種類があります。そのため、あるモデムで動作 するコマンドが、他のモデムでは動作しないことがあります。従って、本章で 取り挙げる AT コマンドが、あなたのモデムで動作する保証はありません。も うひとつ気を付けることは、モデムが AT コマンドに従う動作をするために は、コマンド文字列の最後に改行文字を送らなければいけないことです。 このようなコマンド文字列は通信プログラムが自動的に送るか、あるいはあな たが直接入力します。多くの通信プログラムはモデムへ直接コマンドを送れる 画面を提供しています。電源を切ったあとでもモデムの設定を記憶しているの で、この画面でモデムを設定することは良い方法です。 モデムのマニュアルを持っているのなら、恐らくそのモデムの AT コマンド セットを調べることができます。その他に、インターネット上でコマンドセッ トを探してみるのも良いでしょう。サーチエンジンを使い、コマンドに関して 記述しているけれどもコマンドリストを載せていないサイトの発見を避けるた めに、実際のコマンドを検索語句に含めて検索することも良いかもしれませ ん。``Web サイト'' に挙げるいくつかのサイトを見てみるのも良いでしょ う。 7.3. 初期化文字列: 保存および再呼出し ここでの例は Hayes AT モデムコマンドセットを取り上げます。すべてのコマ ンド文字列は AT の 2 文字で始めなければなりません(例えば、 AT&C1&D3)。 モデムの電源を入れると、不揮発性メモリ中に格納済の設定を用いて、モデム 自身が自動的に設定を行います。この設定で充分なら、もうすべきことはあり ません。 充分でないのなら、格納済みの設定を変更するか、モデムを使うたびに「初期 化文字列」と呼ぶコマンド文字列を送って設定する人もいるでしょう。通常、 通信プログラムがこれを行います。どのような初期化文字列を送るのかは、通 信プログラムの設定、Kermit を使うならスクリプトの記述に依存します。た いてい通信プログラムが使う初期化文字列は編集でき、どんな文字列にでも変 更できます。ときには、通信プログラムはユーザにモデムの型名を選択させ、 プログラムが最適だと考える初期化文字列を使用することもあります。 最初にモデムの電源を入れた際に使用する設定は、初期化文字列で表現できま す。この文字列を(プロファイルと呼ぶ)デフォルト「文字列」だと考えても構 いません。通信プログラムがモデムへ(初期化文字列を含む)他の文字列を送る と、この文字列はデフォルトの設定を変更します。例えば、初期化文字列が 2 つのコマンドを含んでいたなら、この 2 つの項目だけが変更されます。しか し、いくつかのコマンドはモデム内部の保存済みのプロファイルを呼び出し、 ひとつのコマンドで設定のすべてを変更できます。 最近のモデムには、(電源を切っても消えない)不揮発性メモリ中に保存する、 いくつかの異なったプロファイルがあります。著者のモデムには(変更できな い 0 と 1 )ふたつの工場設定プロファイルがあります。そして、(0 と 1 の) ふたつのユーザ定義プロファイルもあって、ユーザが設定しそれを保存できま す。あなたのモデムはより多くのプロファイルを持っているかもしれません。 電源を入れた際にユーザ定義プロファイルのうちどれを使用するかは、プロ ファイルに保存済みのもうひとつの項目に依存します。&Y0 コマンドを使用す ると、次回の電源投入時からプロファイル 0 を使用します。ここで 0 ではな く 1 を入れると、電源を入れたときにプロファイル 1 を使用します。 4 つの格納済みプロファイルのいずれかを呼び出す(プロファイルを使用する) コマンドもあります。こういったコマンドを初期化文字列の中に入れる人もい るでしょう。もちろん、電源投入時に自動的に読みこむプロファイルと同じ設 定を初期化文字列が再び呼び出したとしても、最初から有効になるプロファイ ルが変わらない限り、設定は何も変わりません。たとえプロファイルを再び呼 び出すだけでも、設定を変更したあと、数種の初期化文字列を使うことは良い 考えです。 保存済みのプロファイルの再呼出し (0 ではなく 1 を指定するとプロファイ ル 1 を使用する): Z0 ユーザ定義プロファイル 0 を呼び出しリセットする(電話を切るなど) &F0 工場出荷時プロファイル0を呼出す モデムへコマンドを送って設定したら、(工場出荷時のプロファイルを呼び出 して若干変更する場合も含んで) その設定をユーザ定義プロファイルへ保存し たくなるでしょう : ファイル0へ保存します。 多くの人はモデムを使う度に長い初期化文字列をモデムに送ることを面倒に 思って、代わりにモデムへ設定を保存します。また、初期化文字列で工場出荷 時のデフォルト設定を呼び出し、その後ろにコマンドを追加して設定を少し変 更することもできます。この方法により、電源投入時に読み込むユーザ定義プ ロファイルを変更したことで問題を引き起こすことがなくなります。 あなたのモデムに適切だと思う初期化文字列を人からもらい、それを使用する のも良いでしょう。いくつかの通信プログラムは、その中から選択できるよう に初期化文字列のライブラリを持っています。最も難しい方法(そして、あな たがモデムに関する多くのことを学べること)は、モデムのマニュアルを研究 して初期化文字列を自分で書くことです。また、初期化文字列を不要にするた め、設定をモデムの中に保存できます。3 つ目の代替手法は、他人が書いた初 期化文字列を目的に合わせて変更し、それを使ってモデムをスタートすること です。 通信プログラムが使用する初期化文字列を見ると、モデムコマンドにはない文 字があるかもしれません。この文字は通信プログラム自身のコマンド (~ は一 時的なポーズの意味)であり、モデムへは送りません。 7.4. その他のモデムコマンド Modem-HOWTO の将来のバージョンには、より多くの AT コマンドを載せるかも しれません。ですが、本節の残りのうち大部分は古い Serial-HOWTO のもので す。すべてのコマンド文字列は AT で始めなければなりません。コマンド文字 列中に含めるべき Hayes AT コマンドを挙げます。(含めなければ工場出荷時 のデフォルト設定、あるいは保存済みの設定を使用します。) E1 コマンドエコー ON Q0 リザルトコードレポート有効 V1 冗長出力 ON S0=0 出力無し (WAITFOR オプションを用いて uugetty が行う) モデム制御線の DCD と DSR に関係するコマンドを挙げます : &C1 接続後のみ DCD を on &S0 DSR 常時 on このコマンドはモデムが電話をかけときと切るときの挙動に影響します。DTR がどのような動作をするのか設定しても構いませんが、その設定方法は更に複 雑になります。 モデムにプロファイルを保存できないのなら、設定ファイルなどへ 初期化 文字列を使用して設定できます。古いモデムにはディップスイッチでレジスタ を設定するものもあります。正しく設定するよう、確認してください。 Greg Hankins さんはいろいろなモデムの設定集を持っています。あなたの設 定を彼に送りたいのなら、そうしましょう : ftp://ftp.cc.gatech.edu/pub/people/gregh/modem-configs にて、こういっ た設定ファイルを手に入れることができます。 確認: DTR が落ちたとき USR Courier V.34 モデムを正しくリセットするに は、Greg Hankins さんは &D2 および S13=1 を設定しなければなりませんで した(これは S13 レジスタを 0 に設定します)。この操作により、USR Sportster V.34 モデムも正常に動作することを確認しました。 確認: いつかの Supra のモデムでは DCD の扱いが他のモデムと異なりま す。Supra を使っているなら、&C1 ではなく &C0 を試してみてください。DTR を正しく扱うには、&D2 も設定する必要があります。 8. /dev/ttyS2 などのシリアルポートデバイス デバイスディレクトリにデバイスを作るには、Serial-HOWTO: 「/dev ディレ クトリにおけるデバイスの作成方法」をご覧ください。 [ 訳注 : JF プロジェクトによる日本語訳 Serial-HOWTO ] 8.1. シリアルポートデバイスの名前と番号 Linux ではデバイスにメジャー番号およびマイナー番号があります。 /dev ディレクトリにおいて、各々のシリアルポートは ttyS と cua の2 つの名前 が可能です。これら 2 つのドライバはわずかに異なるふるまいをします。cua デバイスは推奨しておらず、将来は使用しないことになるでしょう。``cua デ バイス'' をご覧ください。 DOS/Windows は COM 名を使いますが、setserial プログラムは tty00, tty01 などを用います。(PC のモニタである)コンソールとして使用する、シリアル ポートではない /dev/tty0, /dev/tty1 などのデバイスと混同してはいけませ ん。「標準的」な場合の (COM1 など) DOS 上の名前と IO アドレスを以下に 示します。(あなたの場合では異なるかもしれません) set- IO dos serial major minor major minor address COM1 tty00 /dev/ttyS0 4, 64; /dev/cua0 5, 64 3F8 COM2 tty01 /dev/ttyS1 4, 65; /dev/cua1 5, 65 2F8 COM3 tty02 /dev/ttyS2 4, 66; /dev/cua2 5, 66 3E8 COM4 tty03 /dev/ttyS3 4, 67; /dev/cua3 5, 67 2E8 すべてのディストリビューションは ttyS デバイスを用いることに注意してく ださい( cua デバイスも完全に廃止できるまでは使用します)。以下のように タイプすることで、上記のことを確かめられます: linux% ls -l /dev/cua* linux% ls -l /dev/ttyS* 8.2. ttySN を /dev/modem へリンク? いくつかのインストレーションでは、モデム用の /dev/modem およびマウス用 の /dev/mouse という2つの特別なデバイスを作ります。両者とも、インス トール時に明示した /dev 以下にある適切なデバイスへのシンボリックリンク です(バスマウスを持っているなら、 /dev/mouse はバスマウスのデバイスを 指しているでしょう)。 /dev/mouse および /dev/modem の利点に関しては、いくらかの議論がありま した。これらのリンクを使用することは推奨しません。とりわけ、ダイヤルイ ンにモデムの使用を考えているのなら、 /dev/modem を使用するとロックファ イルが正常に動作しないため、問題が発生するかもしれません。好みでこれら のリンクを使うのなら、リンクが確実に正しいデバイスを指すようにしてくだ さい。しかし、このリンクを変更したり削除すると、再設定が必要となるアプ リケーションがあるかもしれません。 8.3. cua デバイス 各々の ttyS デバイスは cua デバイスと一致します。しかし、 cua デバイス は廃止すべきものであるため、(cua を必要としない限り) ttyS を使うのが最 も良いことです。cua と ttyS の間には違いがありますが、精通したプログラ マは ttyS ポートをあたかも cua ポートであるかのように振る舞わせること ができ、cua ポートはもはや全く必要ありません。いくつかの古いプログラム を除き、cua を使用する必要がありません。 何が違うのでしょうか? cua と ttyS の間の主な違いは、通常の ``oepn'' コマンドでポートを開こうとしたとき、C プログラム中でどのように処置する のが異なります。cua ポートがモデム制御信号を確認するようセットしたのな ら、DCD モデム制御信号が上がっていなくても、ポートを開けます。(追加 コードを加えた)賢いプログラムは ttyS ポートに同様の振舞いを強制するこ とができます。しかし、cua ポートはモデムが DCD を ON にできなくとも(誰 も電話をかけていない、キャリアがないときに) 電話をかけるために簡単に ポートを開くことができます。このことが、かつて cua を発信に用い、ttyS を着信に用いていた理由です。 cua を使っているならば、Linux カーネル 2.2 を起動するときに警告メッ セージがカーネルログに書き込まれるでしょう。これは cua がなくなりかけ ている兆しです。 9. 知っていると良いおもしろいプログラム 9.1. setserial とは何か? 9.1.1. はじめに 決してノート PC (PCMCIA) で setserial を使ってはいけません。ハードウェ アでシリアルポートの I/O アドレスおよび割込み (IRQ) がどの番号に設定し てあるのか、あるいは UART の型名などを、setserial を使ってデバイスドラ イバに伝えることができます。また、現在のドライバの設定を表示することも できます。更に、(特定のオプションを使えば)ハードウェアを自動検出するこ ともできます。 ひとつかふたつのシリアルポートしかないのなら、setserial を使わなくても たいてい正しく設定できます。そうでなければ(あるいはシリアルポートに何 か問題があったなら)、setserial を使う必要があるでしょう。 setserial の マニュアル以外にも、/usr/doc/setserial.../ などにある情報を調べてくだ さい。使用中の Linux のディストリビューションがどのように setserial を 扱っているのかわかるでしょう。 起動時にシェルスクリプトが setserial を自動的に動かすこともあります。 シリアルドライバモジュールが読み込まれている場合にのみ、setserial が動 作するでしょう。何らかの理由により後でシリアルドライバモジュールを外し たなら、setserial で事前に行った変更は (/etc/serial.conf を除き)カーネ ルが消してしまいます。従って、設定を回復させるために setserial を再び 動かさなければいけません。起動シェルスクリプトから動かすことに加えて、 シリアルドライバモジュールが読み込まれた際には、setserial と類似した何 らかのプログラムが動きます。従って、画面上の起動時のメッセージを見てい ると、setserial が 2 回動いたように見えるでしょうし、実際に動いたので す。 適切なオプションを使えば、setserial は(与えた I/O アドレスで) シリアル ポートを検出できますが、その I/O アドレスを推測しなければなりません。 例えば /dev/ttyS2 を検出させたいなら、setserial が推測した ttyS2 のア ドレスでしか検出できないでしょう。もし setserial に ttyS2 が異なるアド レスにあることを伝えたなら、そのアドレスで検出するでしょう。``検出'' をご覧ください。 setserial はシリアルポートのハードウェアに IRQ も I/O アドレスも設定し ません。その値はジャンパあるいはプラグ&プレイでハードウェアに設定され ます。ハードウェアに設定したものと同一の値を setserial に伝えなければ なりません。あなたが使いやすいと思った数値を捏造したり、その数値を setserial に伝えることだけはやめてください。I/O アドレスを知っていて IRQ を知らない場合には、IRQ を見つけるために setserial を試してみるの も良いでしょう。 (通常トラブル解決の際に使用する、冗長出力の -v といった1 文字のオプ ションを除き)引数なしで setserial とだけタイプすると、使えるコマンドの 一覧を見れます。setserial は I/O アドレスを「ポート」と呼ぶことに注意 してください。以下のようにタイプすると、 setserial -g /dev/ttyS* デバイスドライバがポートをどのように設定したか、若干の情報を見られるで しょう。更に情報を見たければ、``-g''オプションに ``v'' を追加してくだ さい。しかし、ハードウェアの中にこれらの値が実際に設定されているかどう かは、このコマンドは教えてくれません。実際、全く嘘の I/O アドレスやい かなる IRQ でも、またあなたが手に入れたいどんな UART の型で も、setserial を動かして割り当てることができます。そして次に ``setserial ...'' をタイプしたとき、文句もなしにこの偽物の値を表示する でしょう。setserial による割当ては PC の電源を切ると失われるので、 Linux が起動する度に、たいていどこかで自動的に setserial を動かしま す。 9.1.2. 検出 シリアルポートのハードウェアを見つけ出すには、まず I/O アドレスを知ら なければなりません(あるいは推測しなければなりません)。またはデバイスド ライバがハードウェアのために setserial で事前に適切に設定した I/O アド レスを知っていなければなりません。物理的なハードウェアを見つけるために は、setserial に -v (verbose : 冗長出力)および autoconfig コマンドを 使ってください。出力メッセージが UART の型名を 16550A といったように示 しているのなら、問題ありません。そうではなく、 UART の型名を ``unknown'' と示したなら、その I/O アドレスにはシリアルポートがないと 推定できます。いくつかの安いシリアルポートには自分の名前を正しく名乗れ ないものもあるため、``unknown'' と出てもそこにシリアルポートがある可能 性があります。 UART の型名を検出するほかにも、setserial は IRQ を自動検出できますが、 常に正しくは動作しません。setserial のバージョンが 2.15 以上なら、最後 の検出結果を、Linux が次回の起動時に使用する設定ファイル /etc/serial.conf へ格納するでしょう。起動時に setserial を動かすスクリ プトは通常ポートを検出しないものの、検出するように変更できます。次節を ご覧ください。 9.1.3. Linux は自動的にシリアルデバイスを設定できますか? はい、しかし... 使用しているディストリビューションが起動時に既に設定し ているかもしれません。ですが、カスタマイズしたくなるかもしれません。そ れは setserial の 2.15 未満を使えば簡単です。起動時に 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 以上では、起動時に setserial を動かす /etc/init.d/setserial など のファイルをユーザが編集することは想定していないので、自動検出の設定は もっと難しくなります。以前のバージョンにはあったような役立つコメントが なくなっているかもしれません。 9.1.4. 起動時の設定 カーネルがシリアルモジュールを読み込むと(あるいは「モジュール」がカー ネルに組み込まれていると)、ttyS{0-3} のみを自動的に検出し、 (ハード ウェアが実際にどう設定されているかに関わらず) ドライバは IRQ を 4 そし て 3 に設定します。あなたはこれを、あたかも setserial の起動メッセージ だと考えてしまいす。もし、3 つ以上のポートを使うなら、このシリアルモ ジュールによる自動設定は IRQ の衝突を引き起こします。 setserial に本当の IRQ を伝えて、このような衝突(あるいは他の理由による 衝突) を解決できるような、setserial を再び動かすスクリプトがあるかもし れません。この現象は他のプロセスがシリアルポートを使用する前の、起動時 の初期に発生します。実際、起動時の初期化スクリプトが自動的に setserial プログラムを動かすので、ディストリビューションが既にこの設定を行ってい るでしょう。この現象をどう扱うのか、 /usr/doc/setserial.../ などに追加 情報があります。 9.1.5. /etc/serial.conf を用いた新しい設定手法 バージョン 2.15 (1999年) 以前では、setserial の設定方法は起動時に setserial を動かすシェルスクリプトを手動で編集することでした。 setserial のバージョン 2.15 (1999年) 以降では、シェルスクリプトを編集 せず、設定ファイル /etc/serial.conf から設定情報を得ます。しか し、serial.conf は通常は編集しません。その代わりに、 setserial をコマ ンドラインで使用します。 setserial で変更したものは、通常シャットダウンあるいはリブート時に設定 ファイル (serial.conf) へ保存されます。serial.conf の最初の行で ``###AUTOSAVE###'' などが on になっているときのみ動作します。もし setserial を試しに使用して正常に動作しなかったなら、その試験的な設定が 誤って保存されないよう、忘れずに設定をやり直してください。 (設定に従っ て)起動時に setserial を動かすために一般的に使用するファイル は、/etc/init.d/setserial (Debian) あるいは /etc/init.d/serial (Redhat) などです。しかし、通常はこのファイルも編集すべきでありませ ん。 シリアルポートを無効にするには、setserial を用いて ``uart none'' に設 定してください。``setserial'' のあとに置く各ポートに対するコマンドライ ンの 1 行パラメータに、/etc/serial.conf は似ています。自動保存を使わな いなら、/etc/serial.conf を手で編集するのも良いでしょう。バージョン 2.15 に関しては、Debian は自動保存を有効にしてシステムをインストールし ますが、RedHat 6.0 は /usr/doc/setserial-2.15/rc.serial があるだけで、 それを /etc/init.d/ へ移動しなければなりません。 バグ : 1999 年 6 月現在では、次のようなバグおよび問題があります。 ``setserial -G /dev/ttyS?'' (ここで ? = 0, 1, 2, ...) により表示される setserial のパラメータは ###AUTOSAVE### を用いて保存できますが、それ以 外のパラメータは保存できません。このパラメータはどんな場合でもほとんど 使用しないため、このバグはごく少数のユーザにしか影響を与えません。この ことはバグとして報告されていますが、今はもう修正済みかもしれません。 setserial でセットした現在の設定を、シャットダウンせずに設定ファイル (serial.conf) へ保存するには、シャットダウンの際に通常動作することを行 えば良いのです : シェルスクリプトを動かしてください。 /etc/init.d/{set}serial stop。``stop'' コマンドはシリアルポートを正常 に動作させたまま、現在の設定を保存します。 いくつかのケースでは、古典的な設定手法と新しい手法の双方を使えるように してあるかもしれませんが、起動時にそのうちひとつのみを動かすことが望ま しいです。Debian では ``...pre-2.15'' はすでに旧式だとしています。 9.1.5.1. 古典的な設定手法 : スクリプトの編集 2.15 (1999年) より前は、setserial の設定ファイル /etc/serial.conf があ りませんでした。従って、起動時に setserial を動かしているファイルを探 す必要があります。そのファイルが存在しなかったら、それを作らなければな りません。(あるいは起動時の早い時期に動くファイルへ追加する必要があり ます。) このようなファイルを現在使用しているなら、多分 /etc ディレクト リのどこかにあります。しかし、Redhat 6.0 より前ではそのファイルは /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 が動く前にシリアルポートを開こうとする 他のプロセスが、シリアル通信の失敗に終わるという報告があります。 9.1.6. 割込み (IRQ) デフォルトでは ttyS0 および ttyS2 は IRQ 4 を共有し、 ttyS1 および ttyS3 は IRQ 3 を共有します。しかし、シリアルの割込みを共有すること は、以下の条件を満たさなければ可能となりません。 [訳注 : 原文は "ttyS0 and ttyS3 share IRQ 3" ですが、誤りでしょうか。] 1. カーネル 2.2 あるいはそれ以上 2. IRQ 共有をサポートするようカーネルをコンパイルする 3. シリアルのハードウェアが共有をサポートしている ``割込みの共有とバージョン 2.2 以降のカーネル'' をご覧ください。シリア ルポートが ttyS0 と ttyS1 の 2 つしかないなら、存在しないデバイスでは IRQ 共有の競合は発生しないので、問題はありません。 内蔵モデムを追加した上で ttyS0 と ttyS1 を残しておいたのなら、未使用の IRQ を見つけてシリアルポート(およびモデムボード)にその IRQ を設定 し、setserial を用いドライバに対して IRQ を知らせるべきです。サウンド カードが IRQ5 を使用していないならば、モデムのために使える IRQ になる かもしれません。ハードウェアに IRQ を設定するには isapnp, PnP BIOS を 用いるか、あるいは Linux を PnP 対応にするパッチを当てる必要がありま す。余っている IRQ の節約を決心するためには、``man setserial'' をタイ プし ``IRQ 11'' の記述を探してください。 9.2. isapnp とは何でしょう? isapnp は内蔵モデムを含む ISA バス上のプラグ&プレイ (PnP) デバイスを設 定するプログラムです。isapnp は ``isapnptools'' というパッケージに入っ ています。そして、すべての ISA プラグ&プレイデバイスを探し、PnP 設定 ファイル /etc/isapnp.conf に追加できるフォーマットでデバイスの設定を出 力する ``pnpdump'' などの、他のプログラムも入っています。モデム内部に あるシリアルポートの IO アドレスと IRQ を表示するために、--dumpregs オ プションとともに pnpdump を使うこともあるでしょう。コンピュータを起動 するごとに isapnp コマンドを動かすために、 isapnp を初期化ファイルに追 加し、そして ISA PnP デバイスを設定することになります。BIOS が PnP を サポートしていなくても、この動作は可能です。 9.3. wvdialconf とは? wvdialconf はどのシリアルポートにモデムがつながっているかを探します。 そして、wvdial のために、設定プログラムを作ります。wvdial は PPP プロ トコルを用いて ISP へ簡単に電話をかけるために用います。しか し、wvdialconf を使うために PPP をインストールする必要はありませ ん。wvdialconf は未使用のモデムを探し出すだけです。また、自動的に「適 切な」初期化文字列を考え出すものの、ときどき間違えます。このコマンドに はオプションがないため簡単に使えますが、初期化文字列(および他のデータ) を納めるファイル名を指定しなければなりません。例えば、次のように : my_config_file_name 9.4. stty とは何でしょう? stty は setserial に似ていますが、シリアルポートのボーレートおよび他の パラメータを設定します。``stty -a < /dev/ttyS2'' とタイプすると、ttyS2 の設定を表示するでしょう。設定の大部分は (1970 年代の古い端末でしか使 わないような) モデムと一緒には用いる必要のないものです。通信プログラム はモデムを自動的に正しく設定するでしょう。しかし、stty はトラブル解決 のために場合によっては役に立ちます。 stty は以下の 2 つの項目を設定します : 1. crtscts によるハードウェアフロー制御 2. モデムからの DCD 信号 ``clocal'' を無効にする モデムが DCD 信号を送らず clocal が無効(つまり stty が -clocal を表示 する)ならば、プログラムはシリアルポートを開けません。ポートを開けない と、プログラムはモデムからの DCD 信号を(ときには無駄に)待ち、動かなく なってしまうかもしれません。 minicom を動かすと自動的に clocal を設定するので、何も問題はありませ ん。しかし、-clocal で回線の設定をしようとすると、Kermit バージョン 6.0.192 は動かなくなりました。-clocal を設定すると DCD 信号がなくな り、 ``stty'' コマンドさえも動かず、表面上は clocal を設定する手段が( minicom を動かすことを除き)なくなります。しかし、minicom は -clocal が 設定してあっても、それを元に戻します。-clocal が設定してある状態から脱 出するひとつの方法は、minicom を使って (DCD 信号を受け取るために) モデ ムへ ``AT&C'' を送ることです。リセットせずに minicom を終了すると、DCD 信号が残ります。そして、再び stty を使えるようになるでしょう。 10. モデムを試す (電話をかける) 10.1. 電話をかける準備ができていますか? モデムに電話線を差し込み、どのシリアルポートにつながっているのか分かれ ば、試してみる準備ができました。インターネットへの接続を試す前に、そし て誰かがあなたに電話をかけてくる前に、ますモデムが正常に動作しているか 調べましょう。そのためには、いくつかの番号へ電話をかけるなど、単純なも のから試してください。まず、モデムにつながる電話番号を探してください。 電話番号が分からないなら、コンピュータショップで掲示板 (BBS) などの電 話番号を尋ねるか、地元の図書館にオンライン目録サービスの電話番号あるか どうか調べてください。 電話をかける準備が整ったことを確認してください。(ttsS2 などの)モデムの つながっているシリアルポートが分かっていますか? シリアルポートの I/O と IRQ を設定し、その設定を知っていなければなりません。そのポートで使 う速度を決定しましたか? 素早い選択のためには ``速度表'' を、詳細につ いては ``モデムで使うべき速度は?'' をご覧ください。設定すべき速度がわ からないなら、広告上のモデムの速度より 2-3 倍速い速度をシリアルに設定 してください。「ハードウェアフロー制御」あるいは ``RTS/CTS'' といった オプションを選択するメニューがどこにあるのかも、覚えておいてください。 動作する電話線をモデムに差し込みましたか? ダイアルトーンが聞こえるか 確かめるために、この電話線を本物の電話機につないでみるのも良いでしょ う。 それから、電話をかける通信(ダイアル)プログラムを選ぶ必要があります。ダ イアルプログラムには minicom, (X window system の) seyon および kermit もあります。通信プログラムに関しては、``通信プログ ラム'' をご覧くださ い。次に 2 つの例、``Minicom で電話をかける''、および``Kermit で電話 をかける '' を挙げます。 10.2. Minicom で電話をかける Minicom は多くの Linux ディストリビューションに付属しています。設定す るには root にならなければいけません。設定するためには、``minicom -s'' とタイプしてください。すると設定メニューが出てきます。あるいは、 ``minicom'' を起動し、ステータスラインを表示させるために ^A をタイプし ても良いでしょう。^A Z をタイプすると、minicom はヘルプを表示します。 ヘルプメニューから設定メニューへ移動できます(既に ^A をタイプしていた ら z とだけタイプしてください)。 オプションの多くは、単なる発信のためには設定する必要はありません。設定 しなければならない基本的な項目は、/dev/ttyS2 といったモデムがつながっ ているシリアルポートの名前、および 115200 などのシリアルポートの速度で す。これはシリアルポートメニューで設定します。シリアルポートメニューへ 移動し、設定してください。(可能なら)ハードウェアフロー制御 (RTS/CTS) も設定してください。そして、設定を保存してください。速度の設定をしてい る際、``8N1'' といった文字を見るはずですが、そのままにしておきましょ う。これは 1 バイトが 8 ビットでパリティなし、各バイトごとに 1 ビット のストップビットを付加すること意味します。設定したい速度が見つからない なら、低めの速度なら動作するでしょう。設定が終わったら、メニューを用い てその設定をデフォルト (dfl) として保存し、(リターンキーをたたいて)終 了してください。シリアルポートを探しモデムを初期化する、あるいはヘルプ を見たり、minicom にモデムを初期化させるために、 minicom を終了し再び 動かしても良いでしょう。 さあ、電話をかける準備が整いました。しかしまず、``minicom'' とタイプし て出てくるメインスクリーンで、AT そして キーをたたき、モデムが つながっているのか確かめてください。OK と表示するはずです。そうならな かったら、どこかがうまくいっておらず、試しに電話をかけても意味はありま せん。 ``OK'' が返ってきたら、ヘルプへ戻りダイヤリングを選んでください。それ を編集して電話番号などを入力し、電話をかけるため ``dial'' を選択してく ださい。あるいは、手動で電話をかけるかもしれません (``manual'' を選択 し、キーボードで電話番号を入力してください)。正常に動作しなかったら、 慎重にすべてのエラーメッセージを書き取り、何が悪いのか理解するようにし てください。 10.3. Kermit で電話をかける kermit の最新バージョンは にありま す。例えば、モデムが ttyS3 につながっており速度が 115200 bps のときに は、以下のようにしましょう : linux# kermit C-Kermit 6.0.192, 6 Sep 96, for Linux Copyright (C) 1985, 1996, Trustees of Columbia University in the City of New York. Default file-transfer mode is BINARY Type ? or HELP for help. C-Kermit>set line /dev/ttyS3 C-Kermit>set carrier-watch off C-Kermit>set speed 115200 /dev/ttyS3, 115200 bps C-Kermit>c Connecting to /dev/ttyS3, speed 115200. The escape character is Ctrl-\ (ASCII 28, FS) Type the escape character followed by C to get back, or followed by ? to see other options. ATE1Q0V1 ; you type this and then the Enter key OK ; modem should respond with this AT にモデムが反応したなら、Linux でモデムが正常に動作していると判断で きます。次に、試しに他のモデムへ電話をかけてみましょう : ATDT7654321 ここで、7654321 は電話番号です。もしダイヤル回線を使っているなら、 ATDT ではなく ATDP を使用してください。通話できたなら、モデムは正常に 動作しています。 kermit プロンプトへ戻り、コントロールキーを押したままバックスラッシュ を押してコントロールキーを放し、そして C キーを押してください : Ctrl-\-C (Back at linux) C-Kermit>quit linux# これは原始的な「手動」ダイヤリング手法を用いたテストです。通常の方法で は、内蔵モデムデータベースおよび自動的に電話をかける機能を用いて、 kermit に電話をかけさせます。 linux# kermit C-Kermit 6.0.192, 6 Sep 1997, for Linux Copyright (C) 1985, 1996, Trustees of Columbia University in the City of New York. Default file-transfer mode is BINARY Type ? or HELP for help C-Kermit>set modem type usr ; Select modem type C-Kermit>set line /dev/ttyS3 ; Select communication device C-Kermit>set speed 115200 ; Set the dialing speed C-Kermit>dial 7654321 ; Dial Number: 7654321 Device=/dev/ttyS3, modem=usr, speed=115200 Call completed. Connecting to /dev/ttyS3, speed 115200 The escape character is Ctrl-\ (ASCII 28, FS). Type the escape character followed by C to get back, or followed by ? to see other options. Welcome to ... login: 11. ダイヤルイン 11.1. 概要 ダイヤルインとは、あなたの電話番号をダイヤルしてあなたの PC を使えるよ うに、あなたの PC を設定することです。「視点」はあなたの PC 側にありま す。あなたの PC から発信すると、他のコンピュータへダイヤルインすること になります。(あなた自身のコンピュータへ電話をかけないでください) ダイヤルインは以下のように動作します。誰かがモデムであなたの電話番号を ダイヤルします。あなたのモデムは応答し、接続します。発信者とつながる と、あなたの PC はログインプロンプトを発信者へ送ります。そして、発信者 はあなたの PC へログインします。あなたの PC を使うことは、発信者がシェ ルアカウントを有し、コンソール(あるいはテキスト端末)からログインした場 合と全く同じように、あなたの PC を使えることを意味します。また、発信者 がインターネットへ接続できることにもなります。あなたの PC 上でこのダイ ヤルインを扱うプログラムを getty と呼びます。 ログインの後、発信者をインターネットへ接続するような他のプログラムが動 くこともあります。この HOWTO ではログインの後に動くこのようなプログラ ムは対象としていません。インターネットへつなぐためには、たいてい PPP プログラムが動きます(もうすぐ新しいバージョンが出る予定の PPP-HOWTO を ご覧ください)。通信プログラムがログイン名とパスワードを毎回自動的に入 力し、ログインを自動化しているかもしれません。 [訳注 : JF プロジェクトによる日本語訳 PPP-HOWTO ] 56k でダイヤルインできるようにするつもりなら、以下のことをしない限り不 可能です : 1. 電話会社へトランクサイド T1 あるいは ISDN などでデジタル接続する。 2. 特別なデジタルモデムを使用する。 3. デジタルモデムに「コンセントレータ」などの、電話会社のデジタル回線 へつなぐインタフェースがある。 「コンセントレータ」を「モデムコンセントレータ」あるいは「リモートアク セスコンセントレータ」とも呼びます。モデムがつながる「リモートアクセス サーバ」にも、コンセントレータがあるかもしれません。もし上記の条件すべ てを満たせるなら、あなたは ISP (プロバイダ)でしょう。 11.2. getty getty はダイヤルインを行うために動かすプログラムです。ダイヤルアウトに は必要ありません。ログインプロンプトを表示することに加え、電話に応答し ます。もともと、getty はダム端末からコンピュータへログインするために使 用していました。現在は Linux コンソールへのログインに使用しています。 少しずつ異なった名前を持つ数種類の getty プログラムがあります。特定の getty がモデムでダイヤルインするために動作します。この getty プログラ ムはたいてい起動時に動きます。これは /etc/inittab が呼び出さなければな りません。このファイルの中に、若干変更が必要となる getty を呼び出す例 が見つかるかもしれません。例に挙げたものとは異なる getty プログラムを 使うのなら、オプションの形式が異なるので、/etc/inittab を大幅に変更す る必要があるでしょう。 ダイヤルインのために使える、4 つの異なる getty プログラムがあります : mgetty, uugetty, getty_em および agetty です。以下の節で、詳細について 若干述べています。agetty は 4 つの中で最も簡易(そして 貧弱)であり、主 としてテキスト端末を直接接続するために使用するものだと考える人もいま す。mgetty は FAX およびボイスメールをサポートしていますが、uugetty は サポートしていません。 mgetty は uugetty のいくつかの機能が不足してい るようです。 getty_em は uugetty を簡易化したバージョンです。従って、 既に uugetty に慣れている(あるいは mgetty を入手しにくい) ということで なければ、恐らく mgetty が最良の選択です。これら getty プログラムの設 定方法はそれぞれ異なるので、/etc/inittab で使用する getty に合った正し い文法を使うよう確認してください。 11.2.1. mgetty について mgetty よりずっと前から存在していた uugetty を置き換えるために mgetty は書かれました。双方ともモデムとともに使用します。本文書で正確に述べる のは難しいですが、mgetty は端末を直接接続するためにも用いるもの の、mgetty は (1999 年の半ばでは) 再コンパイルをしないと(多くの端末が 使用する)ソフトウェアフロー制御をサポートしません。この欠点はバグとし て載っています。ダイヤルインでログインを可能にすることに加え、mgetty は FAX のサポートおよび自動 PPP 検出も提供しています。モデムでボイス メールを扱う vgetty という追加プログラムもあります。mgetty の文書は(ボ イスメールの部分を除いて)よくできており、追加情報がなくても問題ありま せん。インストール解説書を参照してください。 mgetty の最新情報は および で見つけられます。 11.2.2. uugetty について getty_ps は 2 つのプログラムを含んでいます : getty をコンソールと端末 装置のために用い、uugetty をモデムのために使用します。(Serial-HOWTO の 以前の著者である) Greg Hankins さんは、uugetty について書いていたの で、uugetty を使っていました。``uugetty'' をご覧ください。その他の getty はそれに付属している文書で充分です。 11.2.3. getty_em について これは uugetty の簡易版です。getty_ps および uugetty に複雑なサポート ファイルが必要になって完全に途方に暮れたので、Vern Hoxie さんが書きま した。 getty_em は において FTP で入手 可能な、Vern Hoxie さんのシリアルポートユーティリティおよび情報コレク ションの一部です。このコレクションの名前は ``serial_suite.tgz'' で す。``scicom'' に ``anonymous'' でログインする際には、パスワードとして 完全なメールアドレスを使わなければなりません。例え ば、greg.hankins@cc.gatech.edu のように。 11.2.4. agetty および mingetty について agetty は単純で、仮想コンソールあるいはモデムよりも端末に適した getty の、完全な実用本位の実装です。しかし、(agetty が稼動中あるいは着信待ち だと、発信できないことを除き) 状況が良ければモデムとともにすばらしい働 きをします。Debian の agetty は単に getty という名前になっています。 mingetty はコンソール(画面)でのみ動く小さな getty なので、ダイヤルイン 用としてモデムとともに使用することはできません。 11.3. ダイヤルインの際に何が起こりますか? 発信者はあなたの電話番号をダイヤルする通信プログラムを動かし、あなたの 電話が鳴ります。ここで PC は 2 つの異なる方法で電話に応答できます。ひ とつはモデムが自動的に応答するものです。もうひとつは getty が着信を感 知し、モデムに応答するようコマンドを送るものです。いったん応答すると、 モデムは対向するモデムへ(逆方向に)信号を送出します。2 つのモデムはどの ように通信するのか取り決め、それが済むとモデムは ``CONNECTed'' などの メッセージを getty へ送ります。getty がこのメッセージを受け取ると、シ リアルポートへログインプロンプトを送出します。ときには、 getty はログ インを扱う login という名のプログラムを呼び出します。getty はたいてい 起動時に動き始めます。しかし、ログインプロンプトを送出するには、接続が 確立するまで待たなければなりません。 着信に応答する 2 つの方法をより詳しく述べます。モデムの S0 レジスタを 3 に設定すると、モデムは 3 回目のベルで自動応答します。0 に設定する と、電話が鳴っている間に getty がモデムに ``A'' (= Answer) コマンドを 送ったときのみ、モデムが応答するようになります。正確には、すべてのモデ ムコマンドは頭に ``AT''が付くので、``ATA'' を送ります。モデムの自動応 答機能を使うのが最も良いと考えるかもしれませんが、実際には getty が応 答するほうが良いです。モデムが自動的に応答しないことを、 (たとえ getty が自動的に着信を扱ったとしても)手動応答と呼びます。 「手動」応答では起動時に getty がポートを開き監視します。電話が鳴る と、監視している getty へ ``RING'' メッセージが送られます。 getty が応 答するのなら、モデムへ ``ATA'' コマンドを送出します。そして、モデムは 接続を確立し getty へ ``CONNECT ...'' メッセージを送り、getty は発信者 へログインプロンプトを送出します。 自動応答時には、接続の確立を検知するため、モデムからシリアルポートへの CD (Carrier Detect = キャリア検知)配線を使用します。これは以下のように 動作します。起動時に getty はシリアルポートを開くことを試みますが、通 常はモデムからの CD 信号がないので、それは失敗します。そして、 getty は CD 信号が現れるまで、ポートを開いた状態で待機します。(恐らく数時間 あとに) CD 信号が届くと、ポートが開かれ getty はログインプロンプトを送 出します。Linux はマルチプロセスのオペレーティングシステムなの で、getty が待機(スリープ)している間、他のプロセスは動くことができま す。正確には、getty を動かすきっかけは、モデムからの CD 線の状態が ON に変わった際に発行される割込みです。 手動応答時には CD 信号がないため、getty がどのようにしてシリアルポート を開くのか不思議に思うかもしれません。たとえ CD 信号がなかったとして も、ポートを開くよう強制するプログラムを書く方法があります。 11.4. なぜ手動応答が最も良いのか コンピュータが停止していてもモデムがまだ動作している場合、応答における 2 つの手法間で違いが現れます。手動応答では ``RING'' メッセージが getty へ送られますが、コンピュータが停止しているため getty は存在せず、電話 には決して応答しません。応答がないので電話料金はかかりません。自動応答 では、応答はあるもののコンピュータが停止しているので、ログインメッセー ジが来ないことになります。待機が続いているので、電話料金がかかります。 永遠に来ないログインプロンプトを待ち続けるのはいらだたしいかもしれませ ん。もし電話料金が固定制ならばたいした違いはありません。 mgetty は手動 応答を使用します。uugetty は設定スクリプトを使用して、自動応答にできま す。 11.5. コールバック コールバックでは、誰かがあなたのモデムへまずダイヤルし、発信者の情報を 得て折り返し電話をかけます。なぜこんなことをしたいのでしょうか? ひと つには、発信者があなたに電話をかけるよりも、あなたが発信者にかけるほう が料金が安いのならば、電話料金を節約できるからです。もうひとつは、発信 者が本当に接続してよい人物かどうかを確認するためです。発信者があなたに 電話をかけて、ある電話番号からかけていると主張したなら、これを確かめる ひとつの方法はその番号へ電話をかけなおすことです。 Linux には mgetty とともに動作する ``callback'' という名のプログラムが あります。 にあります。どのように callback (および PPP) をインストールしたのか、手順を追った解説書が にあ ります。 11.6. ボイスメール ボイスメールはコンピュータが動かす応答装置のようなものです。ボイスメー ルを扱うためには、モデムが「音声」をサポートしていること、および補助ソ フトウェアが必要です。テープにメッセージを保存するのではなく、ディスク 上にデジタル形式で保存します。誰かがあなたに電話をかけてきたときに、応 答メッセージを聴いてからメッセージを残せます。より高度なシステムは、発 信者がメールボックスや応答メッセージを選択できるでしょう。Linux にも簡 易な可能にするフリーソフトウェアがありますが、高性能なものはまだできな いようです。 著者は Linux の 2 つの異なるボイスメールソフトウェアを知っています。ひ とつは非常に小さいものです(``ボイスメールソフト ウェア'' をご覧くださ い)。もうひとつは vgettyで、より高性能ですが今はドキュメントが不充分で す。vgetty は豊富なドキュメントがあり広く流通している mgetty の、オプ ションの追加プログラムです。ZyXEL に似たボイスモデムコマンドをサポート しています。Debian では mgetty および mgetty-doc パッケージに加え て、mgetty-voice パッケージを手に入れなければなりません。時代遅れの文 書は mgetty から削除されていますが、( プログラムを動かし -h (help) オ プションを使うことを除き) 代わりの文書が不足しています。しかし、mgetty のニュースグループで使用法についての投稿を見られます。``mgetty につい て'' をご覧ください。現在 vgetty はそれほど安定していないようですが、 幸運にも正しく動作し、開発が進行中です。ご覧の HOWTO が最新バージョン なら、vgetty を良く知っている人は著者に vgetty の現状を教えてくれませ んか? 12. ダイヤルイン用の uugetty (古い Serial-HOWTO から引用) mgetty を uugetty の(より良い?)代わりとして使えることを知ってくださ い。mgetty は uugetty よりも新しく、評判が良いです。2 つの getty の簡 単な比較については ``getty とは?'' をご覧ください。 12.1. getty_ps のインストール uugetty は getty_ps の一部なので、まず最初に getty_ps をインストールし なければなりません。手元になければ、 から最新バージョンを 手に入れてください。特に、(57600 あるいは 115200 bps の)高速通信をした いなら、バージョン 2.0.7j 以降が必要です。また、libc 5.x 以降も必要で す。 デフォルトでは、getty_ps は FSSTND (File System Standard) に従って設定 されており、バイナリが /sbin に入っていて、設定ファイルは /etc/conf.{uu}getty.ttySN という名前になっています。このことは文書に はっきりと書いてはありません! そして、ロックファイルを /var/lock に作 ります。ディレクトリ /var/lock があることを確認してください。 FSSTND に従いたくないなら、バイナリは /etc に、設定ファイルは /etc/default/{uu}getty.ttySN になり、ロックファイルは、/usr/spool/uucp に入ります。もし UUCP を使うなら、この方法を勧めます。なぜなら、UUCP は自分の知らないところへロックファイルを移すと問題を起こすことがあるか らです。 更に、getty_ps は syslogd を使ってメッセージの記録を取ります。もし、ま だ syslogd を動かしていないのなら、 syslogd(1) と syslogd.conf(5) の man ページを見て設定して下さい。メッセージは優先度付きで LOG_AUTH、エ ラーは LOG_ERR、デバッグは LOG_DEBUG へ記録されます。 syslogd を使いた くなければ、getty_ps のソースファイルの中にある tune.h を編集してメッ セージ出力やデバッグにはログファイルを使用するように変更しましょう。省 略時のログファイル名は /var/adm/getty.log になります。 FSSTND 基準と syslogd の機能を採用するか決めてください。もちろん 2 つ を組み合わせることも出来ます。Makefile, tune.h および config.h を、決 定通りに編集します。パッケージに含まれる説明に従ってコンパイルし、イン ストールします。 12.2. uugetty の設定 uugetty がログインに使うポートを監視している間に、 uugetty を用いてモ デムから電話をかけてもさしつかえありません。この HOWTO の原著者は /dev/cuaN を電話をかけるために使うと述べています (uugetty は /dev/ttyN で動いています)。しかし、他の人はダイヤルインとダイヤルアウトの両方で /dev/ttyN を使わなければならないと言います。どちらが正しいのでしょ う??? [訳注 : /dev/cuaN と /dev/ttyN に関する議論は ``cua デバイス'' にあり ます。] uugetty は重要なロックファイルの監視を行います。 /etc/gettydefs にモデ ムのエントリを追加します。 /etc/gettydefs の編集が終ったら、以下のよう にして記述が正しいか確認できます : linux# getty -c /etc/gettydefs 12.2.1. 最近のモデム データ圧縮機能を持つ 9600 bps 以上のモデムでは、シリアルポートをひとつ の速度へ固定できます。例えば : # 115200 fixed speed F115200# B115200 CS8 # B115200 SANE -ISTRIP HUPCL #@S @L @B login: #F115200 RTS/CTS ハードウェアフロー制御を行うよう設定するなら、 CRTSCTS を追加 します : # 115200 fixed speed with hardware flow control F115200# B115200 CS8 CRTSCTS # B115200 SANE -ISTRIP HUPCL CRTSCTS #@S @L @B login: #F115200 12.2.2. 古い低速のモデム (9600 bps 以下の)低速モデムでは、特定の速度用に 1 行記述する代わりに、 いくつかの速度を試すために複数の行が必要です。#38400 といった各行の最 後の「単語」により、モデムのエントリはお互いにリンクしていることを注意 して下さい。また、各行の間には空白行が1行必要になることにも注意して下 さい。 # Modem entries 115200# B115200 CS8 # B115200 SANE -ISTRIP HUPCL #@S @L @B login: #57600 57600# B57600 CS8 # B57600 SANE -ISTRIP HUPCL #@S @L @B login: #38400 38400# B38400 CS8 # B38400 SANE -ISTRIP HUPCL #@S @L @B login: #19200 19200# B19200 CS8 # B19200 SANE -ISTRIP HUPCL #@S @L @B login: #9600 9600# B9600 CS8 # B9600 SANE -ISTRIP HUPCL #@S @L @B login: #2400 2400# B2400 CS8 # B2400 SANE -ISTRIP HUPCL #@S @L @B login: #115200 12.2.3. ログインバナー お望みなら、uugetty に、ログイン時に面白そうなバナーを表示させることも できます。Greg さんの例では、システムネームとシリアルライン名、そして 通信速度です。他にも以下のようなものがあります : @B 現在の通信速度 (bps, @B を変換するときに調べる) @D MM/DD/YYであらわされる年月日 @L uugetty が属するシリアルライン (ttySN) @S システム名 @T HH:MM:SS で表される時分秒 (24時間制). @U 現在の接続ユーザー数 これは、 /etc/utmp ファイル内の ut_name フィールド のうち有効なレコードの数です。 @V バージョン デフォルトファイルで指定した OS バージョン '@' そのものを表示したければ、 '\@' か '@@' を使ってください。 12.3. uugetty のカスタマイズ 各ポートを自在に制御できる数多くのパラメーターが揃っています。それぞれ のポートを個別に設定できるようポート単位の設定ファイルが用意されていま す。/etc/conf.uugetty は uugetty 共通の設定ファイル で、/etc/conf.uugetty.ttySN がそのポートだけの設定ファイルです。たいて いの linux ディストリビューションに付属している getty_ps のソースファ イルの中に、これらのサンプルファイルが含まれています。スペースの関係 で、ここには掲載しません。(2.0.7e 以前の)古いバージョンの uugetty を 使っているか、FSSTND 互換にしなかった場合は、設定ファイルは /etc/default/uugetty.ttySN になっていることに注意して下さい。著者の /etc/conf.uugetty.ttyS3 は、次のようなものです。 # sample uugetty configuration file for a Hayes compatible modem to allow # incoming modem connections # # alternate lock file to check... if this lock file exists, then uugetty is # restarted so that the modem is re-initialized ALTLOCK=cua3 ALTLINE=cua3 # line to initialize INITLINE=cua3 # timeout to disconnect if idle... TIMEOUT=60 # modem initialization string... # format: ... (chat sequence) INIT="" AT\r OK\r\n WAITFOR=RING CONNECT="" ATA\r CONNECT\s\A # this line sets the time to delay before sending the login banner DELAY=1 #DEBUG=010 次に、/etc/inittab へ以下に示す行を追加します。シリアルポートに対して uugetty が動くよう、(2345 あるいは 345 といった)ランレベル、設定ファイ ルの場所、ポート、速度、そしてデフォルトの端末タイプなどの環境に合わせ て正しく設定してください。 S3:2345:respawn:/sbin/uugetty -d /etc/default/uugetty.ttyS3 ttyS3 F115200 vt100 init を再起動します : linux# init q /etc/inittab において、速度パラメータとしてモデムがサポートする最高速 度を使いたいでしょう。 これで、シリアルポートへの接続を Linux が監視します。別のマシンから電 話をかけ、Linux へログインしてください。 uugetty は更に多くのオプションがあります。完全な説明は (しばしば uugetty と呼ばれる) getty(1m) のマニュアルを見てください。この他にもス ケジューリング機能やコールバック機能があります。 [訳注 : マニュアルの管理コマンドセクション 1m は、現在は セクション 8 になっています。] 13. モデムで使うべき速度は? 著者は「速度」を「データ転送速度」のつもりで使っていますが、ほとんどの 人は間違って速度と呼んでいます。最近のモデムは状況が許す最も高い速度を 自動的に選択するので、ユーザがモデムの電話回線上での速度を選べません。 しかし、モデムとコンピュータ間の速度なら選べます。この速度を「DTE 速 度」と呼ぶこともあります。ここで、``DTE'' は Data Terminal Equipment を表します(コンピュータは DTE です)。信号が流れる経路の中でこの部分が ボトルネックにならないよう、この速度を充分に速く設定する必要がありま す。 DTE 速度の設定は、この接続で可能な限り高い速度にします。多くの場 合、恐らくそれより低い速度でしか使わないでしょう。 外付けモデムでは、DTE 速度はモデムと PC の間のケーブルを流れるデータの 速度です (bit/sec で表現します)。内蔵モデムでは、シリアルポートのよう に動作するので、外付けモデムと同じように考えます。モデムボードとコン ピュータはかなり高速なバスで直接接続されているので、速度に限界があるこ とはおかしいと感じるかもしれません。しかし、モデムボードには速度に限界 のある(そして速度を設定できる) 専用のシリアルポートがあるのです。 13.1. 速度とデータ圧縮 どのような速度を選びましたか? 「データ圧縮」がなければ、モデムの速度 とちょうど同じ DTE 速度を選ぶ人もいるでしょう。データ圧縮はコンピュー タからモデムへ送るデータを扱い、より少ないデータへ符号化します。例え ば、 PC からモデムへの速度が 20,000 bytes/sec (bps) で圧縮率が 2:1 な ら、 10,000 bytes/sec のデータだけが電話回線上を流れます。従って、圧縮 率が 2:1 だと、電話回線上での最も高いモデムの速度の2 倍を設定する必要 があります。圧縮率が 3:1 なら、3 倍高速に設定しなければなりません。 13.2. どこで速度を設定するの? 通常、DTE 速度は通信プログラムのメニューや、ダイヤルインの際に使う getty コマンドのオプションで設定します。モデム間の DCE 速度は設定でき ません。 13.3. 充分に高い速度へ設定できない ハードウェアがサポートする最も高い速度を知る必要があります。1998 年の 終りには、多くのハードウェアは 115.2K bps 程度の速度をサポートしていま した。そして、少数の 56K 内蔵モデムだけが 230.4K bps をサポートしてい ました。最近の Linux カーネルは (115.2K 以上の)速い速度をサポートして いますが、以下に挙げる複数の理由により、それを利用するには困難が伴うか もしれません。 1. アプリケーションプログラム(あるいは stty) が速い速度に対応できな い。 2. setserial のデフォルト速度は 115,200 bps である (しかし、変更は簡単 です)。 13.3.1. どのようにハードウェア中で速度が設定されているか : 除数とボー レート ここに、通常使用する除数の一覧を挙げます。(最高速度が 115,200 なら) 対 応する速度は : 1 (115.2K), 2 (57.6K), 3(38.4K), 6 (19.2K), 12 (9.6K), 24 (4.8K), 48 (2.4K), 96 (1.2K) などです。シリアルドライバは (正の整数 の) 「除数」だけを送り、ハードウェアに速度を設定します。この「除数」で ハードウェアの最高速度を割り、より遅い速度になります(明らかですが、除 数 1 はハードウェアに最高速度で動作するよう命令します)。 通常、(通信プログラムか stty で) 115.2k の速度を指定したなら、シリアル ドライバはポートのハードウェアを、最も速い速度を指定する除数 1 に設定 します。最高速度が 230.4k のハードウェアをたまたま持っていたなら、 115.2k を指定すると除数が 1 となり、実際に設定される速度は 230.4k にな ります。設定の 2 倍になります。事実、どの速度に設定しても、本当の速度 は設定の 2 倍になります。460.8k で動作するハードウェアでは、本当の速度 は設定した速度の 4 倍になります。 13.3.2. 速度設定のおまけ (必ずしも問題を解決できるとは限りませんが)この状態を修正するため、 ``setserial'' の baud_base オプションを使って 230.4k などポートの正し い最高速度へ変更するのが良いでしょう。(アプリケーションや stty で) 速 度を設定したなら、除数 1 を使い設定した通りの速度を使えるようになりま す。問題 : (1999 年の中ごろでは) stty と多くの通信プログラムは最高速度 が 115.2k であり、230.4k などには設定できないでしょう。従って、このよ うな場合でのひとつの解決法は、setserial で何も変更せず、正しい速度は常 に設定の 2 倍であると自分に言い聞かせることです。 それほど好ましくはないのですが、もうひとつおまけがあります。(setserial で) baud_base をハードウェアの最高速度へ設定します。この操作は、 115.2k に設定したなら正確に 115.2k の設定になるよう、計算方法を修正し ます。使っている通信プログラムなどがこの修正をしてくれないなら、どのよ うにして最高速度へ設定するのか更に理解する必要があります。幸運にも、 setserial には修正の方法があります : ``divisor 1'' とともに ``spd_cust'' パラメータを用います。通信プログラムで速度を 38400 に設定 すると、ポートの除数は 1 と設定され最高速度で動作します。例えば : setserial /dev/ttyS2 spd_cust baud_base 230400 divisor 1 (spd_cust とともに用いる)上に挙げた特殊用途以外の目的には、 ``divisor'' オプションを試さないでください。 通信プログラムで設定できないような高速の設定を使いたいとしても、上の例 と同じくらい簡単にはいきません。しかし、同じ原理が適用できます。 baud_base をデフォルト設定のままにし、速度設定の際に除数のみを設定しま す。従って、実際の速度はシリアルドライバに設定した除数で、モデムの最高 速度を割った値になります。``どのようにハー ドウェア中で速度が設定され ているか : 除数とボーレート'' をご覧ください。 13.3.3. 水晶の振動数は baud_base ではありません たいてい、設定した baud_base はハードウェア中の水晶発振子の振動数より も、ずっと小さな値だということを知ってください。これは、正確な最高速度 を得るために、水晶の振動数を 1/16 にすることもあるからです。多くのサン プル点の各ビットを 1 か 0 か決定するために、この高い水晶の振動数を使用 します。これが水晶の振動数を比較的高くしなければならない理由です。 13.4. 速度表 56k モデムがあるので、最低でも 16650 UART を使うのがもっとも良いです。 しかし、ほとんどのモデムは 56k を出せません。次に良いのは、230,400 bps を出すよう 16650 UART を調整することです。モデムの速度によって異なる、 望ましいシリアルの速度をここに挙げます : o 56K (V.90) モデムでは 115200 bps あるいは 230400 bps (もう数 % 速く ?) o 28.8K (V.34), 33.6K (V.34) モデムでは 115200 bps o V.42bis データ圧縮付き 14400 bps (V.32bis) モデムでは 57600 bps o V.42bis データ圧縮付き 9600 bps (V.32) モデムでは 38400 bps o 9600 bps (V.32) より低速のモデムではモデムがサポートする最高速度 14. 通信プログラムとユーティリティ PPP は非常に広く使われており、インターネットへの接続に使用します。公立 図書館、あるいは掲示板などへ電話をかけるためには、Seyon (X-Window System のみ) に付属する minicom と Kermit がもっとも一般的です。 14.1. Minicom と Kermit Minicom はただの通信プログラムです。一方、Kermit は通信プログラムでも ありファイル転送プロトコルでもあります。しかし、(Kermit を PC にインス トールしたなら) Minicom を使用中に Kermit プロトコルを使う人もいるかも しれません。Minicom はメニューベースで、Kermit は(専用プロンプトでの対 話的な)コマンドラインベースです。Kermit はフリーソフトウェアですが、ド キュメントはすべてがフリーと言うわけではありません。詳細なマニュアルは なく、マニュアルとして書籍を購入するよう勧めています。しかし、Kermit はすべての項目について対話的なオンラインヘルプがあるものの、初心者向け のチュートリアルがありません。コマンドはスクリプト中に記述するので、毎 回コマンドをタイプする必要がありません。(通信プログラムとしての) Kermit は Minicom よりも強力です。 Minicom のドキュメントはすべてフリーであるものの、Kermit の文書ほど広 範囲にわたる記述はありません。商用ディストリビューションに Kermit を収 録するには許可が必要です。文書が完全にフリーではないため、Kermit を収 録しないディストリビューションもあります。著者の意見では、Minicom の設 定はより簡単で、学ばなければいけないことも少ないです。 14.2. プログラムのリスト FTP で入手できる通信プログラムの一覧を挙げます。ディストリビューション に含まれていないなら、この一覧から選んでください。まず、ダイヤルアウト を行うプログラムを比較したいと思います。最も人気のないものは既に時代遅 れなのでしょうか? 14.2.1. 最も人気のないダイヤルアウトプログラム o ecu - 通信プログラム o pcomm - procomm に似た zmodem を含んでいる通信プログラム o xc - xcomm 通信プログラムパッケージ 14.2.2. 最も人気のあるダイヤルアウトプログラム o minicom - スクリプト、zmodem, kermit をサポートした telix に似た通 信プログラム。 o C-Kermit - ファイル転送、文字コー ド変換、そして zmodem をサポートする移植性の高いスクリプトが組める シリアルと TCP/IP の通信プログラム o seyon - X ベースの通信プログラム 14.2.3. Fax o efax 小さな FAX プログラム o hylafax クライアント - サーバ モデルに基づいた巨大な FAX プログラム o mgetty+fax FAX も扱い、ダイヤルインのログインを処理するプログラム 14.2.4. ボイスメールソフトウェア o mvm < http://www-internal.alphabet.ch/~schaefer/mvm/> は Linux 用の 非常に小さいボイスメールソフトウェアです。 o vgetty はモデム用のボイスメールを扱う mgetty の拡張です。 mgetty の 新しいバージョンに同梱されています。 14.2.5. (getty を用いた) ダイヤルイン o (1999 年の始めでは、ボイスメールに関する部分を除いて) モデム用の mgetty+fax はドキュメントが豊富です。FAX を扱い uugetty の代わりに 使えます。(vgetty を用いて)ボイスメール機能を統合しています。 ``mgetty について'' をご覧ください。 o uugetty もモデム用です。ps_getty パッケージの一部です。 ``getty_ps について'' をご覧ください。 14.2.6. その他 o callback は他のモデムへ電話をかけ、(電話料金を節約するために)電話を 切ってコールバックします。 o SLiRP と term は、シェルアカウントがある遠隔地のコンピュータのユー ザ空間で動作させ、 PPP に似たサービスを提供します。詳細は ``term と SLiRP'' をご覧ください。 o ZyXEL は ZyXEL U-1496 モデムの制御プログラムです。発着信、セキュリ ティのためのコールバック、FAX、そしてボイスメールの機能があります。 o SLIP と PPP のソフトウェアは ftp://metalab.unc.edu/pub/Linux/system/network/serial で見つけられ ます。 o 他にはftp://metalab.unc.edu/pub/Linux/system/serial と ftp://metalab.unc.edu/pub/Linux/apps/serialcomm あるいは多くのミ ラーサイトで見つけられます。これらはシリアル通信に関連したプログラ ムがあるディレクトリです。 14.3. SLiRP と term UNIX 系のマシンにダイヤルアップのシェルアカウントしかなく、認証なしで( あるいは追加料金を払いたくないなどの理由で) PPP アカウントと同等の機能 を使いたい場合、SLiRP と term を用います。SLiRP はほとんど廃れてしまっ た term よりも人気があります。 SLiRP を使うためには、シェルアカウントのあるリモートのコンピュータへイ ンストールします。そして、そのアカウントでダイヤルアップ接続し、リモー トマシンで SLiRP を動かし、ローカルの PC で PPP を動かします。する と、PPP 接続が実現し、Netscape などのウェブブラウザを動かせるでしょ う。SLiRP は本当の PPP アカウントと同等ではないので、何らかの問題があ るかもしれません。IP アドレスを節約できるので、SLiRP を使えるようにし ているサイトもあるかもしれません。 term は SLiRP と似ていますが、ただしローカルとリモート双方のコンピュー タで term を動かす必要があります。term は固有のプロトコルを使用するの で、電話回線上には PPP 接続はありません。term を PC で利用するために は、term に対応している (ftp などの)アプリケーションを使う必要がありま す。従って、SLiRP では ftp がそのまま正常に動作するので、SLiRP を使う 方が簡単です。メンテナンスされていない Term-HOWTO があります。 15. UART って何ですか? 性能にどんな影響を与えますか? 15.1. UART の概要 (この節は Serial-HOWTO にもあります) UART (Universal Asynchronous Receiver Transmitter) とは、PC のマザー ボード(あるいは内蔵モデムボード)に載っているシリアル用チップのことで す。他の用途のチップが兼用で UART の機能を実現していることもあります。 多くの 486 マシンのような古いコンピュータでは、このチップはディスク I/O コントローラボードに載っていました。比較的古いコンピュータの中に は、まだ専用のシリアルボードを載せているものもあります。 UART の目的は PC のパラレルバスからやってくるバイトデータを、シリアル のビットストリームに変換することです。シリアルポートから出ているケーブ ルはデータをシリアルに送るようになっており、データが流れる方向それぞれ について 1 つしか線がありません。シリアルポートは一度に 1 ビットずつ ビットストリームを送ります。逆に、外付けケーブルを経由してシリアルポー トに入ってきたビットストリームは、コンピュータが処理できるパラレルなバ イトデータに変換されます。UART はデータをバイト単位で扱います。この単 位は都合がいいことに ASCII 文字の大きさでもあります。 PC にぶら下がっている端末があるものとします。ユーザが文字を入力する と、端末はその文字をトランスミッタに (UART にも)送ります。トランスミッ タはそのバイトデータをシリアル回線に送り、送信は 1 バイトずつ、特定の 速度で行います。PC 側では、受信を行う UART がビット列を全て受け取り、( パラレルの)バイトデータに復元し、これをバッファに入れます。 シリアルとパラレルの変換に加えて、UART は主な処理の副産物(副作用)とし て他の処理もいくつか行います。ビット列を表すために使う電圧も変換(変更) します。バイトデータを送信する前に、それぞれのバイトに対して追加のビッ ト(いわゆるスタートビットとストップビット)を加えます。詳しくは Serial- HOWTO の「電圧の波形」の節を見てください。また、コンピュータ内部のパラ レルバス上のフローレート(バイト/秒)は 非常に高く、シリアルポート側の UART から出るフローレートはこれよりもずっと遅いです。UART はいくつかの 決められたフローレート(速度)の組を持っていて、これをシリアルポートイン タフェースで使うことができます。 [ 訳注 : JF プロジェクトによる日本語訳 Serial-HOWTO ] 15.2. 2 種類の UART UART の基本的な種類は 2 つ(ダム UART と FIFO UART) あります。ダム UART は 8250, 16450, 初期型 16550, 初期型 16650 です。これらは時代遅れのも のですが、これらの動作の仕組みがわかれば、FIFO UART (最近の 16550, 16550A, 16c552, 最近の 16650, 16750, 16950) の動作を理解するのも容易で す。 16550 については紛らわしい点がいくつかあります。初期モデルにはバグがあ り、(FIFO を持たない) 16450 としてしか正しく動作しません。バグが修正さ れた最近のモデルには 16550A という名前が付いていますが、多くのメーカー は名前を変更しておらず、16550 と呼び続けています。現在使われている 16550 の大部分は 16550 のようです。ハードウェアのマニュアルに 16550 で あると書かれていても(あるいはラベルにそのように刻印されていても)、 Linux は 16550A であると認識してくれます。同様の事情が 16650 にもあり ます(こちらの方が深刻です。というのも、聞いた話ではメーカーがバグを認 めなかったからです)。Linux は最近の 16650 を 16650V2 として認識しま す。 16650 と認識された場合には残念ながら、1 バイトのバッファしか持っ ていないように動作します。 15.3. FIFO ダムと FIFO (キューの動作がファーストイン・ファーストアウト (First In, First Out) である)の違いを説明するために、まずは UART が 1 バイトの データを送受信した場合のことを調べてみましょう。UART 本体は自分を通る データに関しては何も行わず、単にデータを送受信するだけです。元々のダム UART の場合は、バイトデータが送受信される度に CPU がシリアルデバイスか ら割込みを受け取ります。CPU はこれを受けて、受信したバイトデータを UART のバッファから取り出してメモリ上のどこかに置くか、送信すべき次の バイトデータを UART に渡すかの、どちらか動作を行います。8250 と 16450 UART には 1 バイトしかバッファがありません。つまり、1 バイトのデータを 送受信する度に CPU に割込みがかかります。転送速度が低ければこれでも大 丈夫です。しかし、転送速度が高速である場合には、UART の処理の負荷が CPU にかかりすぎるため、他の処理をうまく行えるだけの時間がなくなってし まいます。場合によっては、CPU の割込み処理が間に合わなくなってしまい、 バイトデータが上書きされてしまいます。なぜなら、データが入ってくるのが 速過ぎるからです。これは「オーバーラン (overrun)」あるいは「オーバーフ ロー (overflow)」と呼ばれます。 これが FIFO UART が役立つ理由です。16550A (あるいは 16550) の FIFO チップには 16 バイトの FIFO バッファが付いています。つまり、CPU に割込 みがかかるまでに 16 バイトまでを受け取る(送る)ことができるのです。たく さんのバイトデータを待つことができるだけではなく、CPU は 14 バイト(ま たはそれ以上)のバイトデータを同時に転送できます。これは、バッファを 1 バイトしか持っていない他の UART に対して特に優れている点です。CPU が受 ける割込みも少なく他の処理に回せますし、データがなくなることもなく皆幸 せになれます。FIFO バッファの割込みの閾値(トリガレベル)には 14 以下の 値が設定できる点に注意してください。この他には 1, 4, 8 が選べます。 大抵の PC には 16 バイトのバッファを持つ 16550 しか付いていませんが、 高級な UART にはもっと大きなバッファがあります。割込みはバッファがいっ ぱいになる直前 (16 バイトのバッファでは 14 バイトのいわゆる「トリガレ ベル」の時点)に発行される点に注意してください。こうすることにより、割 込みサービスが実行される間にも何バイトかのデータを受け取れる余裕が残り ます。このトリガレベルには、カーネルのソフトウェアが許可した色々な値を 設定することができます。トリガレベルを 1 にすると、ダム UART とほぼ同 等になります (ただし、割込みを発行した後にもさらに 15 バイトを受け取る 空きが残っている点が異なります)。 BBS に入っているときに何か文字を入力した場合、入力した文字はシリアル ポート経由で送り出されます。入力した文字が画面に表示されるのは、その文 字が電話回線・モデム・シリアルポート経由で画面にエコーバックされている からです。シリアルポートに 16 バイトのバッファが付いている場合(これは 14 バイト集まるまで文字を送ってくれません)、入力した文字が表示されるま でには文字をたくさん入力しなければならないでしょう。とても紛らわしいの ですが、これを防ぐための「タイムアウト」があります。従って、普通は文字 を入力すると、その文字はすぐに画面に表示されます。 UART の受信バッファの場合、この「タイムアウト」は 以下のように動作しま す : 文字が次々とやってきても、割込みは発行されるのは、バッファに例え ば 14 個文字がたまったときだけです。しかし、ある文字が届いた後にしばら く次の文字が届かなくても割込みが発行されます。この割込みはたとえバッ ファに 14 個文字が入っていなくても発行されます (1 文字でも入っていれば 発行されます)。したがって、このバッファを通して文字を入力すると、バッ ファの大きさが実際には 16 バイトであっても(あなたが文字を打ち込む速さ が普通の 100 倍でなければ) 1 バイトのバッファのように動作します。同様 の「タイムアウト」が送信バッファにもあります。 15.4. UART のモデル番号 以下の UART の一覧を示します。TL はトリガレベル(Trigger Level) です。 o 8250, 16450, 初期の 16550: バッファの大きさが 1 バイトである時代遅 れの UART です o 16550, 16550A, 16c552: 16 バイトのバッファがあります (TL=1,4,8,14) o 16650: 32 バイトのバッファがあります。460.8 Kbps までの速度に対応し ています o 16750: 16750: 64 バイトの送信バッファ、56 バイトの受信バッファがあ り ます。921.6 kbps までの速度に対応しています o Hayes ESP: 1K バイトのバッファがあります 時代遅れの UART がうまく動作するのは 14.4k より遅いモデム (DTE 速度は 38400 bps まで)の場合だけです。最近のモデムでは、少なくとも 16550 (初 期型 16550 は含みません)が必要です。V.90 規格の 56k モデムの場合に は、 16650 を使うと数パーセント速くなることがあります(特に圧縮されてい ないファイルをダウンロードするとき)。16650 を使う主な利点はバッファの サイズが大きいことであり、モデムの圧縮比が高くなければ必要以上の速度が 必要ない点です。一部の 56k 内蔵モデムには 16650 が載っていないものがあ ります(筆者は確かめていません)。 UART でなくインテリジェントなマルチポートボードでは、DSP チップを使っ てさらなるバッファリングと制御を行っています。したがって、CPU の負荷は さらに軽くなっています。例えば、Cyclades 社製の Cyclom や Stallion 社 製のEasyIO ボードは Cirrus Logic CD1400 RISC UART を使って、これ以外の 多くのボードは 80186 CPU や特殊な RISC CPU さえ使ってシリアル I/O を処 理します。 最近の PC のほとんど (486, Pentium 以降のマシン)には 16550A (普通は単 に16550 と呼ばれます)が載っています。実は古いチップが載っていたという 場合には、既存の 16450 チップを外して、新しく買った 16550A チップと置 き換えることにより、アップグレードすることができます。他のタイプのチッ プが載っていた場合は、残念ながらあきらめてください。UART がソケット形 式ならば、(置き換えるチップさえあれば)アップグレードは簡単でしょう。新 しいチップと古いチップのピン配置は互換です。新しいシリアルボードをイン ターネットで購入することもできるかもしれません(現在はシリアルボードを 扱っている小売店はほとんどありません)。 16. トラブルシューティング 16.1. モデムが物理的には存在するのに検出できません 内蔵モデムを既に取り付けた、あるいは外付けモデムがつながっているシリア ルポートがわからない場合は、次の課題はシリアルポートを検出することで す。``シリアルポートが物理的には存在す るのに検出できません'' をご覧く ださい。この節では、モデムが接続しているシリアルポートを検出することに 関して述べます。 ``wvdialconf'' という使用中のシリアルポートからモデムを探し出すプログ ラムがあります。``wvdialconf '' とだけタイプしてくだ さい。新しいファイルを設定ファイルとしてつくります。しかし、 ``wvdial'' を電話をかけるために使わない限り、このファイルを使う必要は ありません。``wvdialconf とは?'' をご覧ください。 Linux では使えないソフトウェアモデムなどが原因の問題かもしれません。 ``ソフトウェアモデムの大部分は避ける'' をご覧ください。``setserial'' はシリアルポートを検出するために使いますが、ポートにつながっているモデ ムの検出はしません。従って、まず ``wvdialconf'' を試すのが最も良い方法 です。 ポート上にモデムがあるかどうか確かめるもうひとつの方法は、``minicom'' を起動することです (C-A O で設定メニューへ行きます)。``AT'' とタイプす ると、OK と返ってくるはずです(リザルトコードを数字で表示しているなら 0 です)。(カーソルを移動するだけの場合を含み) 応答が返ってくるまでに時間 がかかりすぎるようなら、``この上な く遅い: テキストがすごく遅れてゆっ くり画面に表示されます'' をご覧ください。 16.2. 56k モデムで 56k に近い速度が出ません 56k 近い速度で通信するには、回線のノイズが非常に低いことが必要です。電 話回線の品質が非常に悪く、56k よりもずっと遅い (28.8k あるいは更に遅 い) 速度しか得られないことがあります。同一の回線に接続した内線電話は、 問題を引き起こすこともあります。これを確かめるため、(他の人が許してく れるなら)回線に何もつながっていない状態で、回線がビルの中へ引き込まれ ている場所に直接モデムを接続してみるのも良いでしょう。 16.3. アップロード(ダウンロード)したファイルが壊れる、あるいは遅い (PC あるいはモデムで)フロー制御が有効になっていないかもしれません。 (115.2k などの)速い DTE 速度を設定したなら、モデムから PC への流れは正 常に動作するでしょう。しかし、逆方向では電話回線がボトルネックになるの で、多くのデータが正常に送れないかもしれません。従って、多くのエラーと パケット再送が発生します。ファイルを送るのに非常に長い時間がかかる、あ るいは送れないかもしれません。また、ファイルを全く作れない場合もあるで しょう。(モデムのデータ圧縮を使いながら) 大きな無圧縮ファイルやウェブ ページをダウンロードしているとき、フロー制御がないためにダウンロードも うまくいかないこともあります。 16.4. ダイヤルインの際に ``line NNN of inittab invalid'' と出続ける init のバージョンに合った正しい記述法を使っていることを、確かめてくだ さい。init により /etc/inittab の記述法は異なります。また、getty の バージョンにあった記述法を用いているか、確認してください。 16.5. ``Id "S3" respawning too fast: disabled for 5 minutes'' と出続 ける Id ``S3'' はただの例です。この場合には、/etc/inittab の ``S3'' で始ま る行を見てください。この行が問題を引き起こしています。この行の記述方法 が正しいか、デバイス (ttyS3) が存在し見つけられるかどうか、確認してく ださい。 モデムが正しく設定してあることを確認してください。E レジスタと Q レジ スタを見てください。表題に示す現象はモデムが getty と通信する際に起こ ります。 uugetty を使っているのなら、/etc/gettydefs の記述を、以下に示すような 方法で確かめてください。 linux# getty -c /etc/gettydefs uugetty の初期化に失敗するときにも、表題の現象は起こり得ます。 ``uugetty がいまだに動作しない'' の節をご覧ください。 16.6. 誰かが電話を切ったあとモデムが止まる、あるいは uugetty が再生 成しない DTR 信号が切れたときにモデムがリセットされないと、この現象が起きま す。Greg Hankins さんはこの現象が起きたとき、RD と SD の LED がおかし くなるのに気付きました。モデムをリセットする必要があります。多くの Hayes 互換モデムは &D3 でリセットを行います。しかし、彼の USR Courier 社製のモデムは &D2 と S13=1 を使わなければ行けませんでした。(もしある なら)モデムのマニュアルを確認してください。 16.7. uugetty がいまだに動作しない getty_ps には DEBUG オプションがあります。設定ファイル /etc/conf.{uu}getty.ttySN を編集し、DEBUG=NNN を追加してください。何を デバッグするのかによって、NNN は以下に挙げる数字の組合わせになります : D_OPT 001 オプションの設定 D_DEF 002 デフォルトのファイル処理 D_UTMP 004 utmp/wtmp の処理 D_INIT 010 回線の初期化 (INIT) D_GTAB 020 gettytab ファイルの処理 D_RUN 040 他の実行時診断 D_RB 100 リングバック-デバッグ D_LOCK 200 uugetty ロックファイル処理 D_SCH 400 スケジュール処理 D_ALL 777 すべて まずは DEBUG=010 の設定が良いでしょう。 syslogd を動かしているなら、デバッグ情報はログファイルへ出力されま す。syslogd を動かしていないなら、 /tmp/getty:ttySN にgetty デバッグ時 の情報を出力します。そして、 uugetty は /tmp/uugetty:ttySN と /var/adm/getty.log に載ります。デバッグ情報を見て何が起きているのか調 べてください。恐らく、設定ファイルでいくつかのパラメータを調整し、モデ ムを再設定する必要があります。 mgetty も試せます。これでうまくいった人もいます。 16.8. 以下の節は Serial-HOWTO にも Modem-HOWTO にもあります : 16.9. 物理的にはシリアルポートがあるのに、検出されません (モデムなどの)装置がシリアルポート上で動作しているなら、明らかにポート を検出できています。全く動作しないなら、シリアルポートを検出できるよう に、手当てする必要があります。 BIOS のメニューと出力メッセージを確認しましょう。ISA バス上の PnP シリ アルポートの場合には、``pnpdump --dumpregs'' を試したり、 Plug-and- Play-HOWTO をご覧になってください。PCI バスの場合には lspci を使用して ください。setserial を使って検出を行ってもよいでしょう。 ``検出'' の項 目を参照してください。シリアルポー トにデータが何も流れていないようで あれば、シリアルポートはあっても割込みが間違っているかもしれません。 ``この上なく遅い: テキストがすごく遅れてゆっくり画面に表示されます '' の節をご覧ください。 [訳注 : JF プロジェクトによる日本語訳 Plug-and-Play-HOWTO ] 16.10. この上なく遅い: テキストがすごく遅れてゆっくり画面に表示されま す これは割込みの設定が間違っているか、衝突しているためでしょう。初めてモ デムや端末、プリンタを使おうとしたときに出会うような現象をいくつか示し ます。場合によっては、入力した文字が何秒も経たないと表示されないことが あります。入力した最後の文字しか表示されないこともあります。また、その 文字が単に目に見えない<改行>文字で、カーソルが 1 行下に移動したことし かわからないこともあります。また別の場合としては、画面にデータはたくさ ん表示されるのですが、16 文字ごとのかたまりでしか表示されないこともあ ります。そして、あるかたまりの次のかたまりが表示されるまでには何秒もの 長い待ち時間が続きます。「input overrun (入力オーバーラン)」のエラー メッセージが表示される(あるいはログに残る)こともあります。 詳しい症状とそれが起こる理由については、Serial-HOWTO の「割込みの問題 に関する詳しい説明」の節を見てください。 プラグ&プレイデバイスがある場合には、Plug-and-Play-HOWTO も見てくださ い。 [訳注 : JF プロジェクトによる日本語訳 Serial-HOWTO および Plug-and- Play-HOWTO ] 本当に割込みの問題かどうかを簡単に調べるには、``setserial'' で IRQ を 0 に設定してください。これにより、ドライバは割込みではなくポーリングを 使うようになります。これで「遅い」問題が解決するようであれば、割込みの 問題が起きています。しかし、ポーリングはコンピュータの資源を大量に消費 して処理速度を低下させることもあります。ポーリングに頼らず、きちんと割 込みの問題を解決すべきです。 割込みの衝突を見つけだすのは容易ではないかもしれません。というのも、 Linux は割込みの衝突を全く許さず、衝突を起こそうとすると ``/dev/ttyS?: Device or resource busy'' エラーを送ってくるようです。しか し、``setserial'' が誤った情報を持っていると、本当の衝突が発生します。 このように、``setserial'' を使っただけでは衝突は発生しないでしょう (``setserial'' の情報に基づく /proc/interrupts を見ることもないでしょ う)。どこが悪いのか指摘するためには、やはり ``setserial'' の設定を知る 必要があります。ハードウェア中の本当の設定がわかったら、設定を変更して ください。 こういった場合に行うべき作業は、ジャンパや PnP 設定ソフトウェアを使っ て、ハードウェアに実際に設定されている情報を調べることです。PnP の場合 は、``pnpdump --dumpregs'' または ``lspci'' を実行しましょう。そして、 この結果を Linux 側の (``setserial'' などの)設定と比べるのです。 16.11. なぜか遅い: あと数倍は速いはずなのですが 考えられる理由の一つは、シリアルポートを使っているデバイス(モデムや端 末、プリンタ)が、あなたが考えているほど速く動作していないことです。 56k モデムはほとんど 56k で動作することはなく、そしてインターネットは ときには輻輳を起し、速度を低下させるボトルネックが発生します。 考えられる別の理由は、あなたが使っているシリアルポートが古い(UART 8250, 16450 や初期の 16550)とシリアルドライバが認識していることです。 ``UART って何ですか?''を参照し、``setserial -g /dev/ttyS*'' を使ってく ださい。その結果として 16550A より性能がよくない UART が表示されたら、 これは多分設定の問題です。この場合は、 ``setserial'' の設定に問題があ れば、これを変更します。詳しくは ``setserial とは何か?''を見てくださ い。当然のことですが、実際は古いシリアルポートを使っているのに setserial をだまそうとしても、単に事態が悪化するだけです。 16.12. システム起動時の画面で、シリアルポートの IRQ が間違っていると 表示されます Linux カーネルはシステムの起動時に IRQ の検出は全く行いません。 serial モジュールがロードされたときに、シリアルデバイスの検出が行われるだけで す。したがって、カーネルが IRQ に関して行う表示は無視してください。な ぜなら、この時点では標準の IRQ を決め打ちしているからです。このように なっているのは、IRQ 検出は当てにならず、間違うことがあるからです。しか し setserial が起動スクリプトから実行された場合には、setserial は IRQ を変更し、新しい(そして多分正しい)状態を起動画面に表示します。間違った IRQ が後で訂正されて画面に表示されなければ、何か問題が起こっています。 よって、IRQ 5 に設定されている ttyS2 がある場合であっても、Linux の起 動時には ttyS02 at 0x03e8 (irq = 4) is a 16550A と表示されます(古いカーネルでは ``ttyS02'' のところが ``tty02'' となり ます)。実際に使う IRQ を Linux に知らせるには、setserial を使わなけれ ばなりません。 16.13. "Cannot open /dev/ttyS?: Permission denied" というエラーが出ま す ``ls -l dev/ttyS?/'' を実行してそのポートのファイルのパーミッションを 調べてみましょう。ttyS? の所有者が自分であれば、読み書きのパーミッショ ンとして crw が必要です。最初の桁は c (キャラクタデバイス)です。ポート の所有者でなければ、8 桁目と 9 桁目が rw- でなければなりません。つまり 誰でもそのポートを読み書きできなければなりません。アクセス権限を得る方 法としては、グループパーミッションを持っている「グループ」に所属すると いったもっと複雑なものもあります。 16.14. ttySx について "Operation not supported by device" このエラーは、カーネルがサポートしていないために、setserial や stty 等 が要求した操作が行えないという意味です。以前は ``serial'' モジュールが ロードされてないことが原因の場合が多かったのですが、PnP の登場により、 このエラーはドライバ(および setserial)が考えているアドレスにモデム (あ るいは他のシリアルデバイス)がないことを示すことが多くなりました。こう いったアドレスにモデムがなければ、そのアドレスに送られた(操作のための) コマンドは当然ながら処理されません。 ``シリアルポートのハードウェアの 設定は?'' の節をご覧ください。 ``serial'' モジュールがロードされていないのに、そのモジュールはさっき ロードしたと ``lsmod'' が表示する場合は、モジュールは現在はロードされ ているけれど、エラーが出たときにはロードされていなかったのかもしれませ ん。多くの場合、モジュールは必要なときに自動的にロードされます(もし見 つけることができれば)。``serial'' モジュールを強制的にロードさせるに は、 /etc/modules.conf または /etc/modules に記述しておきます。モ ジュールそのものは /lib/modules/.../misc/serial.o にあるはずです。 16.15. "Cannot create lockfile. Sorry" 何らかのプログラムがポートを「オープン」するとき、ロックファイルが /var/lock/ に作られます。lock ディレクトリのパーミッションが間違ってい ると、ここにロックファイルを作れません。パーミッションが正しいかどうか を確認するには ``ls -ld /var/lock'' を使います。普通は全員に対してrwx です(rwx が 3 度繰り返されます)。パーミッションが間違っている場合に は、``chmod'' コマンドを使って修正します。もちろん、``lock'' ディレク トリがなければ、そこにロックファイルを作ることはできません。ロックファ イルに関する、より詳しい情報については Serial-HOWTO の「ロックファイル とは何ですか?」の節をご覧ください。 [訳注 : パーミッションを設定するには chmod 1777 /var/lock を実行してく ださい。詳細は chmod(1) をご覧ください。 JF プロジェクトによる日本語訳 Serial-HOWTO ] 16.16. "Device /dev/ttyS? is locked." (デバイス /dev/ttyS? がロック されています) このメッセージが出た場合にはおそらく、誰か他の人(あるいは他のプロセス) がシリアルポートを使っています。このポートを「使用中」のプロセスを見つ ける方法はいくつもあります。一つの方法は、ロックファイル (/var/lock/LCK...)の中身を見ることです。これは、ポートを使っているプロ セスの ID のはずです。プロセス ID が 例えば 261 ならば、 ``ps 261'' を 実行し、それが何かを調べましょう。そして、そのプロセスが不要であれ ば、``kill 261'' で優しく kill してもいいでしょう。これで終了しないな ら、``kill -9 261'' を実行して強制的に kill してください。ただし、この 場合にはロックファイルが消されずに残るので、手で消す必要があるでしょ う。もちろん、261 のようなプロセスが存在しなければ単にロックファイルを 消してかまいません。しかし、ロックファイルが示すプロセス ID (261 等)が 無効であれば、多くの場合そのロックファイルは自動的に削除されるはずで す。 16.17. "/dev/ttyS?: Device or resource busy" モデムで電話をかけようとしたときにDCD あるいは DTR が正常に動作しない と、この問題が起こります。DCD は getty がポートを監視しているときでは なく、実際に回線がつながったとき(例えば誰かがダイヤルインしたとき)だけ ON になるべきです。接続時にだけ DCD を ON にするようモデムを設定してい るか、確かめてください。getty や kermit などの通信プログラムが回線を監 視しているなど、使用中はいつでも DTR は ON になっているべきです。 ``resource busy'' は多くの場合、(ttyS2 の場合)「他のデバイスが ttyS2 の割込みを使用中なので、ttyS2 を使うことはできません」という意味です。 ``setserial'' の設定による割込みの衝突の可能性があります。このエラー メッセージをもっと正確に言うと、「ttyS2 を使えません。setserial のデー タが、他のデバイスが ttyS2 の割込みを使っていると示しています」となる でしょう。 これには 2 つの可能性があります。ひとつは割込みが実際に衝突している場 合で、これは修正しなければなりません。しかし、setserial が誤った割込み を設定しているのなら、ttyS2 を使えない理由はないでしょう。ただし、衝突 を間違って伝えるような setserial は除きます。起動メッセージを見て、 ttyS2 が使用していると setserial が考えている割込みを知る必要がありま す (setserial はエラーメッセージ ``device busy'' を出すので、正常には 動作しないでしょう)。そして、この割込みを他のデバイスが使っていない か、あるいはハードウェアで設定している割込みと等しいかどうか、確かめて ください。 16.18. トラブル対処のためのツール トラブルに対処する時に使うとよいプログラムがいくつかあります: o ``lsof /dev/ttyS*'' は開いているシリアルポートを表示します。 o ``setserial'' は(ドライバが存在すると考えた)ポートの低レベルハード ウェア設定の表示と設定を行います。``setserial とは何ですか'' をご覧 ください。 o ``stty'' は (``setserial'' が扱う部分を除き) ポートを設定し、表示し ます。Serial-HOWTO の ``stty'' の節をご覧ください。 o ``modemstat'' と ``statserial'' は、モデムの各種信号線(DTR, CTS な ど)の現在の状態を表示します o ``irqtune'' を使えば、シリアルポートの割込みの優先度を上げて性能を 向上させることができます o ハードディスクのチューニングを行う ``hdparm'' もいくらか役に立つか もしれません o ``lspci'' は PCI バス上のハードウェアに実際に設定されている IRQ な どを表示します。 o ``pnpdump --dumpregs'' は ISA バス上の PnP デバイスについて、ハード ウェア中に実際に設定されている IRQ を表示します。 o /proc にある (ioports, interrupts などの) 「ファイル」。 17. フラシュメモリのアップグレード 多くのモデムでは、インターネットから手に入れたアップグレードプログラム を使い、フラッシュメモリ中にあるプログラムを入れ替えることができま す。PC からシリアルポートを通してモデムへこの「プログラム」を送り、こ のプログラムを(電源を切っても内容が消えない)不揮発性メモリに記憶しま す。たいていインストール説明書には Windows での方法が書いてあるので、 (Windows でアップグレードを行いたい場合を除き) どのようにして Linux で 同等の作業を行うのか理解する必要があります。モデムにプログラムを送るこ とを、ダウンロードと呼ぶこともあります。 HOWTO の最新バージョン(``この HOWTO の新しいバー ジョン'' をご覧くだ さい)でもこの依頼文が載っていたなら、他の人の役に立つのでアップグレー ドの体験談を著者まで送ってください。 アップグレードの一般的な考えをここに挙げます。次に来るデータはフラッ シュメモリのアップグレードデータだとモデムへ伝えるコマンドが、まず必要 になるでしょう。AT** コマンドがこれにあたります。(minicom のような)通 信プログラムを起動し、タイプしてください。モデムが存在するかどうか確か めるため、まず AT とタイプし、モデムは ``OK'' と応答します。 次に、モデムへ直接ファイル(ときには 2 つのファイル)を送る必要がありま す。(minicom のような)通信プログラムは、モデムへ(そしてモデムを越えて) ファイルを送るために、zmodem や kermit を使用することもあります。しか し、これらはファイルへへッダを追加してパケットにします。ファイルを変更 せずに正確にモデムへ送りたいのです。通信プログラム kermit には( kermit パケットを使わずに) ファイルを直接送る ``transmit'' コマンドがあるの で、これを使うことがファイルを直接送るひとつの方法です。minicom は 1998 年までこの機能を持っていませんでした。 ファイルを送るもうひとつの方法があります。通信プログラムから離れてシェ ルへ移行し (minicom では ^AJ)、(シリアルポートが ttyS2 の場合) cat upgrade_file_name > /dev/ttyS2 とタイプします。そして、(minicom のコ マンドプロンプトで fg とタイプして) 通信プログラムへ戻り、何が起きたの かを確認してください。 特定の Rockwell 社製モデムでの例を挙げます (C-a は ^A を表します): - minicom を起動する - AT** をタイプする : "Download initiated .." を得る - C-a J - cat FLASH.S37 > /dev/modem - fg : "Download flash code .." を得る - C-a J - cat 283P1722.S37 > /dev/modem - fg : "Device successfully programmed" を得る 18. 他の情報源 18.1. その他 o マニュアル : agetty(8), getty(1m), gettydefs(5), init(1), isapnp(8), login(1), mgetty(8), setserial(8) o (もしあるのなら)モデムのマニュアル。マニュアルのないモデムもありま す。 o Vern Hoxie さんによる Serial Suite は Linux のシリアルポートの扱 いに関する推薦品のコレクションで、いくつかの簡単なプログラムがあり ます。 o Linux のシリアルポートに関するメーリングリスト。参加するには、本文 に ``subscribe linux-serial'' と書いたメールを majordomo@vger.rutgers.edu へ送ってください。本文に ``help'' と書い てメールを出すと、ヘルプメッセージが届きます。 このサーバは Linux に関する多くのメーリングリストを提供しています。メーリングリスト一 覧を得る ``lists'' コマンドを送ってください。 18.2. 書籍 モデムに関する新しくて良い書籍を見つけられませんでした。 o Gilbert Held さんの The Complete Modem Reference, 1997. 時代遅れの 話題に関する多くの情報が載っています。インターネットでもっと新しい 情報が見つかるでしょう。 o Tina Rathbone さんの Modems For Dummies, 1996. (一度も見たことがあ りません) o Cass R. Lewart さんの Ultimate Modem Handbook, 1998. 18.3. HOWTO o Cable-Modem mini-howto o ISDN Howto (LDP の Howto ではありません) : ISDN 「モデム」のドラ イバ非常に関連のある情報が載っていますが、ドイツ語です。 o Modems-HOWTO: フランス語です。 (この Modem-HOWTO を書くために参考に していません) o NET-3-4-HOWTO: SLIP, CSLIP および PPP を含むネットワーク全般 o PPP-HOWTO: モデム設定を含む PPP のヘルプ o Serial-HOWTO には端末と集合モデム双方のために、マルチポートシリアル ボードを使用する情報が載っています。この HOWTO よりも詳細なシリアル ポートに関する記述があります。 o Serial-Programming-HOWTO: シリアルポートプログラミングの観点からの ものです。 o Text-Terminal-HOWTO: モデムとの接続に関する記述もあります。 o UUCP-HOWTO: UUCP 設定のための情報 [訳注 : JF プロジェクトによる日本語訳 Cable-Modem-mini-HOWTO , NET-3-HOWTO , PPP-HOWTO , Serial-HOWTO , Serial- Programming-HOWTO , Text-Terminal-HOWTO および UUCP-HOWTO ] 18.4. ニュースグループ o comp.os.linux.answers Linux に関する FAQ, How-To, README など o comp.os.linux.hardware Linux オペレーティングシステムでのハードウェ ア互換性について o comp.os.linux.setup Linux のインストールとシステム管理 o comp.dcom.modems すべての OS でのモデムの話題 [訳注 : 次のようなニュースグループがあります。 o fj.os.linux Linux 一般 o fj.os.linux.setup Linux のインストールおよび設定について o fj.os.linux.networking Linux のネットワークについて o fj.net.modems モデムについて o fj.net.modems.fax FAX モデムについて ] 18.5. Web サイト o Hayes AT モデムコマンド Technical Reference for Hayes (tm) Modem Users o Rockwell-based modem commands o Modem FAQs: Navas 28800 Modem FAQ o Curt's High Speed Modem Page o 56k モデムに関する多くの情報 56k Modem = v.Unreliable o Links to modem manufacturers o Identifying modems by FCC ID o Linux で動作する/しないモデムの不完全な一覧 modem list [訳注 : 周辺機器 に、シ リアルポートやモデムに関する情報へのリンク集があります。] 19. 付録 A: (技術的に)モデムがどのように動作するのか (未完成) 19.1. 変調の詳細 19.1.1. 変調の序論 この章では通常のモデムがどのようにして変調を行うのか、その手法を述べま す。``56k モデム (v.90)'' がときどき使用する、高速モデムが使う(係数変 換などの)手法については記述しません。しかし、56k モデムは以下に述べる 変調手法も使用しています。 変調とは (0 か 1 の)二進法で表現しているデジタル信号を、正弦波のような アナログ信号へ変換することです。情報を伝えるために調整された正弦波の 「キャリア」から、変調した信号はできあがっています。周波数と電圧を変更 していないキャリア正弦波は、(キャリアが存在するという事実を除き)全く情 報を伝達しません。情報を伝えるために、このキャリアを変更(あるいは変調) します。変調には 3 つの基本的な形式、周波数変調、振幅変調、そして位相 変調があります。次節で説明します。 19.1.2. 周波数変調 最も単純な変調方式は周波数変調です。周波数は正弦波が 1 秒間に何回周期 を成すかで測ります。それは 1 秒間に正弦波形が繰り返した回数です。これ は 1 秒間に最高値へ達した回数と同じです。「へルツ」(省略して Hz) は「1 秒間の周期数」の意味で使います。 周波数変調の簡単な例は、ある周波数が二進数の 0 を表し、それ以外が 1 を 表すものです。例えば、時代遅れの 300 ボーのモデムでは、1070 Hz は 0 を 表し、1270 Hz は 1 を表していました。これを「周波数移動方式」と呼びま す。たった 2 つの周波数ではなくより多くの周波数を使えば、更に多くの情 報を送信できます。(A, B, C そして D という) 4 つの異なる周波数があった なら、それぞれの周波数は 2 ビットを表現します。例えば、00 を送るために 周波数 A を用います。01 には B、10 には C、11 には D を使用します。同 様に、8 個の異なる周波数を用い、周波数シフト 1 回で 3 ビットを送ること ができます。使用する周波数の数を 2 倍にするごとに、送信できるビット数 は 1 ずつ増えます。 19.1.3. 振幅変調 上記の周波数変化 1 回で複数のビットが表現できる周波数変調の例を理解し たなら、振幅変調および位相変調とも簡単に理解できます。正弦波の周波数を 変更するのと似たように、振幅変調は正弦波の高さ(電圧)を変更します。単純 な場合では、ひとつが 0、もうひとつが 1 を表現するように 2 つの振幅を使 用します。周波数変調についての説明と同様に、より多くの振幅を用いれば 1 回の振幅変調でより多くの情報を送れるようになります。 19.1.4. 位相変調 正弦波の位相を変更するために、ある瞬間にそれ以前の正弦波の送信を止め、 すぐに同一の周波数と振幅の新しい正弦波を送り出します。古い正弦波の送信 を止めたときと同じ電圧レベル(そして勾配)で新しい正弦波を送り始めたな ら、位相に変化はありません(そして変化も検知できません)。しかし、正弦波 形の異なる点から、新しい正弦波を開始すると考えてください。すると、古い 正弦波を止めて新しい正弦波を開始する際、突然電圧が変化するでしょう。こ れが位相の変化であり、角度の単位「度」で測ります。0 度(あるいは 360 度)の位相変化は何も変化しないことを意味し、180 度の位相変化は正弦波の 電圧(と勾配)が逆転します。言い換えると、180 度の位相変化は送信の瞬間に 半周期 (180 度)だけとばします。もちろん、90 度や 135 度などの変調もで きます。周波数変調の例では、更に位相の変更も可能であり、1 回の位相変化 でより多くの情報を表現できます。 19.1.5. 複合変調 周波数変調、振幅変調、あるいは位相変調からひとつを選択するだけではな く、複数の変調方法を混用することもできるでしょう。256 の周波数があれ ば、1 回の変調で 1 バイト (8 ビット)を送れます(なぜなら、2 の 8 乗は 256 です)。また、256 の異なる振幅があれば、各々の変調で 1 バイトを表現 できます。更に、256 の位相が使える場合を考えてください。すると、やがて ある人が、周波数、振幅、そして位相の 3 種類の変調ができるかもしれない と、指摘するでしょう。これで一回の送信で 3 バイトを送れます。 現在、実際にこれを行っている変調方式はありません。3 種類の変化をすべて 検出するには比較的長い時間がかかり、現実的ではありません。位相の頻繁な 変化が、実際にはない周波数の変化を引き起こしてしまうのです。 この難点を避けるため、(周波数は変化させず)位相と振幅だけを同時に変化さ せる方法もあるでしょう。これを位相 - 振幅変調と呼びます(ときには Quadrature Amplitude Modulation = QAM と呼びます)。現在、この手法は 14.4k, 28.8k, そして 33.6k のモデムで一般的に使われています。現在、こ の変調手法を使っていない重要な例は 56k モデムです。しかし、56k モデム も PC から電話回線への方向ではもっぱら QAM (位相 - 振幅変調)を使用して います。回線の状態が良くないときは、逆方向も QAM に戻ります。このよう に、今でも QAM (位相 - 振幅変調)は通常の電話回線では最も広く使用され続 けています。 19.1.6. 56k モデム (v.90) 上に挙げた 33.6k モデムが使用する「変調」方式は、通常の位相 - 振幅変調 と完全に異なるわけではありません。一般的な通話は電話会社の市内局でデジ タル信号に変換されます。従って、通常の電話で送れる最高速度は、電話会社 が使うデジタル伝送部分と同じ速度になります。この速度はどのくらいなので しょうか? それはほぼ 64kbps です。64k ではあるのですが、同期の目的の ためときどきビットが「抜け落ち」ます。しかし、電話会社が回線はデジタル だと分かっているなら、情報の損失はないかもしれません。64k の場合を示 し、そしてなぜ本当の速度が低いのか説明します(56k かそれ以下 --たいてい かなり少ないです)。 通常の電話はデジタル音声を送るよう設計されたデジタル回線を使用してお り、絶対的な最高速度は 64k です。64k を使うためには、電話会社がアナロ グ信号をどのようにデジタル信号へ変換しているかを、モデムが正確に知らな ければなりません。この仕事は両側の端末がアナログインターフェイスだけし か持っていないと、非常に複雑になります。しかし、一方にデジタルインター フェイスがあるなら、(少なくとも一方向に関しては)可能になります。ISP に 電話会社へのデジタルインターフェイスがあるなら、ISP は PC へ向けて電話 回線を通じ一定のデジタルデータを送っても問題ありません。ISP からのデジ タル信号は PC に近い(恐らく自宅にも近い)市内局で、アナログ信号に変換さ れます。従って、もとのデジタル信号が何なのかを正確に見つけることが、あ なたのモデムの仕事になります。これができれば、(電話会社のデジタル信号 の速度である) 64k の送信がこの方向については可能になります。 アナログ信号をデジタルへ符号化するために、電話会社はどんな手法を使うの でしょうか? 電話会社はアナログ信号の振幅を毎秒 8000 回の割合で標本化 します。各々の標本化した振幅は 8 ビットの (ASCII に似た)バイトへ変換し ます(確認 : 8 x 8000 = 64k)。 この操作を「パルス符合変換 (Pulse Code Modulation)」 = PCM と呼びます。そして、このバイト列を電話会社のデジタ ル回路で送ります。この回路は「時分割多重」として知られている仕組みを 使って、複数の回線が一本の回路を共有しています。最後に自宅に近い電話局 でデジタル信号を分流し、PCM で作成したもとのデジタル信号と同じものを得 ます。この信号をアナログ信号に変換し、自宅まで送ります。各バイトはアナ ログ信号の特定の振幅を生成します。モデムの仕事は検出した振幅に基づい て、 PCM 信号 1 バイトを決定することです。 これは「振幅復調」の類ですが、本来の振幅復調というわけではありません。 キャリアがないので、振幅復調ではありません。正しくは、PCM の逆変換で 「係数変換」と呼びます。電話会社がアナログ信号生成に使ったもとのデジタ ル信号を決定するためには、アナログ信号を生成する際に、モデムは電話会社 と全く同じ瞬間にアナログ信号の振幅を標本化しなければなりません。これを 実現するため、アナログ電話回線を流れる残りの 4 kHz 信号から、同期信号 を生成します。自宅あるいは事務所へ 8k サンプル/秒 で送る信号列は、4kHz の信号を生成します。他のサンプルそれぞれが逆極性だと考えてみてくださ い。すると、4kHz の正弦波に似た波形ができあがります。ある意味、各々の サンプル点は 8 ビットを表現するシンボルであり、振幅を標本化することは 「シンボルタイミング」として知られています。 PCM 符号化は線型ではありません。振幅が小さい場合には、信号が大きい場合 と比べると、PCM の値が 1 増えてたとしてもアナログ信号の振幅は非常に小 さくしか増加しません。従って、振幅が小さいと、隣接したサンプル値と識別 することが難しくなります。その識別を容易にするために、非常に小さな振幅 になるような特定の PCM 符号は使用しません。これより、各々の振幅間でよ り大きな差を作ることができ、モデムは正確な振幅を容易に検出できるように なります。v.90 では使用できる振幅のうち半数を使いません。これは(各々の 振幅に割り当てた)それぞれのシンボルが、8 ビットではなく 7 ビットを表現 することと等価です。つまり、7 ビット/シンボル × 8k シンボル/秒 = 56k bps となります。もちろん、実際には各シンボルは 8 ビットで生成します。 しかし、使用可能な 256 バイトのうち 128 バイトのみを使用します。つま り、 8 ビット表現の 128 バイトを 7 ビット表現の 128 バイトへ変換する表 があるのです。 [訳注 : 電話網の PCM 符号化は対数圧縮(μ-law 圧縮)を使用するので、振幅 が小さい場合には量子化の間隔が小さくなります。] しかし、これは少々複雑です。回線の状態がそれほど良くなかったら、使用で きる振幅レベル数(シンボル数)がより少なくなり、転送速度は 56k を下回り ます。また、アメリカ合衆国政府の規則が電話回線に高出力を流すことを禁じ ているため大きな振幅を使用できず、``56k'' モデムなのに最高でも約 53.3k しか出なくなります。 電話回線網のデジタル回線部分は双方向であることに注意してください。この 2 つの回路は送受信それぞれについて、1 つづつ使用します。家庭や事務所か ら ISP への方向にはひとつのアナログ接続回路しかありません。この方向に は(53.3k ではなく)最大 36.6k の伝統的な位相振幅変調方式を使います。(こ こでは説明しませんが)高度なキャンセレーション手法により、同時に双方向 の通信を実現できます。 [訳注 : 通常、一対しかない電話線でデータの送受信を行います。そのまま受 信したのでは、受信信号中に送信信号が混入してしまいます。しかし、端末は 自身が送信した信号を知っているので、受信信号から自身が送信した信号を減 算します。すると、受信信号のみを取り出せます。このようにして、一対の電 話線で双方向の通信を行います。] 20. 付録 B: ``ボー'' と ``bps'' 20.1. 簡単な例 恐らく、コンピュータおよび電気通信の分野で、``ボー'' と ``bps'' は最も 誤用が多い単語のひとつです。多くの人がこの 2 つの単語は同じ意味だと考 えて使います。しかし、実際にはそうではありません! 単に、bps は 1 秒間 に転送するビット数です。ボーレートは 1 秒間に何回信号が変化するかを表 す尺度です。典型的なシリアルポートでは、1 のビットは -12 ボルトで、 0 のビットは +12 ボルトになります。38,400bps なら 010101... の連鎖は、電 圧が毎秒 38,400 回正負の間を往復するので、38,400 ボーになります。ま た、111000111... の連鎖では、連鎖中に 3 つの 1 があるので電圧は -12 ボ ルトに留まったままになるので、電圧変化はより少なくなるでしょう。この場 合でも、1 秒間に 38,400 回の電圧変化が可能なので、やはり 38,400 ボーに なります。 別の方法で考えてみましょう。(電圧が変化していないと思っても) 各ビット を区切る架空の記号を置いてみてください。38,400 ボーは 1 秒間に 38,400 個の記号が置けることを意味します。変化できる瞬間に存在するこの記号は、 実際にハードウェアの生成する同期信号が印を付けます。この同期信号は外部 に取り付けたケーブルには出ていきません。 前の例で挙げた(±12 ボルト) 2 種類の「変化」より、電圧が多くの種類に変 化できる場合を考えてみてください。判別可能な 4 種類の電圧に変化できる と仮定しましょう。各々の電圧は (01 のような) 2 ビットを表現できます。 例えば、- 12v は 00、-6v は 01、+6v は 10、そして +12v が 11 を表しま す。この例では、ビットレートがボーレートの 2 倍になります。毎秒 3000 回の変化がそれぞれ 2 ビットを生成すると、6000 bps になります。言い換え ると、3000 ボーが 6000 bps になります。 20.2. 実際の例 上に挙げた例は非常に簡単です。実際にはもっと複雑ですが、同じ考え方に基 づいています。2400 ボーで動作しているモデムが、どのようにして 14400 bps (あるいはそれ以上の)速度を出せるのか、ここで説明します。モデムは 1 回の変調(変化)で多くのビットを符号化することにより、ボーレートより高い ビットレートを出せます。従って、1 回の変調で 2 ビットあるいはそれ以上 のビットを符号化すると、ビットレートはボーレートの値を越えます。モデム 間の接続速度が 14400 bps だったなら、2400 ボーで一回の変調につき 6 ビットを送っています。28800 bps では、9 bit/ボー で 3200 ボーで動作し ています。ボーという単語を誤用する人は、(33.6K といった)モデム速度の意 味で使っているかもしれません。 以前はモデムのビットレートは 50, 75, 110, 300, 1200, 2400, そして 9600 bps でした。シリアルポートとモデム間のビットレートも同様でした。現在、 モデム間のビットレートは 14.4k, 28.8k, 33.6k, そして 56k です。しか し、シリアルポートとモデム間のビットレートは等しくはなく、19.2k, 38.4k, 57.6k, 115.2k になります。(最高 1/4 の圧縮を行う) V.42bis デー タ圧縮でモデムを使用すると、33.6k モデムでも 115.2kbps に達するビット レートが可能になります(56k モデムでは 230.4kbps が可能になります)。 56k モデムを除き、多くのモデムは 2400, 3000 あるいは 3200 ボーで動作し ます。音声品質の電話回線では帯域に限界があるため、2400 ボー以上のボー レートを出すのは難しく、回線品質が良いときだけ使用します。 ビットレートとボーレートの混同はどのようにして始まったのでしょうか? さて、旧式の低速モデムが高速モデムと呼ばれていた頃に戻ってみましょう。 ビットレートとボーレートは実際に等しかったのです。1 ビットはひとつの位 相変化で符号化していました。ビットレートもボーレートも同じ値だったの で、みんな bps とボーを区別なく使っていました。例えば、300 bps のモデ ムは 300 ボーでした。高速モデムが世に出たとき、大きな変化がありまし た。ビットレートがボーレートを上回ったのです。``ボー'' は非同期電報プ リンタを発明した Emile Baudot さんにちなんで名付けられました。この問題 を解決するひとつの方法は、「ボー」ではなく「シンボルレート(変調速度)」 を使うこと、そして「ボー」という単語の使用を避けることです。 21. 付録 C: 端末サーバ接続 この章は Text-Terminal-HOWTO を編集したものです。 端末サーバは多くのモデム(あるいは端末)を複数のコンピュータへ接続でき る、賢いスイッチのようなものです。これは機械的なスイッチではないので、 通過するデータの速度とプロトコルを変換できます。Xyplex, Cisco, 3Com, Computone, Livingston などの、多くの企業が端末サーバを作っています。多 くの種類と特性を持つがあります。(Linux PC で自分のターミナルサーバを作 る可能性を含み) 他の HOWTO にはそれらの比較と説明をする必要がありま す。多くの人は直接端末へ接続するよりも、モデムを用いて接続しています。 端末サーバの使用法のひとつは、ホストコンピュータに接続する高速ネット ワークへ多くのモデムを接続することです。もちろん、端末サーバには高い演 算能力とネットワークプロトコルを動作させるソフトウェアが必要です。端末 サーバはユーザと互いに会話し、どのコンピュータと接続するかなどを尋ねま す。あるいは、何も尋ねずに接続するかもしれません。端末サーバを通じて、 プリンタへ印刷ジョブを送る人もいるでしょう。 現在、各シリアルポートにハードウェア割込みが必要なことを除いて、PC は ターミナルサーバを務めるには充分な演算能力を持っています。PC には追加 するシリアルポート用の予備の割込みが 2-3 しかありません。そして、ソフ トウェアではハードウェアの割込みを作れません。その解決法は、自分自身に 割込みを持っている上等なマルチポートシリアルボードを使用することです。 (また、安いモデルでは、複数のポートが PC のひとつの割込みを共有してい ます。) 詳細は Serial-HOWTO をご覧ください。こういった PC 上で Linux が動作し、多くのシリアルポートで getty が動いていたなら、端末サーバと 考えることができるでしょう。ネットワークを通じて他の PC と接続したり、 データを通過させ 14 バイト毎などにシリアルポートの割込みを処理するな ら、事実上端末サーバになります。``radius'' というソフトウェアを使用す ることもあります。 現在、実際の端末サーバはただの端末以上のサービスを提供します。端末をエ ミュレートする PC にサービスを提供したり、ときには電話回線につないだ集 合モデムと接続します。モデムを内蔵したものさえあります。端末(あるいは PC がエミュレートする端末)が直接モデムに接続しているなら、回線の反対側 にあるモデムは端末サーバへ接続できます。テキスト端末が生成しない PPP パケットを、端末サーバがデフォルトで待ち受けていることもあります。 [訳注 : JF プロジェクトによる日本語訳 Text-Terminal-HOWTO , Serial- HOWTO ] 22. 付録 D: 他の種類のモデム 現時点では、この HOWTO は通常のアナログ電話回線でPC を接続するために使 う、一般的なタイプのモデムしか扱っていません。他にもモデムにはいろいろ な種類があります。モデムと呼ぶものの実際にはモデムではないものもありま す。 22.1. デジタル「モデム」 モデムの標準的な定義は、場合によっては「デジタル」モデムを含むまでに拡 張されます。現在、デジタル接続サービスが多くの家庭や事務所に提供され、 コンピュータは電話回線にデジタル信号を直接送り出せます。しかし、コン ピュータのデジタル信号を、電話回線が許容する形式へ変換する装置が必要で す。ときにはこの装置はモデムと呼ばれます。この HOWTO ではこういったモ デムは扱いませんが、この HOWTO の最初にリンクを載せています。次の 3 つ の節は ISDN, DSL および 56k のデジタル接続「モデム」についての解説で す。 22.2. ISDN 「モデム」 この「モデム」は正しくはターミナルアダプタ (TA) です。Debian の ``isdnutils'' パッケージが利用できます。ドイツ語の ISDN HOWTO が英語に 翻訳され、 にありま す。Linux の SuSE ディストリビューションがこれを公開しており、恐らく SuSE で使えるドライバに関するものです。isdn4linux パッケージとニュース グループ de.alt.comm.isdn4linux があります。投稿の多くはドイツ語です。 (DejaNews のような)サーチエンジンで、``isdn4linux'' をキーワードにして 探してみてください。 22.3. デジタル加入者線 (Digital Subscriber Line = DSL) DSL は自宅から最寄りの電話局まで、既存のより対導線を使います。(56k の) 通常のモデムがよりも高速の送信を電話回線が許容するなら、DSL を使えま す。近くの電話局にあるアナログ-デジタルコンバータを、より高速でデータ 転送が可能なコンバータへ置き換えます(もちろん、送信形式は異なります)。 コンピュータのデジタルデータを電話回線で使用するデジタル信号へ変換する 装置もまた、モデムと呼びます。 [訳注 : デジタル加入者線 (ADSL) の HOWTO があります。JF プロジェクトに よる日本語訳 ADSL-HOWTO ] 22.4. 56k デジタルモデム 家庭や事務所で動いている 56k モデムに対向するモデムはすべて、電話会社 のデジタルシステムへ直接接続していなければいけません。従って、回線のも う一端にある ISP は、顧客へ 56k サービスを提供する特別なデジタルモデム を入手する必要があります。それに加えて、(T1, E1, ISDN PRI あるいはより 高速な) 同時に多数の回線を提供できる高速回線へ集合モデムで多重化しま す。これにはコンセントレータや「リモートアクセスサーバ」が必要です。た いてい、(PC ににているけれど非常に効果で専用の OS を使う) スタンドア ローンの装置がこの役割を果たしていました。現在は、PC の PCI バスに挿し て同様な処理を行う、いくつかのボードがあります。 22.5. 専用線モデム これはデジタルモデムではなく、アナログモデムです。この特別なモデムは電 話会社から借りあげた回線で使用します。場合によっては長距離接続を行いま す。通常の公衆回線用モデムは、こういった回線では正常に動作しません。通 常の回線では、使用していないときには約 40〜50 ボルトの電圧がかかってい て、モデムは送信にこの電圧を用います。そして、電話会社には着信や通話中 などを知らせる特別な制御信号があります。通常のモデムはこの制御信号を待 ち受けて、応答します。長距離回線には制御信号がないので、こういったモデ ムを 2 つ接続しても動作しません。 通常の専用線は 9600 ボーで V.29 を使用する、(各方向に 1 本づつ使う) 4 線式の回線です。他社のモデムと互換性のない専用線モデムもあります。 [訳注 : 専用線に関する mini-HOWTO があります。JF プロジェクトによる日 本語訳 Leased-Line mini-HOWTO ] 23. 日本語訳について 日本語訳は Linux Japanese FAQ Project において行いました。翻訳に関する ご意見は JF プロジェクト 宛に連絡してください。 改訂履歴を以下に示します。 v0.08j, 23 Jan. 2000 翻訳 : さいとうかん