[Linux] Using kexec for fast reboots on Oracle Linux with UEK.

Linuxであまり話題にならない機能がkexecです。これはLinuxカーネルが直接カーネルをロードできるようにするインフラストラクチャの一部で、基本的に新しいカーネルを即座に実行するというものです(通常は、標準リセット>システムの電源ON>BIOS/ファームウェアの初期化>メモリ/デバイスディスカバリ>ブートローダー>Linuxカーネルの流れ)。

kexecのメカニズムは、kdumpと共に使われることがほとんどです。基本的にkdumpを用いると、クラッシュやパニックが発生した場合に、以前のカーネルランタイムからメモリを維持しつつ、クラッシュ後に新しいカーネルが立ち上がります。その後、新しいカーネルがこのデータを収集してダンプを生成し、ローカルディスクやリモートディスク、その他の任意の場所に配置します。 kdumpを使用するためには、基本的にこのダンプカーネル用/予備のメモリを割り当てる必要がありますが、これは、ブート時に crashkernel=xxx@yyy とgrubコマンドラインから追加することで可能です。クラッシュカーネルイメージがロードされ、クラッシュまたはパニックが発生したときに実行されます。 kdumpは設定は少し面倒ですが、それをあまりあるほど本当に素晴らしい柔軟性をもたらし、デバッグ時にも非常に有用です。

kdumpに関心がある方には、以下のOracle Linuxでkdumpを試したエントリをどうぞ。

TEST!!! - kdump on oracle linux (Unbreakable Enterprise Kernel)
http://surachartopun.com/2011/08/test-kdump-on-oracle-linux-unbreakable.html

単にLinux Kernel Treeに含まれるドキュメントを読みたい方はこちらから。
Documentation for Kdump - The kexec-based Crash Dumping Solution
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=blob_plain;f=Documentation/kdump/kdump.txt;hb=HEAD

とにかく、このエントリはkdumpに関するものではありません。kdumpは素晴らしいのですが、私はkexecの適切な使用方法、および貴社のシステムを高速に再起動する方法をお伝えしたいと思っていました。Oracle Linux 5とOracle Linux 6は共に再起動メカニズム(詳細は/etc/init.d/haltを参照)として、kexecを使用したリブートをサポートしています。標準のrebootコマンドを実行すると、ランレベルが6になり、/etc/init.d/halt を実行します。このスクリプトは、kexecがカーネルイメージを使うように構成されている場合には、kexec -eを実行します。標準のリブート(reboot -fではありません)の場合、通常のシャットダウンスクリプトを実行し、終了時にシステムが正常にリセットします。
その後、このリセットによりシステムがハードリセットされ、BIOS、メモリテスト、デバイスの発見、デバイスおよびファームウェアの初期化、ブートデバイスのブートローダを立ち上げて、カーネルを始動します。

kexecを設定するには、システムブート直後に次のコマンドを実行する必要がありますが、自動化したい場合は、rcスクリプトに加えましょう。Oracle Linuxをシステム管理者にとってもっと簡単にするため、今後OS管理スクリプトにkexecをもっと統合していく予定です。
kexec -l --append="`cat /proc/cmdline`"
    --initrd=/boot/initrd-`uname -r`.img /boot/vmlinuz-`uname -r`
今回は、 2.6.32-200.13.1.el5uek を使っています。
設定が終了したら、新しいカーネルイメージを用意し、メモリを割り当てて、次の2個の操作のうち、どちらか一つを実行できます。
  1. rebootを実行
    通常のリブートの最後で停止(全サービスをシャットダウン)し、直接この新しいカーネルイメージに移ります。この時点でOSを立ち上げるのと同様です。
  2. シャットダウンせずに高速にリブートしたい(reboot -f)場合には、以下のようにします。
    sync; umount -a ; kexec -e
この場合、全サービスのシャットダウンスクリプトをバイパスし、すぐに新しいカーネルを立ち上げます。これは群を抜いて高速な再起動です。
節約できるトータルの時間は、貴社のサーバ次第です。基本的に、実行するカーネルイメージを掘り返してシステムが起動する時間こそが、再起動時に節約される時間です。これは数秒(15秒や20秒)から、時には数分になることがあります。

デバイスをリセットせずにkexecとインスタント起動を使った場合の注意点が一つあります。デバイスが正常に動作しない場合や、ドライバが正常に動作しない場合があります。実際に貴社のシステムでこれを使用する前に、まずテストしてハードウェアのデバイスドライバおよびデバイスそのものが正常に動作することを確認する必要があります。

kexecに関してもっと知りたい方には、数年前に投稿された以下のエントリが参考になると思います。

Reboot Linux faster using kexec (IBM DeveloperWorks)
http://www.ibm.com/developerworks/linux/library/l-kexec/index.html
Kexecを使ってLinuxの起動を早める (IBM DeveloperWorks JP)
http://www.ibm.com/developerworks/jp/linux/library/l-kexec/

次回のエントリではOracle VM Server 3と一緒に使う方法について記載する予定です。


原文はこちら。
http://blogs.oracle.com/wim/entry/fast_reboots_for_oracle_linux

0 件のコメント:

コメントを投稿