If my target has one device connected and many drivers for that device loaded, how can I understand what device is using which driver?
10 Answers
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.

- 1,144
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)

- 1,861
-
1
-
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 useethtool
orlshw
. – 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

- 1,861

- 1,311
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

- 56,709
- 26
- 150
- 232

- 171
-
how is this one better than the one Jonathan Reinhart posted ? https://unix.stackexchange.com/a/225496/47663 – nhed Feb 08 '18 at 04:58
-
2Probably 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
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

- 671
- 9
- 9
-
FTR: the driver is shown at line titled
configuration
, for example:configuration: driver=btusb maxpower=100mA speed=12Mbit/s
– Hi-Angel Mar 21 '21 at 13:41
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

- 2,860
- 6
- 27
- 39
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.
-
1Thanks. 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? – Jun 27 '12 at 06:34
-
-
If your system has not been online so long that the ring buffer has re-started, sure dmesg | grep
will work ; this doesn't work on any of my routers, however. – cjac Mar 07 '16 at 01:47
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

- 601
- 11
- 23
You can use inxi
with the relevant parameter. For example to see the network devices and the drivers you can use inxi -N
mint@computer:~$ inxi -N
Network:
Device-1: Intel 82540EM Gigabit Ethernet driver: e1000
Device-2: Intel 82371AB/EB/MB PIIX4 ACPI type: network bridge
driver: piix4_smbus
Some parameter you might want to use. To see the complete list check the man page
-A
Show Audio/sound card information.
-G
Show Graphic card information. Card(s), Display Server (vendor and version number)
-N
Show Network card information. With -x, shows PCI BusID, Port number.

- 123
Watching /sys filesystem/ For example for device eth0, with command
ls /sys/class/net/eth0/device/driver -l
Output says the driver is linked to "virtio" driver
lrwxrwxrwx 1 root root 0 Mar 11 14:43 /sys/class/net/eth0/device/driver -> ../../../../bus/virtio/drivers/virtio_net

- 11
lspci -v
does it by itself. – poige Jul 01 '12 at 04:50lspci -nk
will show you attached drivers. In general the sysfs is the right place to search for. – 0andriy Nov 18 '15 at 20:03vendorID:productID
? Also, what if it is not a PCI device, and you only see it inlsusb
for example? – DrBeco Jun 26 '17 at 18:48lspci -vk | grep -A 6 -i ethernet
but you have to adjust the number of lines printed after the matching line with-A
. – Ludovic Kuty Apr 06 '20 at 06:54