エンタープライズ:特集 | 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()を埋め込んでカーネルの再構築、再起動を繰り返すというパターンになる。したがって、まず最初にカーネルを再構築できるようにしておくことが重要である。
[大原雄介,ITmedia]