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
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.
-
55
-
14
lspci -nk
will show you attached drivers. In general the sysfs is the right place to search for.– 0andriyNov 18, 2015 at 20:03 -
@AndyShevchenko thank you! This will be a great timesaver for me :-D– pepoluanNov 29, 2016 at 3:19
-
3I 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 inlsusb
for example?– DrBecoJun 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
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)
-
1I 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...) 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 useethtool
orlshw
.– pevikJul 20, 2017 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 ->
../../../../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
-
how is this one better than the one Jonathan Reinhart posted ? unix.stackexchange.com/a/225496/47663– nhedFeb 8, 2018 at 4: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. Feb 13, 2018 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
-
FTR: the driver is shown at line titled
configuration
, for example: <code>configuration: <b>driver=btusb</b> maxpower=100mA speed=12Mbit/s</code>– Hi-AngelMar 21, 2021 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
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?– DeepuJun 27, 2012 at 6:34
-
-
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.– cjacMar 7, 2016 at 1: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