96

If my target has one device connected and many drivers for that device loaded, how can I understand what device is using which driver?

8 Answers 8

76

Just use /sys.

Example. I want to find the driver for my Ethernet card:

$ sudo lspci
...
02:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 01)
$ find /sys | grep drivers.*02:00
/sys/bus/pci/drivers/r8169/0000:02:00.0

That is r8169.

First I need to find coordinates of the device using lspci; then I find driver that is used for the devices with these coordinates.

8
  • 55
    lspci -v does it by itself.
    – poige
    Jul 1, 2012 at 4:50
  • 14
    lspci -nk will show you attached drivers. In general the sysfs is the right place to search for.
    – 0andriy
    Nov 18, 2015 at 20:03
  • @AndyShevchenko thank you! This will be a great timesaver for me :-D
    – pepoluan
    Nov 29, 2016 at 3:19
  • 3
    I know the OP asked for "drivers being used", but what if the driver is not installed nor being used? How to find out just by the vendorID:productID? Also, what if it is not a PCI device, and you only see it in lsusb for example?
    – DrBeco
    Jun 26, 2017 at 18:48
  • 2
    @DrBeco: But if driver is not installed, what do you want to find? You should just google in this case Jun 27, 2017 at 15:18
43

Here's a little script I wrote:

#!/bin/bash
for f in /sys/class/net/*; do
    dev=$(basename $f)
    driver=$(readlink $f/device/driver/module)
    if [ $driver ]; then
        driver=$(basename $driver)
    fi
    addr=$(cat $f/address)
    operstate=$(cat $f/operstate)
    printf "%10s [%s]: %10s (%s)\n" "$dev" "$addr" "$driver" "$operstate"
done

Sample output:

$ ~/what_eth_drivers.sh 
      eth0 [52:54:00:aa:bb:cc]: virtio_net (up)
      eth1 [52:54:00:dd:ee:ff]: virtio_net (up)
      eth2 [52:54:00:99:88:77]: virtio_net (up)
        lo [00:00:00:00:00:00]:            (unknown)
3
  • 1
    I much prefer reading links to finding/grepping. Nice solution. Jan 29, 2016 at 16:24
  • Thanks! Way better than the unreliable 'dmesg|grep' (ring buffer...)
    – Dominik R
    Feb 10, 2016 at 15:04
  • I'd like to find solution which would find also veth and other virtual drivers. IMHO the only solution is to use ethtool or lshw.
    – pevik
    Jul 20, 2017 at 21:37
18

sudo lspci -v will show it. like this:

$ sudo lspci -v
00:01.0 VGA compatible controller: Advanced Micro  Devices, Inc......
...
Kernel driver in use: radeon
Kernel modules: radeon

You can also combine it with grep like this:

$ sudo lspci -v | grep -A 20 VGA
6

If you just want to plainly use sysfs and doesn't want to deal with all these commands which eventually looks inside sysfs anyways, here's how:

say, what is the module/driver for eth6? "sfc" it is

# ls -l /sys/class/net/eth6/device/driver
lrwxrwxrwx 1 root root 0 Jan 22 12:30 /sys/class/net/eth6/device/driver ->
../../../../bus/pci/drivers/sfc

or better yet.. let readlink resolve the path for you.

# readlink -f /sys/class/net/eth6/device/driver
/sys/bus/pci/drivers/sfc 

so... to figure out what are the drivers for all of your network interfaces:

# ls -1 /sys/class/net/ | grep -v lo | xargs -n1 -I{} bash -c 'echo -n {} :" " ; basename `readlink -f /sys/class/net/{}/device/driver`'

eth0 : tg3
eth1 : tg3
eth10 : mlx4_core
eth11 : mlx4_core
eth2 : tg3
eth3 : tg3
eth4 : mlx4_core
eth5 : mlx4_core
eth6 : sfc
eth7 : sfc
eth8 : sfc
eth9 : sfc
2
  • how is this one better than the one Jonathan Reinhart posted ? unix.stackexchange.com/a/225496/47663
    – nhed
    Feb 8, 2018 at 4:58
  • 2
    Probably same... but I love one liner... I can easily adjust things right at the command line... just for those who don't have time to open a file and write a script. Feb 13, 2018 at 17:37
5

For USB based devices you can see the driver name by using the lsusb command:

lsusb -t

And/or you use lshw which enumerates the devices on all buses including USB, PCI, etc so you can see which driver it uses:

sudo lshw
1
  • FTR: the driver is shown at line titled configuration, for example: <code>configuration: <b>driver=btusb</b> maxpower=100mA speed=12Mbit/s</code>
    – Hi-Angel
    Mar 21, 2021 at 13:41
4

When ethtool is installed you can simply use:

$ ethtool -i enp2s0 | grep driver | awk '{print $2}'
r8169

where enp2s0 is the device name. ethtool provides detailed information about the interface:

$ ethtool -i enp2s0
driver: r8169
version: 2.3LK-NAPI
firmware-version: rtl8168e-3_0.0.4 03/27/12
expansion-rom-version: 
bus-info: 0000:02:00.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: yes
supports-priv-flags: no

In order to install on Debian/Ubuntu:

apt install ethtool
3

You can use the lsmod command to get the status of loaded modules / devices drivers in the Linux Kernel.

For a specific device, you can use dmesg |grep <device-name> to get the details too.

3
  • 1
    Thanks. But if i loaded two drivers for a device with same major no and different minor no ,and if only one driver is being used for the device ,how can I find which driver is used for that device?
    – Deepu
    Jun 27, 2012 at 6:34
  • perhaps this SO question can help you further.
    – gkris
    Jun 27, 2012 at 6:49
  • If your system has not been online so long that the ring buffer has re-started, sure dmesg | grep <device-name> will work ; this doesn't work on any of my routers, however.
    – cjac
    Mar 7, 2016 at 1:47
0

For me I needed a way to link network device names to driver pci names, here is a one-liner (adjust or remove the "grep ens" to whatever name network device name you want to search for)

for i in $(ip -br addr show | awk '{print$1}' | grep ens); do echo "$i: $(ethtool -i $i| grep bus-info)" ; done

You must log in to answer this question.