Linuxで使っているNICのドライバやバージョンを調べる方法いろいろ

稼働している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


それでは!=͟͟͞͞(๑•̀=͟͟͞͞(๑•̀д•́=͟͟͞͞(๑•̀д•́๑)=͟͟͞͞(๑•̀д•́