再起動にまつわるあれこれ

Posted by yoosee on Debian at 2006-07-09 23:42 JST

*1  サーバ再起動に伴うトラブルあれこれ

kernel を linux-2.6.17-686-2 にあげて再起動したら上がってこない。起動中に画面が flush した後に画面入力が無くなると言うパターンだったので、恐らく vga 指定がおかしくなっているのだろうと、起動パラメータに vga=791 等と指定すると起動してくれた。
すると今度は dmesg に大量の
evbug.c: Event. Dev: isa0060/serio0/input0, Type: 4, Code: 4, Value: 21
と言ったラインが出現。evbug なんて誰が insmod したんだ。keylogger 仕込まれたんじゃなるまいな…と思いつつ、ともあれ rmmod しておく。modprobe.d/blacklist が読み込まれていない?

*2  再起動とメモリ使用量

ところで 120日ぶり程で reboot したら、メモリの使用量が半分程度まで減った。sid で何度も upgrade を繰り返しているから、変なファイルハンドルを掴んだままになっていたとかあったのだろうか。そのうち lsof してみよう。

*1  /proc/cpuinfo の ht flag と Hyper Threading

ふと自宅マシン (M/B P4T, CPU Pen4 1.7GHz) の /proc/cpuinfo を眺めていたのだが、flags に ht と言うフラグがある。
 % cat /proc/cpuinfo
...(snip)...
model name      : Intel(R) Pentium(R) 4 CPU 1700MHz
cpu MHz         : 1707.804
flags           : fpu vme de pse tsc msr pae mce cx8 sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm
asm/cpufeature.h (-> asm-i486/cpufeature.h) を見ると
#define X86_FEATURE_HT          (0*32+28) /* Hyper-Threading */
と言う行があり、この "ht" flag は Hyper-Threading が搭載されていることを示すようだ。とは言え Pentium4 - Wikipedia を見る限り、i850 chipset に RDRAM を載せた M/B に 1.7GHz CPU と言う組み合わせは確実に HT 非対応の第一世代 Pentium 4、Willamette だ。

実際、 linux-image-2.6.15-686-smp を入れて起動してみても、cpu は 1 つしか認識しない。この時 dmesg でも
CPU: Hyper-Threading is disabled
となっている。このメッセージが出ているところを追ってみると arch/i386/kernel/cpu/common.c に処理があるようだ。
....
        if (!cpu_has(c, X86_FEATURE_HT) || cpu_has(c, X86_FEATURE_CMP_LEGACY))
                return;

        smp_num_siblings = (ebx & 0xff0000) >> 16;

        if (smp_num_siblings == 1) {
                printk(KERN_INFO  "CPU: Hyper-Threading is disabled\n");
        } else if (smp_num_siblings > 1 ) {
....
つまり cpu_has(c, X86_FEATURE_HT) は true を返している (CPU register の X86_FEATURE_HT (0*32+28) bit が立っている) ので cpu flags には ht が立つが、実際に smp_num_sibling (SMP兄弟プロセッサの数) を見ると 1 しか無く、HT 機能は有効ではない、という事だろうか。

*1  Davicom NIC が dmfe ではなく tulip で認識されてしまう問題

kernel 2.6.8 では問題無く認識されていた Davicom DM9102 NIC が、2.6.15 では起動時に 正しく認識されないという問題が出た。
ACPI: PCI Interrupt 0000:02:0b.0[A] -> Link [LNKD] -> GSI 9 (level, low) -> IRQ9
tulip0:  MII transceiver #1 config 1000 status 782d advertising 01e1.
eth0: Davicom DM9102/DM9102A rev 64 at 0001b400, 00:09:2C:28:01:AF, IRQ 9.
dmfe: Davicom DM9xxx net driver, version 1.36.4 (2002-01-17)
どうも dmfe だけでなく tulip ドライバが読み込まれてしまっているようだ。 # rmmod tulip && rmmod dmfe && modprobe dmfe とすると使えるようになる。
dmfe: Davicom DM9xxx net driver, version 1.36.4 (2002-01-17)
ACPI: PCI Interrupt 0000:02:0b.0[A] -> Link [LNKD] -> GSI 9 (level, low) -> IRQ 9
eth0: Davicom DM9102 at pci0000:02:0b.0, 00:09:2c:28:01:af, irq 9.
ちなみにこれは discover1-data の時にもあった問題(Bug#326723: Davicom ethernet controller gets tulip instead of dmfe)らしいのだが、/etc/modules に dmfe を足すやり方では駄目だった。

起動時はこの通りの状況なのだが、起動終了後に rmmod して discover-modprobe を走らせると tulip を読まずに dmfe だけを正しく呼んでくれる。lspci -n の結果
0000:02:0b.0 0200: 1282:9102 (rev 40) 
と /lib/discover/pci.lst の内容
  12829100   ethernet   tulip   21x4x DEC-Tulip compatible 10/100 Ethernet
  12829102   ethernet   dmfe    21x4x DEC-Tulip compatible 10/100 Ethernet
を付き合わせてもちゃんと dmfe が呼ばれているようだし、/etc/discover-modprobe.conf に skip="tulip" を入れても効かないところをみると、そもそも discover の問題ではないのかもしれない。
ii  discover      2.0.7-2.1      hardware identification system
ii  discover-data 2.2005.02.13-1 Data lists for Discover hardware detection system

*2  udev の問題

その後「rm tulip.ko すればいいのでは」という素晴らしい提案を頂いたりもしたが、全く同じ構成のシステムで linux 2.6.7-1-686 では問題無く起動するのが linux 2.6.15 では駄目だというのが怪しいと思って色々調べた結果、先ほどの discover1-data の Follow-up 記事 Bug#326723: acknowledged by developer (Bug#326723: fixed in discover1-data 1.2005.09.25) を見付けた。これによれば、現在のシステムでは discover ではなく udev が tulip を呼んでいるらしきことが書いてある(故に discover を使う 2.6.8 では問題が出なかったのだろう) 。
ii  udev           0.086-1        /dev/ and hotplug management daemon
udev のデバイス認識→ドライバのロード部分を修正する必要があるが、回避策としては /etc/modprobe.conf に
blacklist tulip
と書けとのこと。これを追記して再起動した限りに置いては、問題無く始めから認識してくれるようだ。やれやれ。

initrd.img の中身を見る

Posted by yoosee on Debian at 2006-03-05 23:42 JST

*1  initrd.img の中身は gzip された cpio archive

Debian で linux-image-2.6.x といったものをインストールすると、mkinitrd によって /boot/initrd.img-2.6.15-1-686 といった initrd イメージが作られる。実際にはこのファイルは gzip された cpio archive らしく、以下のようにすると展開できる。
 % mkdir /tmp/initrd && cd /tmp/initrd
 % gzip -dc /boot/initrd.img-2.6.15-1-686 | cpio -i
 20487 blocks
 % ls -F
 bin/  conf/  etc/  init*  lib/  modules/  sbin/  scripts/
cpio -pLd と gzip で元の initrd.img を作れる、と言うか mkinitrd がしているのはそう言う操作。

About W.W.Walker

World Wide Walker は yoosee による blog です。PDA, Web・サーバ技術, 美味しい食べ物などの話題を取り上げています... read more

Monthly Archives

Select Month to read
  

Ads

Recent Entries

Related Sites