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


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

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.

  • 40
    lspci -v does it by itself. – poige Jul 1 '12 at 4:50
  • 7
    lspci -nk will show you attached drivers. In general the sysfs is the right place to search for. – 0andriy Nov 18 '15 at 20:03
  • @AndyShevchenko thank you! This will be a great timesaver for me :-D – pepoluan Nov 29 '16 at 3:19
  • 1
    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? – Dr Beco Jun 26 '17 at 18:48
  • 1
    @DrBeco: But if driver is not installed, what do you want to find? You should just google in this case – Igor Chubin Jun 27 '17 at 15:18

Here's a little script I wrote:

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

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)
  • 1
    I much prefer reading links to finding/grepping. Nice solution. – Chris Mendez Jan 29 '16 at 16:24
  • Thanks! Way better than the unreliable 'dmesg|grep' (ring buffer...) – Dominik R Feb 10 '16 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 '17 at 21:37

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

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 ->

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

# readlink -f /sys/class/net/eth6/device/driver

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
  • how is this one better than the one Jonathan Reinhart posted ? unix.stackexchange.com/a/225496/47663 – nhed Feb 8 '18 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. – Monty Montemayor Feb 13 '18 at 17:37

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.

  • 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 '12 at 6:34
  • perhaps this SO question can help you further. – gkris Jun 27 '12 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 '16 at 1:47

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

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy