19.6. シリアルコンソールの設定

寄稿: Kazutaka YOKOTA. 原作: Bill Paul.

19.6.1. 導入

FreeBSD は、 コンソールとしてシリアルポート上のダム端末しか持たないシステムでも起動します。 この様な構成はきっと次のような二種類の人達に便利でしょう。それは、 キーボードやモニタのないマシンに FreeBSD をインストールしたいシステム管理者と、 カーネルやデバイスドライバをデバッグしたい開発者です。

第13章 で説明されているように、 FreeBSD は 3 ステージ構成のブートストラップを用いています。 最初の 2 つのステージは、 ブートディスクにある FreeBSD スライスの最初に格納されている、 ブートブロックのコードが行います。 それからブートブロックは、第 3 ステージのコードとしてブートローダ (/boot/loader) を読み込み、実行します。

シリアルコンソールを設定するためには、ブートブロックコード、 ブートローダコード、カーネルを設定する必要があります。

19.6.2. シリアルコンソールの設定

  1. シリアルケーブルを用意してください。

    ヌルモデムケーブル、 もしくは標準シリアルケーブルとヌルモデムアダプタが必要となります。 シリアルケーブルについては 項19.2.2 をご覧ください。

  2. キーボードをはずして下さい。

    たいていの PC システムは Power-On Self-Test (POST) の間にキーボードを検出し、もし見つからなければエラーと なります。また、キーボードがないことを大きな音で知らせ、 キーボードが接続されるまでは起動を中断するようなマシンもあります。

    コンピュータがエラーを表示していても、 とにかく起動するなら特別な対応は必要ありません (Phoenix BIOS を搭載しているマシンには、 “Keyboard failed” と表示されても、正常に起動するものがあります)。

    あなたのコンピュータがキーボードを接続していない状態で 起動しないようなら、(もし可能ならば) エラーを無視するように BIOS を設定する必要があります。設定方法の詳細については、 マザーボードのマニュアルを調べてください。

    ティップ: BIOS の設定でキーボードを “Not installed” にするということは、キーボードを使えないということを 意味しているわけではありません。これは、BIOS がキーボードがなくても文句を言わないように、電源投入時には キーボードを探すな、と指示するだけです。このフラグを “Not installed” にしていてもキーボードを 接続したままにできますし、ちゃんと動作します。

    注意: あなたのシステムが PS/2 マウスを使っているなら、 おそらくマウスもキーボード同様にはずす必要があるでしょう。 というのは、PS/2 マウスは部分的にキーボードとハードウェアを 共有しており、マウスを接続したままにしていると、 キーボードも存在する、と誤って検出してしまう可能性があるからです。 AMI BIOS を持つ Gateway 2000 Pentium 90MHz システム はこれに該当すると言われています。 一般的にこれは問題ではありません。なぜなら、どっちにしても マウスはキーボードなしではたいして役に立たないからです。

  3. COM1 (sio0) にダム端末を接続してください。

    ダム端末がなければ、かわりに古い PC/XT でモデム プログラムを走らせて使ったり、シリアルポートに他の Unix マシンを繋いだりできます。もしも COM1 (sio0) がなければ、作成してください。 今のところ、COM1 以外のポートを 選択するためにはブートブロックの再コンパイルが必要です。 すでに COM1 を他の装置に 使っていた場合は、一時的にその装置をはずして いったん FreeBSD がうまく動作してから、 新しいブートブロックとカーネルをインストールしてください。 (上記はとにかくファイル/演算/端末サーバの COM1 が利用可能であると仮定して います。あなたが本当に何かのために COM1 が必要 (で、なおかつその何かを COM2 (sio1) に付け替えることができない) ならば、多分、そもそも 悩んでる場合ではありません。)

  4. カーネルコンフィグファイルの COM1 (sio0) に適切なフラグを 設定していることを確認してください。

    関連するフラグ:

    0x10

    このポートのコンソールサポートを有効にします。 このフラグが設定されない場合、他のフラグは無視されます。 現在のところ、一つのポートしかコンソールサポートを有効に できません。(config ファイルに書かれた順番で) 最初にこのフラグを 指定されたポートが選択されます。 なお、このオプションを指定するだけでシリアルポートが コンソールとして使えるわけではありません。 このフラグと一緒に、以下のフラグも指定するかもしくは -h オプションも使ってください。

    0x20

    後述される -h オプション を無視して、(他に優先度の高いコンソールがない限り) このポートをコンソールとして指定します。 このフラグは FreeBSD バージョン 2.XCOMCONSOLE オプションに対応するものです。 フラグ 0x20 は必ず フラグ 0x10 と一緒に指定されなければなりません。

    0x40

    (0x10 と組み合わせることで) このポートを予約し、通常のアクセスができない ようにします。 このフラグは、シリアルコンソールとして使いたいポートに 指定すべきではありません。 唯一の使い道は、ユニットがカーネルのリモートデバッグ用 であることを指定することです。 リモートデバッグの詳細については The Developer's Handbook を参照してください。

    注意: FreeBSD 4.0 以降では、 フラグ 0x40 の意味が若干異なり、 シリアルポートにリモートデバッグを指定するためには、 別のフラグを使います。

    例:

    device sio0 at isa? port "IO_COM1" tty flags 0x10 irq 4
    

    詳細については sio(4) のマニュアルを参照してください。

    もしこれらのフラグがセットされていなければ、(別のコンソールで) UserConfig を実行するか、 カーネルを再コンパイルする必要があります。

  5. ブートドライブの a パーティションの ルートディレクトリに boot.config を作成してください。

    このファイルは、ブートブロックコードに対してどのように システムを起動したいかを教えます。 シリアルコンソールを活かすためには、以下のオプションを幾つか — 複数の場合も一行で、設定する必要があります:

    -h

    内蔵コンソールとシリアルコンソールの切替えを行います。 これを使用してコンソールデバイスを変更できます。 例えば、内蔵 (ビデオ) コンソールからブートした場合、 カーネルとブートローダがコンソールデバイスとして シリアルポートを使用するようにするため、 -h を使って指示できます。 反対に、シリアルポートからブートした場合、 ブートローダとカーネルがコンソールとして代わりに ビデオディスプレイを使用するようにするため、 -h を使用できます。

    -D

    シングルとデュアルのコンソール設定を切り替えます。 シングル設定では、上記の -h オプションの状態によって、コンソールは内蔵コンソール (ビデオディスプレイ)かシリアルポートのいずれかになります。 デュアルコンソール設定では、ビデオディスプレイと シリアルポートの両方が、-h オプションの状態によらず、同時にコンソールになります。 しかし、デュアルコンソール設定は、ブートブロックが 実行されている間でしか効果を持ちません。 一旦ブートローダに制御が移ると、-h オプションによって指定されたコンソールが 唯一のコンソールになります。

    -P

    ブートブロックがキーボードを検出するようにします。 キーボードが発見できなかった場合には、 -D-h オプションが自動的にセットされます。

    注意: 現バージョンのブートブロックでは容量の制限により、 -P オプションは拡張キーボードしか 検出できません。キーが 101 個より少ない (そして F11 と F12 がない) キーボードは検出されない可能性があります。 この制限から、いくつかのラップトップコンピュータの キーボードは正しく検出されないでしょう。 もし、あなたのシステムがこのようなキーボードを使っているのであれば、 -P オプションを外してください。 残念ながら、この問題の回避策はありません。

    -P オプションを使ってコンソールを 自動的に選ぶか、-h オプションを使って シリアルコンソールを有効にしてください。

    さらに boot(8) で説明されている他のオプションも使う ことができます。

    -P 以外のオプションはブートローダ (/boot/loader) に渡されます。 ブートローダは、-h オプションだけの状態を 調べることで内蔵ビデオとシリアルポートのどちらがコンソールに なるのか決めます。 つまり、/boot.config の中で -D オプションを指定して -h オプションを指定しなかった場合、 ブートブロック実行中でのみシリアルポートをコンソールとして 使うことができます。ブートローダは内蔵ビデオディスプレイを コンソールとして使います。

  6. マシンを起動する。

    FreeBSD を起動したとき、ブートブロックは /boot.config の内容をコンソールに表示 します。例えば、

    /boot.config: -P
    Keyboard: no
    

    行の二番目は、 /boot.config にオプション -P が指定してあるときだけ表示され、 キーボードが存在するかどうかを表します。 これらのメッセージは、シリアルか内蔵のいずれか、 あるいはその両方のコンソールに表示されます。 どちらに表示されるかは、 /boot.config の設定によって変わります。

    オプション指定 メッセージの表示される場所
    なし 内蔵
    -h シリアル
    -D シリアルと内蔵の両方
    -Dh シリアルと内蔵の両方
    -P、キーボードが存在する場合 内蔵
    -P、キーボードが存在しない場合 シリアル

    このメッセージが表示された後、 ブートブロックがブートローダのロードを再開し、 他の全てのメッセージがコンソールに表示されるまで、 若干時間がかかります。通常の環境では、ブートブロックに 割り込みをかける必要はありませんが、 ちゃんとセットアップされているかどうか確かめるために、 割り込みをかけることができるようになっています。

    ブートプロセスに割り込みをかけるには、 コンソールの (Enter 以外の) キーをたたいて下さい。 ブートブロックはその時、操作を指定するためのプロンプトを表示します。 こんな風に表示されるでしょう。

    >> FreeBSD/i386 BOOT
    Default: 0:wd(0,a)/boot/loader
    boot:
    

    上に示したメッセージが、シリアルか内蔵、 あるいはその両方といった、/boot.config で指定したとおりのコンソールに表示されることを確認して下さい。 メッセージが正しいコンソールに表示されたら、 Enter キーを押してブートプロセスを継続してください。

    もし、シリアルコンソールを利用するように設定しているのに シリアル端末にプロンプトが出てこない場合は、 設定のどこかに間違いがあります。 ブートブロック(とブートローダ、カーネル)に対して シリアルポートをコンソールに使うことを伝えるため、 割り込みをかけた時に -h を入力し、 (可能ならば) Enter/Return キーを押して下さい。そして、 一度システムを起動させてから、どこが悪いのかをチェックして下さい。

ブートローダがロードされ、ブートプロセスの第三ステージに いる時には、まだ内蔵コンソールとシリアルコンソールを切り替えることができます。 それにはブートローダの環境変数を適切に設定すれは良いのですが、 詳細については 項19.6.5 を参照してください。

19.6.3. まとめ

このセクションで扱ったさまざまな設定と、 最終的に選択されるコンソールに関するまとめです。

19.6.3.1. Case 1: sio0 の flags に 0x10 をセットした場合

device sio0 at isa? port "IO_COM1" tty flags 0x10 irq 4
/boot.config 内のオプション ブートブロック実行中のコンソール ブートローダ実行中のコンソール カーネルのコンソール
なし 内蔵 内蔵 内蔵
-h シリアル シリアル シリアル
-D 内蔵、シリアルの両方 内蔵 内蔵
-Dh 内蔵、シリアルの両方 シリアル シリアル
-P、キーボードが存在する場合 内蔵 内蔵 内蔵
-P、キーボードが存在しない場合 内蔵、シリアルの両方 シリアル シリアル

19.6.3.2. Case 2: sio0 の flags に 0x30 をセットした場合

device sio0 at isa? port "IO_COM1" tty flags 0x30 irq 4
/boot.config 内のオプション ブートブロック実行中のコンソール ブートローダ実行中のコンソール カーネルのコンソール
なし 内蔵 内蔵 シリアル
-h シリアル シリアル シリアル
-D 内蔵、シリアルの両方 内蔵 シリアル
-Dh 内蔵、シリアルの両方 シリアル シリアル
-P、キーボードが存在する場合 内蔵 内蔵 シリアル
-P、キーボードが存在しない場合 内蔵、シリアルの両方 シリアル シリアル

19.6.4. シリアルコンソールを利用する上で役に立つ情報

19.6.4.1. シリアルポートの通信速度をもっと速いものに設定するには

デフォルトのシリアルポート通信速度は、9600 ボー、 8 ビット、パリティなし、ストップビット 1 です。 通信速度を変更したい場合には、少なくとも ブートブロックの再コンパイルが必要になります。 /etc/make.conf に次のような行を追加して、 新しくブートブロックをコンパイルして下さい。

BOOT_COMCONSOLE_SPEED=19200

もし、シリアルコンソールがブート時の -h オプション以外の方法で設定されていたり、 カーネルが利用するシリアルコンソールが ブートブロック実行中のものと異なる場合には、 カーネルコンフィグレーションファイルに次のオプションを追加して、 新しくカーネルをコンパイルしなければなりません。

options CONSPEED=19200

19.6.4.2. sio0 以外のシリアルポートを コンソールとして使うには

sio0 以外のポートをコンソールとして使うには、再コンパイルが必要です。 それがどんな理由であれ、他のポートを使用する場合には ブートブロック、ブートローダ、カーネルを 次のようにして再コンパイルして下さい。

  1. カーネルソースを取得する (第18章 をご覧ください)。

  2. /etc/make.conf を編集し、 BOOT_COMCONSOLE_PORT に 使用したいポートのアドレス(0x3F8、0x2F8、0x3E8 or 0x2E8)を 設定してください。使用可能なのは sio0 から sio3 (COM1 から COM4) までで、 マルチポートシリアルカードは使えません。 また、ここで割り込みの設定をする必要はありません。

  3. 設定を変更するために新たなカーネルコンフィグレーションファイルを作成し、 使いたいシリアルポートのフラグを適切に設定します。 例えば、sio1 (COM2) をコンソールにしたければ、

    device sio1 at isa? port "IO_COM2" tty flags 0x10 irq 3
    

    または、

    device sio1 at isa? port "IO_COM2" tty flags 0x30 irq 3
    

    とします。その際、 他のシリアルポートにコンソールフラグをつけてはいけません。

  4. ブートブロックを再コンパイルし、インストールする。

    # cd /sys/boot/i386/boot2
    # make
    # make install
    
  5. ブートローダを再コンパイルし、インストールする。

    # cd /sys/boot/i386/loader
    # make
    # make install
    
  6. カーネルを再構築し、インストールする。

  7. disklabel(8) を使ってブートブロックをブートディスクに書き込み、 新しいカーネルから起動する。

19.6.4.3. シリアルポートから DDB デバッガを起動するには

シリアルコンソールからカーネルデバッガを起動したい(これは リモートで診断する際に便利ですが、もしおかしな BREAK 信号がシリアルポートに送られるような場合には危険です!) 場合には、次のオプションを使ってカーネルをコンパイルして下さい。

options BREAK_TO_DEBUGGER
options DDB

19.6.4.4. シリアルコンソールにログインプロンプトを表示させるには

シリアルコンソールからブートメッセージを確認したり、 シリアルコンソールを経由してカーネルデバッグセッションに入ることが できるので、これは必要がないかもしれませんが、 login プロンプトをシリアルポートに 出力するように設定することもできます。 これには、次のようにします。

エディタで /etc/ttys というファイルを開き、 次に示す行に移動して下さい。

ttyd0 "/usr/libexec/getty std.9600" unknown off secure
ttyd1 "/usr/libexec/getty std.9600" unknown off secure
ttyd2 "/usr/libexec/getty std.9600" unknown off secure
ttyd3 "/usr/libexec/getty std.9600" unknown off secure

ttyd0 から ttyd3 は、 COM1 から COM4 に対応しています。 設定したいポートの offon に変更して下さい。 また、もしシリアルポートの通信速度を変更しているなら、 std.9600 が実際の通信速度になるように、 例えば std.19200 のように変更して下さい。

さらに、実際のシリアル端末に合わせて、 端末タイプを unknown から変更することも可能です。

ファイルの編集が終了したら、 変更を有効化するために kill -HUP 1 を実行しなければなりません。

19.6.5. ブートローダからコンソールを変更するには

前セクションは、ブートブロックの設定を変更することでシリアルコンソールを セットアップする方法について解説していました。 このセクションでは、ブートローダへのコマンド入力と環境変数設定で コンソールの指定を行なう方法を紹介します。 ブートローダがブートブロックの後、 ブートプロセスの第三ステージで呼び出されたとき、 ブートローダの設定には、ブートブロックの設定がそのまま使われます。

19.6.5.1. シリアルコンソールをセットアップする

ブートローダとカーネルに対して シリアルコンソールを使用するように設定するには、 単に /boot/loader.rc のファイルに、次のような一行を書くだけで実現できます。

set console=comconsole

これは、前セクションで扱ったブートブロックの設定に 全く関係なく機能します。

上に示した行は、 /boot/loader.rc の最初の行に書き込まなくてはいけません。 これはできるだけ早く、ブートメッセージをシリアルコンソールに 出力させるために必要なことです。

同様にして、次のように内蔵コンソールを指定することもできます。

set console=vidconsole

もし、ブートローダの環境変数 console が設定されていない場合、 ブートローダ、そしてその次に起動するカーネルは ブートブロックで指定された -h オプションに 示されたコンソールを使用します。

3.2 以降のバージョンにおいては /boot/loader.rc ではなく、 /boot/loader.conf.local/boot/loader.conf にコンソール指定を書き込みます。 その場合、 /boot/loader.rc は次のようになっていなければなりません。

include /boot/loader.4th
start

それから、/boot/loader.conf.local を作成して、次の行をそこに追加して下さい。

console=comconsole

か、もしくは

console=vidconsole

です。詳細については、loader.conf(5) を参照して下さい。

注意: その際、ブートローダはオプション指定なし (ブートブロックに -P オプションが指定されたのと等価)になり、 キーボードの存在を調べて 内蔵コンソールとシリアルコンソールを自動的に選択する機能は働きません。

19.6.5.2. sio0 以外のシリアルポートを コンソールとして使うには

sio0 以外のシリアルポートを コンソールとして使うには、ブートローダを再コンパイルする必要があります。 それには、 項19.6.4.2 に書かれている説明にしたがって下さい。

19.6.6. 注意

シリアルコンソールというアイデアは、 グラフィック出力用のハードウェアやキーボードが接続されていない 専用サーバのセットアップを可能にするためのものです。 ほとんどのシステムはキーボードなしで起動できますが、 不幸にも、グラフィックアダプタなしでは起動できないシステムはたくさんあります。 AMI BIOS を採用しているマシンでは、CMOS 設定の `graphics adapter' を `Not Installed' にするだけで、 グラフィックアダプタがなくとも起動できるように設定することができます。

しかしながら、多くのマシンはこのようなオプションを持っていませんし、 ディスプレイハードウェアがシステムに存在しないと起動しないように なっています。そのようなマシンでは、 モニタを接続する必要がなかったとしても、 適当なグラフィックカード(モノクロのジャンク品でも構いません)を 挿入したままにしておく必要があるでしょう。 また、AMI BIOS をインストールする、という手もあります。

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

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