|
|
||
最近カーネルモジュールことはじめにはまっている優しいイケメンなお兄さんたちとかが教えてくれることを願いつつ。
オンボードのNIC、Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller を Cent 4.4 + カーネル 2.6.19.2 で使っています。これは普通に認識して動いている。
このチップを Cent 5 でも使いたいワーと思ったけど Cent 5 標準のカーネルではドライバ (r8169) が削除されてるのんで、Cent 4.4 で使ってる同じ 2.6.19.2 のソースから、.config を同じにしてコンパイルした。
が、どーにも認識しない。
% /sbin/lspci | grep Ether 02:00.0 Ethernet controller: Unknown device 0001:8168 (rev 01) 03:05.0 Ethernet controller: Intel Corporation 82541PI Gigabit Ethernet Controller (rev 05)
とデバイスは見えてるし kudzu -p しても
class: NETWORK bus: PCI detached: 0 device: eth1 desc: "Unknown device 0001:8168" vendorId: 0001 deviceId: 8168 subVendorId: 147b subDeviceId: 2410 pciType: 1 pcidom: 0 pcibus: 2 pcidev: 0 pcifn: 0
確かに eth1、そこにあるッ!
しかしドライバがこのハードに当たらない。modprobe r8169 や insmod r8169.ko でカーネルにオロードしてもだめである。何が原因なのか!
認識してる Cent 4.4 では
% sudo /sbin/lspci | grep Ether 03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 01)
であり、kudzu -p
class: NETWORK bus: PCI detached: 0 device: eth0 driver: r8169 desc: "Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller" network.hwaddr: 00:50:8D:9D:88:9C vendorId: 10ec deviceId: 8168 subVendorId: 147b subDeviceId: 2410 pciType: 1 pcidom: 0 pcibus: 3 pcidev: 0 pcifn: 0
と、ドライバもきっちり当たっている。modprobe.conf 見るに
alias eth0 r8169
というかデバイスドライバ周りの仕組みがよくわかってないのがいけないんだなー。教えてエロいえらい人!
Cent5ではr1000でいけたりしませんかね。
いえ、いけめんでもやさしくもない、通りすがりのおぢさんですが(^^;
そすかあ、
あとはMODULE_DEVICE_TABLEにデバイスIDがないとか?
Cent4と5でカーネルソースの drivers/net/r8169.c に差分ってないすかねえ。
いかんせん、ここではカニさん飼育してないもので・・・
なんででしょ(^^;;、Cent4と5って同じハードですか?
あてずっぽうですがBIOSでDisableになってたりとかしませんよね(^^;;
でもその場合は vendorId: FFFF になりそうな気もしますが・・・
なんなんでしょうなああああ
でも口上出荷時の設定って必ずしも同じとは限らないので念のため確認してみてもいいかも?あとは、4が動いてるマシンと5が動いてるマシンでLiveCDかなんかでブートさしてみて、本当にハードに差がないか見てみるくらいでしょうか。
Cent5で認識しないマシンに4を入れたらちゃんと認識するのかな。
もしくはその逆をやると認識しなくなるのかな・・・
# pciviewconf 0000:00:02.0
VendorID=0xhhhh
DeviceID=0xhhhh
みたいな感じ?
BIOS設定で内蔵NICをDisable -> 再起動 -> BIOS設定で内蔵NICをDisable -> 再起動
するともしかすると認識するようになったりして。
だめもとで試してみてもらえるといいかも(^^;
基本的にディストリビューションの違いでPCIデバイスのベンダーIDが変わる事ってないと思うんですよねえ。
"BIOS設定で内蔵NICをDisable -> 再起動 -> BIOS設定で内蔵NICをEnable -> 再起動"
・BIOSのバージョンを確認してみる(上げてみる)
・可能ならハードウエア診断ツールをかけてみる
・可能ならNICのファームのバージョンを確認する
あとなんかあるかな
ドライバ周りの本を読んでたんですが vendorId + deviceId がシグネチャになってドライバが決まるのですね。なので認識してないほうは vendorId が 0x0001 だから変、と。また一つ学んだ!!
問題はなんで vendorId が 0x0001 かですねえ。0x0001 って見るからに特別な値のような感じがするんですが...
dump するツールは sysfs 経由でならわりと簡単に作れそう?
なので、直接PCIデバイスとお話してみたほうがいいとおもうのねん。
で、ユーザ空間からできないかと頑張ってみたんだけどちとくるしいのね。
なのでカーネルモジュールで実装して、初期化時に全PCIデバイスに pci_bus_read_config_word() してベンダID:デバイスID の一覧をログに出すくらいならさくっと作れそう。
とりあえずは、Cent 4.4のインストールをがむばってくらさい。
class: NETWORK
bus: PCI
detached: 0
device: eth1
driver: r8169
desc: "Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller"
network.hwaddr: 00:50:8D:9D:10:39
vendorId: 10ec
deviceId: 8168
subVendorId: 147b
subDeviceId: 2410
pciType: 1
pcidom: 0
pcibus: 2
pcidev: 0
pcifn: 0
この通り vendorId 0x10ec になってやがるでやんす。BIOS 設定とかはまったくいじってなす。
カーネルが vendorId 取るときにバグってるてこと? でも同じカーネルソースに同じ .config 使ってこねたのになああああ。意味不明。
そうするとモジュール読み込むまでのブートシーケンスを追うのがいいかもだけど、ちと面倒なんで、
とりあえずCent5でドライバをモジュールじゃなくて組み込みにするとどうなりますかね。
http://www.nvnews.net/vbulletin/showthread.php?t=75299
とかみると "The pci=nommconf kernel parameter disables the MMCONFIG PCI configuration space access method, which forces the kernel back to PCI type 1 configuration accesses. The MMCONFIG access method appears to be severely broken on a number of systems; on such systems, the NVIDIA Linux graphics driver can't reliably access the PCI configuration space of NVIDIA devices, which results in various stability problems, particularly if multi-core CPUs are used with multiple GPUs."
てなことが書いてるんですが、この NIC もその類なのかもですねえ。PCI 検出の周りを深追いするか。
カーネルで disable にできるんですな。MMCONFIG PCI configuration というのが何かは後で深追いします!
あとはCent5で動くことを確認できればおっけーすな
Cent 5 は明日やります! 実はあした Google のカンファレンスにでるのに現実逃避でサーバーいじってて資料まだ作ってない! やばい!