エンタープライズ:特集 2003/01/28 09:44:00 更新

Linuxでハイパー・スレッディング――Pentium4/3.06GHzで遊ぼう
第2回 泥沼のRedHatカーネルデバッギング (1/5)

少し時間があいてしまったが、Pentium4/3.06GHz連載の第2回目である。引き続きカーネルデバッギングの作業をしているが、これがまたなんとも…。

 前回の記事からえらく間がが空いてしまったが、引き続きカーネルデバッギングの続きをお話したい。実は、その後デバッグに向けて環境を作っている最中に、突如キーボード切り替え機がマザーボードを道連れにご臨終なさってくださって、おかげでPS/2ポートが使えなくなってしまったのだ。無事にブートすればネットワーク経由であれやこれやが可能とは言え、BIOSセットアップにも支障があるのはちょいと辛い。しかたなく新しいマザーボードを買いに行かねば…とか言っている間に年末年始の原稿ラッシュが押し寄せてきて、やっと環境を作り直したのが今年の18日過ぎの事。担当氏には「今年中(つまり去年の事)には続き読みたいですねぇ」とか言われていたのだが(笑)(笑ってる場合じゃない)。

 ちなみにその後、ASUSTeKのP4PEを購入して試したのだが、やはりRedHat 8.0を入れてからSMP環境にしてみるものの、「/var/log/messages」には「SMP motherboard not detected.」の文字が躍っており、どうやってもHTが有効にならない。ただ、エンタープライズでLinux Columnを連載している宮原さんからは「IntelのD850EMV2をを使用したところ、Windows 2000ではうまくいくものの、Linuxでは駄目だったのですが、BIOSをアップデートしたら、ばっちりうまくいくようになりました。BIOSはP20です。」という連絡をいただいた。ただP4PEの場合、最新アップデートを使っているのでこれ以上BIOSを上げようがない。というわけで、いよいよカーネルデバッギングである。

泥沼のカーネル再構築

 カーネルデバッグにはいろいろな方法がある。まともにやるならばKDB(Kernel Debugger)を入れて追っかけていくのが筋なのだが、ここではもうちょいとお気軽にやってみることにしたい。たとえばさきほど書いた「SMP motherboard not detected.」だが、「smpboot.c」の当該ソースを読むと、

 if (!smp_found_config) {
  printk(KERN_NOTICE "SMP motherboard not detected.\n");
#ifndef CONFIG_VISWS
  io_apic_irqs = 0;
#endif
  cpu_online_map = phys_cpu_present_map = 1;
  smp_num_cpus = 1;
  if (APIC_init_uniprocessor())
   printk(KERN_NOTICE "Local APIC not detected."
      " Using dummy APIC emulation.\n");
  goto smp_done;
 }

といった具合になっている。ここで2行目の

printk(KERN_NOTICE "SMP motherboard not detected.\n");

がミソで、要するに「printk()という関数を使うと、任意のメッセージを『/var/log/messages』に吐き出せる」という仕組みだ。これを使って、カーネルのあちこちの動作をコンソールに吐かせることで、どうして845系ではSMPマザーと認識されないかを確認しよう、という魂胆である。

 ま、このあたりの詳細は後述するとして、とりあえず必要なことはカーネルの再構築である。現状使っているカーネルはRedHatが提供するコンパイル済みのものだが、カーネルのデバッグをする場合、自分でカーネルソース中にprintk()を埋め込んでカーネルの再構築、再起動を繰り返すというパターンになる。したがって、まず最初にカーネルを再構築できるようにしておくことが重要である。

      | 1 2 3 4 5 | 次のページ

[大原雄介,ITmedia]