稼働している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
それでは!=͟͟͞͞(๑•̀=͟͟͞͞(๑•̀д•́=͟͟͞͞(๑•̀д•́๑)=͟͟͞͞(๑•̀д•́