Show page source of ExpressScopeHowTo_3p1 #10826

EXPRESSSCOPEを使う[応用編1]

Serial over LANを設定する

iモデルに搭載されているBMC(Baseboard Management Controller)のEXPRESSSCOPEはIPMI 2.0に対応しています。このIPMI 2.0には数々の新機能が加えられているのですが、その中でも利便性の高いものがSerial over LAN(SoL)です。これは、IPネットワーク経由でシリアルコンソールへのアクセスを提供する機能です。今回はこの機能を利用して、リモートからサーバにアクセスするための設定について解説します。

=== SoLの効用

さて、「IPネットワーク経由でシリアルコンソールへのアクセスを提供する機能」と言われても、シリアルコンソールを使ったことがない方は、それを設定することでどんなメリットが得られるのかイメージできないかもしれません。そこで簡単にSoLについて説明しておきましょう。

まず、シリアルコンソールですが、これを設定するとサーバとシリアルケーブルで接続した管理ホストの端末とキーボードが、サーバに直接接続したモニタ/キーボードの代わりに利用できるようになります。シリアルコンソールは低レベルの入出力機能を使っているので、OSが起動する前の状態、たとえばBIOS設定の確認/変更なども行えます。ただし、シリアルケーブルにはケーブル長の制限がありますし、多数のサーバで利用する場合は高価なシリアルスイッチも必要になります(※)。そこでシリアルコンソールをネットワーク経由で利用できるようにするものとしてSoLが開発されたのです。

※ サーバ同士をシリアルケーブルで接続することでシリアルスイッチを省くこともできますが、どのサーバとどのサーバが接続されているのかを把握しておく必要があるので、管理が面倒になります。

SoLを設定しておくと、上記のようにBIOS設定がリモートから行えるほか、カーネルのブートメッセージなども見ることができるので、たとえば、新しいカーネルを入れたらOSが起動しなくなったというような場合でも、ブートメッセージを見ながらどこで止まっているのか調べることができます。LinuxのリモートメンテナンスではSSHが広く利用されていますが、これらの作業はOS上で動作するSSHでは不可能です。OpenSSHおよびOpenSSLには過去に何度かセキュリティホールが発見されているので、メンテナンス作業をSoLで行うことにすれば、SSHサービスを止めてしまうこともできます。

=== 検証環境と作業の流れ

次に、検証環境について書いておきます。使用したサーバは今回も「[product_i110Rc-1h Express5800/i110Rc-1h]」(以下、i110Rc-1h)です。OSはUbuntu 7.10のサーバ版(32ビット)をインストールしてあり、IPアドレスは通常のネットワークポートが「172.17.4.128」、マネジメントポートが「172.17.4.129」です。

また管理ホストですが、こちらもOSはUbuntuです(Ubuntu 7.10 Desktop 32bit)。こちらには[ExpressScopeHowTo_2p1 前回の電源制御]で利用したipmitoolがインストールしてあります。

さて、すぐに設定に入りたいところですが、行うべき作業がいくつかあるので、作業の流れを説明しておきましょう。IMPIのSoLを利用するための設定には以下のような項目があります。

 * BIOSの設定
{{{
 * IPMIドライバのインストール
}}}
 * GRUBとカーネルパラメータの設定
 * OSの設定

=== BIOSの設定

それでは作業を開始します。まず、BIOSの設定を変更して、コンソール出力をシリアルポートにリダイレクトします。

電源投入後にF2キーを押してBIOS画面に入り、「Server」→「Console Redirection」に進みます。「Console Redirection」の画面では以下のように設定を変更しました。

BIOS Redirection Port:Serial Port B
ACPI Redirection Port:Serial Port B
Baud Rate:19.2K
Terminal Type:VT-UTF8
Flow Control:CTS/RTS
Remote Console Reset:Disabled

最初の2つの項目(「BIOS...」と「ACPI...」でBIOSの情報がシリアルポートに出力されるようにしています。ここでは「Serial Port B」という記述に注意してください。これは2つ目のシリアルポートという意味です。i110Rb-1hには物理的なシリアルポートは1つしかありませんが、「Serial Port B」はSoLで利用する仮想的なシリアルポートとして機能します。

次の「Baud Rate」に指定するシリアル転送速度は上限値が115.2Kとなっていますが、むやみに高い値を指定すると接続が不安定になることがあるようです。今回はデフォルトの「19.2K」のままにしました。この値は別の箇所でも指定するので、BIOSの設定値を覚えておいてください。

その次の「Terminal Type」には、端末の種類を指定します。BMCによって指定できる値は異なりますが、i110Rc-1hのEXPRESSSCOPEの場合は「PC ANSI」、「VT100+」、「VT-UTF8」の3つから選びます。インターネット上の情報では「VT100+」を指定している例が多いのですが、端末にGnome-terminalを利用するときは「VT-UTF8」を指定したほうが画面の制御がうまくいっているようです。

残りの2つの項目はデフォルトのままです。ちなみに、「Remote Console Reset」を「Enabled」に変更すると、リモート端末上で「Esc R Esc r Esc R」とキーを入力することでシステムをリセットすることができるようになります。ただし、システムのリセットはipmitoolコマンドでもできるので、今回は「Disabled」のままとしました。

<画面入る>

=== GRUBとカーネルパラメータの設定

BIOSの次に、OSを起動してGRUBの設定ファイル「/boot/grub/menu.lst」を編集します。念のため、既存のファイルをバックアップしてから編集しましょう。
{{{
$ sudo cp /boot/grub/menu.lst /boot/grub/menu.lst.bak
$ sudo vi /boot/grub/menu.lst
}}}
menu.lstファイルに加える変更には、大きく分けると、GRUB自体の設定とカーネルパラメータの設定があります。まず、GRUB自体の設定ですが、menu.lstの先頭に以下の2行を追加します。
{{{
serial --unit=0 --speed=19200 --word=8 --parity=no --stop=1
terminal --timeout=5 serial console
}}}
1行目はシリアルポートの設定で、ボーレート19200bps、8ビット、パリティなし、ストップビット数1という意味です。2行目はOS選択メニューの出力先の指定で、この場合、GRUBの起動時に何もキー操作をしなければ5秒間でタイムアウトしてシリアルポートが選択されます。シリアルコンソールか通常のコンソールで何かキーを操作すれば、操作したほうのコンソールが有効になります。

次にカーネルパラメータの設定を行います。こちらは、kernel行に以下のパラメータを追加します。
{{{
console=tty0 console=ttyS1,19200n8r
}}}
ここでは、コンソールメッセージの出力先として通常のモニタ/キーボード(tty0)とシリアルポート(ttyS1)の両方を指定しています。「19200n8r」はボーレート19200bps、ノンパリ、8ビット、ストップビット数1)という意味です。

さて、Ubuntuの場合、kernel行にはあらかじめ以下の2つのパラメータが設定されています。
{{{
quiet splash
}}}
これらはブート時にカーネルが出力するメッセージを最小限にして(quiet)、グラフィカルなブート画面を使用する(splash)という意味です。どちらもサーバマシンでは無用のオプションなので削除します。

最終的にkernel行の記述は以下のようになりました。
{{{
title           Ubuntu 7.10, kernel 2.6.22-14-server
root            (hd0,0)
kernel          /vmlinuz-2.6.22-14-server root=/dev/mapper/i110Rc-root ro console=tty0 console=ttyS1,19200n8r
initrd          /initrd.img-2.6.22-14-server
}}}
ただしkernel行を修正しただけでは、カーネルをアップデートした際に、カーネルパラメータが修正前のものに戻ってしまいます。これはUbuntuのmenu.lstファイルに以下のような設定が記述されているためです。
{{{
## additional options to use with the default boot option, but not with the
## alternatives
## e.g. defoptions=vga=791 resume=/dev/hda5
# defoptions=quiet splash
}}}
そこで、この最下行の「# defoptions」を以下のように修正します。
{{{
# defoptions=console=tty0 console=ttyS1,19200n8r
}}}
これでカーネルが更新された場合でも新しいカーネルにシリアルコンソールの設定が引き継がれるようになります。

<break>

=== OSの設定

最後にOSでシリアルコンソールを利用するための設定を行います。従来のLinux(というかSysV系UNIX OS)では、コンソールや各種端末の設定は「/etc/inittab」(システム初期化プログラムinitの設定ファイル)に記述されていました。ところが、Ubuntuにはこのファイルがありません。Ubuntu 6.10(Edgy Eft)から、それまでのinitの代わりにUpstartという初期化プログラムが採用されているためです。ちなみに、Upstartはイベント駆動型のプログラムで複数プロセスの初期化を並列して実行することができます。これにより、システムの起動所要時間が短縮されるほか、ノートPCなどで必要な電源管理(スリープやサスペンド、ハイバネーションなど)に伴うプロセス制御も柔軟に行うことが可能になります。

さてUpstartでは、inittabファイルではなく、/etc/event.dディレクトリ内のファイル群に設定を記述します。イベント駆動型らしく各機能ごとに設定ファイルが分かれており、端末の設定はその端末のデバイス名のファイルを用意して記述します。シリアルコンソール用の初期化ファイルとして、「/etc/event.d/ttyS0」と「/etc/event.d/ttyS1」をそれぞれ以下の内容で作成してください。

/etc/event.d/ttyS0
{{{
# ttyS0 - getty

start on runlevel-2
start on runlevel-3
start on runlevel-4
start on runlevel-5

stop on shutdown
respawn /sbin/getty 19200 ttyS0 vt100
}}}

/etc/event.d/ttyS0
{{{
# ttyS0 - getty

start on runlevel-2
start on runlevel-3
start on runlevel-4
start on runlevel-5

stop on shutdown
respawn /sbin/getty 19200 ttyS0 vt100
}}}

初期化ファイルが作成できたら、次に「/etc/securetty」ファイルを編集します。これはrootログインを許可する端末を設定するファイルです。このファイルに「ttyS1」を追加しておきます。
{{{
# /etc/securetty: list of terminals on which root is allowed to login.
# See securetty(5) and login(1).
console

# for people with serial port consoles
ttyS0
ttyS1  ←この行を追加
……省略……
}}}
以上でSoLを利用するための設定は完了です。

=== 動作検証

それではSoLが正常に機能するかどうか試してみましょう。まず、システムを再起動します。このとき、管理ホストの端末から以下のコマンドを実行してみてください。
{{{
$ ipmitool -l lanplus -H 172.17.4.129 -U hmori -P xxxxxxxx sol activate
}}}
「-l」はIPMIのバージョン(lanplusは「IPMI 2.0」の意)、「-H」は対象サーバのマネージメントポートのIPアドレス、「-U」はBMCに登録されている管理ユーザー、「-P」はパスワードです。そして、最後の「sol activate」がSoL経由でシリアルコンソールに接続するという意味です。

<画面入る>

SoLが正常に機能していれば、端末上にBIOSのPOST画面やGRUBメニュー、カーネルの起動メッセージなどが出力され、ログインプロンプトが表示されるはずです。

なお、シリアルコンソールから抜ける際は、端末上で「~.」と入力します。ちなみに、ログイン中にシリアルコンソールから抜けてもセッションは継続されます。これはこれで便利(※)なのですが、無意味にログインした状態のままにしておくのはセキュリティ上好ましくないので、作業を終えたらログアウトしてから「~.」と入力するようにしてください。

※ たとえば手元の管理ホストを再起動する必要があるような場合でも、「~.」でシリアルコンソールから抜けて、管理ホストを再起動し、起動後に再びipmitoolコマンドでセッションを復元するといったことができます。

=== SoLのセットアップを簡略化する

SoLはとても便利な機能ですが、本稿で説明してきたとおり、利用するための設定項目が結構あるので台数が増えてくると一台一台セットアップするのは面倒です。

 まず、BIOSの設定変更ですが、こちらはNEC○○の××サービスを利用するという手があります。有償サービスですが、工場出荷時に希望の設定を施しておいてくれるので便利です。

また、プリインストール作業も行ってくれます。



 また、OS側の設定(OpenIPMIのインストール、GRUBの設定変更など)は、設定済みのOSをディスクイメージ化して各マシンに展開するというのが現実的でしょう。ネットワークの情報はDHCP経由で自動設定するようにしておけば、個別に設定を施さずに実践投入することができます。


partimageはディスクの内容をイメージファイル化してバックアップするツールです。データが記録されていないブロックをスキップする機能やイメージをgz形式やbz2形式で圧縮する機能を備えているので、バックアップファイルのサイズを抑えることができます。

・OS設定済みホストをKNOPPIXで起動し、partimageでディスクの内容をファイルサーバにバックアップ
・新規マシンをKNOPPIXで起動し、ファイルサーバ上のバックアップデータをpartimageでリストア




後日談


先日、EXPRESSSCOPEのWebコンソールが使えなくなりました。ログイン画面は表示されるのですが、その先さっぱり画面が表示されないという状況。結論から言うと、原因はFirefoxの機能拡張で、すべての拡張を無効にしたら問題なくWebコンソールが利用できるようになりました。Firefoxを使っているとついつい便利そうな拡張を追加してしまいがちですが、今回のように安定性が犠牲になることもあります。注意したいところですね。


Webブラウザ、Java、JavaScript

その点、SoLは端末エミュレータだけで利用でき、リモートKVMのようにJavaの読み込みに待たされることもないので、お勧めできます。



ドライバの導入
{{{
$ sudo apt-get install ipmitool
$ sudo /usr/share/ipmitool/ipmi.init.basic
Setting up OpenIPMI driver...
FATAL: Module ipmi_kcs_drv not found.
}}}
 上のように「ipmi_kcs_drvモジュールが見つからない」というエラーが出ますが、ipmi_kcs_drvが存在しない場合は代わりにipmi_siモジュールが読み込まれるのでこのエラーを気にする必要はありません。念のため、ipmi関連モジュールが読み込まれているかどうか確認しておきましよう。
{{{
$ lsmod | grep ipmi
ipmi_si                43404  0
ipmi_devintf           10504  0
ipmi_msghandler        38488  2 ipmi_si,ipmi_devintf
}}}
 このように3つのモジュールが読み込まれていれば問題ありません。