まず、家サーバを終了。
# shutdown -h now
マシンを開けてPCIのサーバアダプタを追加。それで起動。起動すると、新しいデバイスをチェックしてくれて、デバイスドライバを当ててくれた。起動したら追加したデバイスにIRQが正しく割り当てれたか確認。このときDo ConfigureだろうがRemove Configureだろうが、Do Nothigを選択しない限り、古い設定の内ifcfgは削除、modprobe.confの対応する設定は削除だ。Do Configureすればmodprobe.confは設定してくれるけどifcfgは設定されないので注意が必要かも。
# cat /proc/interrupts
これでIRQと、そのIRQに割り当てられたデバイスの名前が表示される。ここに表示されたデバイスの名前はdmesgに流れたデバイスネームと対応付けられているようだ。だから、IRQ、デバイスネーム、物理アドレスの対応付けは、上だけではダメだ。追加したデバイスの物理アドレスをチェックしなければ。
# demsg | grep eth
これで、今回追加したNICの物理アドレスに対応したデバイスにIRQが割り当てられたかどうかを確認できる。結局うまく割り当てられていなかった。というのは、今回追加したデバイスがにIRQがまったく割り当てられていなかった。デバイスドライバのロードと設定ファイルの作成はシステムの判断にお任せするとして、IRQの割り当てをいじる方向を模索した。
いろいろ調べて判ったことは、LinuxでIRQの割り当てを手作業でするには、デバイスドライバのロードを操作する/etc/modprobe.confの中でoption指定するしかない。つまり、デバイスドライバのオプションでIRQ指定をサポートしていないとIRQの手作業割り当てはできない。今回追加したNICにオートマチックでロードされたドライバはtulipなので、IRQの手作業指定はできない。
ということで、BIOSで指定する。今回追加したNICはQuadポートなので、PCIバスとIRQの対応付けだけだと割り込みの衝突が頻繁に起こりそうだけどしかたあるまい。で、BIOSのそれっぽいメニューでIRQの設定を確認しよう。Vineが起動する前にDELキーを押してBIOSに入る。んで、IRQの設定にいく。PnPサポートOSか?のところをYesにしておく。Noのままだと、それぞれのデバイスにひとつづつのIRQを割り当てそうな予感。これで、LinuxのPnPサポートに期待してみる。んで、BIOS変更内容を保存して、再起動。家サーバはいまだにISAバスがあって440BXとかだったせいか、デフォルトの設定ではPnPがNoになっていた。時代を感じるね。
改めて再起動して設定を確認する。
# dmesg | grep eth # cat /proc/intrrupts
こんどはOk。IRQの重複はあるけど、適当に割り当てられている。まぁISAにデバイスは接続していないからね。不確定な情報だけど、PCIバスには4本の割り込み線が割り当てられていて、同じPCIバスに付いているデバイスネームが同じIRQをもつと本当の意味での同時使用はできなかったと思う。もし4つのデバイス全てが同じIRQを持っていたとしても、イーサネットデバイスなんかの場合なら割り込みのせいでちょっとネットワーク混んでるかなという位なのでよしとしよう。また、デバイスによっては単独のデバイスが単独のIRQを専有しないとダメな場合もあるということだ(たとえばISAバスに取り付けられたデバイスは単独デバイスが専用のIRQアドレスを持つ)。この場合はマニュアルにそう書いてあるそうな。マニュアルを読めということだね。4本の割り込み線があるので1つのPCIカードに4つ以上のデバイスがあっても5つ目以降は使えないということかな。5つのイーサネットポートが付いたデバイスを見ないのはそんな理由かな。
IRQの割り当てをクリアしたら、次にするべきなのはイーサネットデバイス使用の可否だ。デバイス使用の可否は/etc/sysconfig/network-scripts/ifcfg-eth*で操作する。このとき、ファイル名のeth*はdmesgに流れたデバイスネームと対応、ファイル中にかかれたHWADDRESはそのデバイスネームに対応した物理アドレス。ファイル中にかかれたDEVICEはわかりやすければOK。外に出るためのデバイスと家ネットのノードからのアクセスを受け入れるデバイスはifcfgが少し違うだけだ。つまり、家ネットに開放したポートはIPアドレスをローカルアドレスにしてStaticにしておくことだ。最後にイーサネットデバイスをUPする。IRQの割り当てに失敗しているとここでも失敗する。そんな場合はdevise is too busyとかのエラーを吐いてくれたと思う。
# /etc/init.d/netwark restart
最後にdhcpdの設定を変更する。dhcpdが監視するデバイスを指定するために/etc/sysconfig/dhcpdを編集、それらのデバイスに割り当てられたアドレスとネットマスクを元に/etc/dhcpd.confを編集。dhcpdの再起動。
# vi /etc/sysconfig/dhcpd # vi /etc/dhcpd.conf # /etc/init.d/dhcpd restart