稼働しているLinux OSで、ネットワークインターフェースにどのドライバ(のどのバージョン)が実際に適用されているのか、をどうやって調べたくなる時があります。
覚えている限りでその色々を書いてみる。ちなみに、以降の紹介例ではCentOS 6系で試してみました。
他にナイスなやり方とかご存知であれば、教えてください。
dmesg (or /var/log/boot.log)
dmesgのバッファ溢れが起こっていない前提で、dmesgからチェックする方法。
使っているインターフェース名でgrepる。
# dmesg | grep eth0 igb 0000:01:00.0: eth0: (PCIe:2.5Gb/s:Width x4) 00:26:xx:xx:xx:xx igb 0000:01:00.0: eth0: PBA No: 313130-032 ADDRCONF(NETDEV_UP): eth0: link is not ready igb: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready eth0: no IPv6 routers present
こんな感じで、eth0には"igb"ドライバがあたっていることがわかる。
modinfo (ロードされているドライバモジュールの詳細)
# modinfo igb filename: /lib/modules/2.6.32-220.17.2_dev.el6.x86_64/kernel/drivers/net/igb/igb.ko version: 3.0.6-k license: GPL description: Intel(R) Gigabit Ethernet Network Driver author: Intel Corporation, <e1000-devel@lists.sourceforge.net> ・・・・・省略・・・・・
こんな感じでmodinfoコマンドでモジュール名を指定すれば、ズラズラと出てくる。
モジュールのパスとかバージョンとか。ものによっては読み込まれているオプションパラメータとか。
# modinfo -F version igb 3.0.6-k
バージョンだけ確認したい、とかだったら↑な感じでもOK。
ethtool
# ethtool -i eth0 driver: igb version: 3.0.6-k firmware-version: 2.1-5 bus-info: 0000:01:00.0
ethtoolコマンドの"-i"オプションで、そのインターフェースが実際にどのドライバのどのバージョンを読み込んでいるか確認できる。
lspci
・・・・・省略・・・・・ 01:00.0 Ethernet controller [0200]: Intel Corporation 82575EB Gigabit Network Connection [8086:10a7] (rev 02) Subsystem: Fujitsu Technology Solutions Device [1734:1128] Kernel driver in use: igb Kernel modules: igb ・・・・・省略・・・・・
lspciコマンドでも、どのバスにあるデバイスのコントローラがこのチップで、このkernel driver (module)が適用されているかどうかを確認できます。
こんな感じで結構たくさん情報が出てくるので、適当にgrep(ry
udevadm
# udevadm info --query=all --path=/sys/class/net/eth0 P: /devices/pci0000:00/0000:00:01.0/0000:01:00.0/net/eth0 E: UDEV_LOG=3 E: DEVPATH=/devices/pci0000:00/0000:00:01.0/0000:01:00.0/net/eth0 E: INTERFACE=eth0 E: IFINDEX=2 E: SUBSYSTEM=net E: INTERFACE_NAME=eth0 E: ID_VENDOR_FROM_DATABASE=Intel Corporation E: ID_MODEL_FROM_DATABASE=82575EB Gigabit Network Connection E: ID_BUS=pci E: ID_VENDOR_ID=0x8086 E: ID_MODEL_ID=0x10a7 E: NET_MATCHID=0000:01:00.0 E: ASSIGNED_INTERFACE_NAME=eth0 E: MATCHADDR=00:26:xx:xx:xx:xx E: MATCHIFTYPE=1 E: COMMENT=PCI device 0x8086:0x10a7 (igb)
udevadm infoでもigbとわかりますね。
もしくは、、、
# udevadm info -a --path=/sys/class/net/eth0 ・・・・・省略・・・・・ looking at device '/devices/pci0000:00/0000:00:01.0/0000:01:00.0/net/eth0': KERNEL=="eth0" SUBSYSTEM=="net" DRIVER=="" ATTR{addr_assign_type}=="0" ATTR{addr_len}=="6" ATTR{dev_id}=="0x0" ATTR{ifalias}=="" ATTR{iflink}=="2" ATTR{ifindex}=="2" ATTR{features}=="0x114bb3" ATTR{type}=="1" ATTR{link_mode}=="0" ATTR{address}=="00:26:xx:xx:xx:xx" ATTR{broadcast}=="ff:ff:ff:ff:ff:ff" ATTR{carrier}=="1" ATTR{speed}=="1000" ATTR{duplex}=="full" ATTR{dormant}=="0" ATTR{operstate}=="up" ATTR{mtu}=="1500" ATTR{flags}=="0x1003" ATTR{tx_queue_len}=="1000" looking at parent device '/devices/pci0000:00/0000:00:01.0/0000:01:00.0': KERNELS=="0000:01:00.0" SUBSYSTEMS=="pci" DRIVERS=="igb" ATTRS{vendor}=="0x8086" ATTRS{device}=="0x10a7" ATTRS{subsystem_vendor}=="0x1734" ATTRS{subsystem_device}=="0x1128" ATTRS{class}=="0x020000" ATTRS{irq}=="28" ATTRS{local_cpus}=="ffff" ATTRS{local_cpulist}=="0-15" ATTRS{modalias}=="pci:v00008086d000010A7sv00001734sd00001128bc02sc00i00" ATTRS{numa_node}=="-1" ATTRS{enable}=="1" ATTRS{broken_parity_status}=="0" ATTRS{msi_bus}=="" ・・・・・省略・・・・・
これでも詳細に情報が取れます。あとは適当にgrep(ry
それでは!=͟͟͞͞(๑•̀=͟͟͞͞(๑•̀д•́=͟͟͞͞(๑•̀д•́๑)=͟͟͞͞(๑•̀д•́