シリアルコンソール
デスクトップPCであれノートPCであれ、操作にはキーボードを使いますし、入出力の確認にはディスプレイを使います。しかし、デバイスによってはキーボードを接続するポートも、VGAポートも付いておらず、それらを接続するための拡張バスも用意されていないものがあります。
そういったデバイスではシリアルコンソールが提供されていることが多く、シリアルコンソール経由でシステムを起動し、そして操作します。たとえばルータとして使うような小型のロジックボードや組込み機器として使うようなロジックボードにはVGAポートやUSBポートが付いていないものがあります。こうしたマシンにはシリアルケーブルを接続して、ほかのマシンからログインや操作を行います。
組込み機器のみならず、ラックマウントサーバでもシリアルコンソールを使うことがあります。通常、ラックマウントサーバはデータセンターに設置され、基本的に遠隔から操作することになります。こうなると、サーバに何か問題が発生してssh(1)経由でアクセスできなくなると、データセンターまで物理的に足を運ぶ必要がでてきます。ここで利用できるのがシリアルコンソールです。
配置と接続方法はさまざまですが、たとえばラックマウントサーバを相互にシリアルコンソールで接続しておきます。あるマシンにssh(1)でログインできなくなったら、シリアルコンソールが接続されているもう1台のマシンにssh(1)でログインします。そこからシリアルコンソール経由で問題となっているマシンにアクセスして、再起動なり問題の解決などの操作を行うといったものです。
コンシューマ向けのPCにはもうシリアルコンソールが付いていないことが多いので普段さわることは少ないと思いますが、方法を知っておくと何かと使えますので、今回はシリアルコンソール経由でシステムを起動したり、システムにログインする方法を紹介します。
アクセスされる側の設定
アクセスされる側の設定として、シリアルの通信速度(ボーレート(変調速度) )とポート番号を知る必要があります。通信速度はマニュアルやBIOSの設定などから拾ってください。ポート番号は、たとえば次のように起動時に出力されるメッセージや、devinfo(8)コマンドで出力される内容から知ることができます。
図1 起動時のログをチェック
# grep uart /var/run/dmesg.boot
uart0 : < 16550 or compatible > port 0x3f8 - 0x3ff irq 4 flags 0x10 on acpi0
uart1 : < 16550 or compatible > port 0x2f8 - 0x2ff irq 3 on acpi0
#
図2 devinfo(8)でデバイス情報をチェック
# devinfo -u | grep uart
0x3 ( uart1 )
0x4 ( uart0 )
0x2f8 - 0x2ff ( uart1 )
0x3f8 - 0x3ff ( uart0 )
#
uart(4)がシリアルに対応したデバイスドライバです。例に取り上げたマシンではCOM2に相当するシリアルを使うので、ここではuart1を使います。COM1に対応するのがuart0、COM2に対応するのがuart1です。uart1のポート番号のはじまりの値に注目してください。今回のケースでは「0x2f8」がポート番号です。この値は製品ごと(大抵はメーカごと)に異なります。
16進数で出力されているので、これを10進数に変換しておきます。どうやって変換してもよいのですが、Google検索のついでに変換してしまうのが簡単でしょう。「 0x2f8 in decimal」のように検索すると変換後の値が出力されます。
図3 16進数を10進数へ変更
コマンドで変換するならprintf(1)を使うとか、やり方はいろいろあります。
図4 printf(1)で16進数を10進数へ変換
# printf "%d\n" 0x2f8
760
#
ブート時の出力をVGAにもシリアルコンソールにも流す場合には、/boot/loader.confに次のような設定を追加します。ポート番号と通信速度は適宜状況に合わせて書き換えてください。
リスト1 /boot/loader.confの設定(VGAコンソール/シリアルコンソール両用版)
boot_multicons = "YES"
console = "comconsole,vidconsole"
comconsole_port = "760"
comconsole_speed = "115200"
そもそもVGAが提供されていないとか、シリアルコンソールしか使わないといった場合には次のように設定します。
リスト2 /boot/loader.confの設定(シリアルコンソールのみ使用版)
boot_serial = "YES"
console = "comconsole"
comconsole_port = "760"
comconsole_speed = "115200"
最後に/etc/ttysのttyu1のエントリを次のように書き換えます。std.115200の数字の部分が通信速度になっていますので、状況に応じて書き換えてください。
リスト3 /etc/ttysファイルの変更部分
ttyu1 "/usr/libexec/getty std.115200" xterm on secure
シリアルの設定はマシンによってはBIOSやUEFIで設定しないと使えないものがありますので、まず最初にそちらの設定を確認しておきましょう。
アクセスする側
シリアル経由でアクセスする方法はいくつかありますが、cu(1)コマンドを使うのが簡単でしょう。次のように通信速度と対応するシリアルを指定して接続します。cuau0がuart0に対応しています。
図5 cu(1)コマンドでアクセス
# cu -s 115200 -l /dev/cuau0
シリアルポートが存在しないPCの場合、USBシリアルケーブルなどを使うことでアクセスできるようになります。USBシリアルケーブルを接続すると/dev/cuaU0といったデバイスが生えてきますので、これを指定して通信します。
図6 USBシリアルケーブルを使った場合
# cu -s 115200 -l /dev/cuaU0
MacBook ProにVMware FusionをインストールしてそこにFreeBSDをゲストオペレーティングシステムとしてインストールしてある場合などは、MacBookに接続したUSBシリアルケーブルをゲストOS側に向けることで、ゲストのFreeBSDからシリアル通信できるようになります。
接続を切る場合には「~.」と入力します。うまく接続が切れない場合には、何度かリターンキーを押してから「~.」と入力します。と入力します。
ネットワーク経由でシリアル接続する方法
BMC(Baseboard Management Controller)を搭載したマシンの場合、直接シリアルケーブルで接続しなくても、ネットワーク経由でシリアル接続と同じ操作をすることができます(SoL:Serial On LAN) 。まず、BIOSやUEFI、またはBMCの専用設定画面からSoLを設定します。
ipmitool(sysutils/ipmitool)をインストールして、次のようにコマンドを実行します。
図7 ipmitool(1)を使ってSoLアクセス
# ipmitool -I lanplus -H アドレス -U ユーザ -P パスワード sol activate
BMCが搭載されているマシンの場合には、直接シリアル接続するよりも、SoLを使って管理することの方が多いでしょう。接続を切る方法はこちらも同じで「~.」と入力します。