Linux: Как найти драйвер устройства, используемый для устройства?

59

Если к моей цели подключено одно устройство и загружено много драйверов для этого устройства, как я могу понять, какое устройство использует какой драйвер?

Алексиос
источник

Ответы:

46

Просто используйте /sys.

Пример. Я хочу найти драйвер для моей карты Ethernet:

$ 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

То есть r8169.

Для начала мне нужно найти координаты устройства с помощью lspci; Затем я нахожу драйвер, который используется для устройств с этими координатами.

Игорь Чубин
источник
35
lspci -vделает это самостоятельно.
Poige
7
lspci -nkпокажет вам прикрепленные драйверы. В общем, sysfs - правильное место для поиска.
0
@ AndyShevchenko спасибо! Это будет большой экономии времени для меня :-D
pepoluan
1
Я знаю, что ОП попросил «драйверы используются», но что, если драйвер не установлен или не используется? Как узнать просто по vendorID:productID? Кроме того, что, если это не устройство PCI, а вы видите его, lsusbнапример, только?
Доктор Беко
1
@DrBeco: Но если драйвер не установлен, что вы хотите найти? Вы должны просто Google в этом случае
Игорь Чубин
25

Вот небольшой сценарий, который я написал :

#!/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

Образец вывода:

$ ~/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
Я предпочитаю читать ссылки, чтобы найти / grepping. Хорошее решение.
Крис Мендес
Спасибо! Путь лучше ненадежного 'dmesg | grep' (кольцевой буфер ...)
Dominik R
Я хотел бы найти решение, которое бы нашло также vethи другие виртуальные драйверы. ИМХО, единственным решением является использование ethtoolили lshw.
pevik
8

sudo lspci -vпокажет это. нравится:

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

Вы также можете комбинировать это grepтак:

$ sudo lspci -v | grep -A 20 VGA
mlibre
источник
4

Если вы просто хотите просто использовать sysfs и не хотите иметь дело со всеми этими командами, которые в конечном итоге заглядывают внутрь sysfs, вот как:

скажи, что такое модуль / драйвер для eth6? "SFC" это

# 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

или еще лучше .. пусть readlink разрешит вам путь.

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

Итак ... чтобы выяснить, каковы драйверы для всех ваших сетевых интерфейсов:

# 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
Монти Монтемайор
источник
чем этот лучше, чем тот, который написал Джонатан Рейнхарт? unix.stackexchange.com/a/225496/47663
nhed
1
Вероятно, то же самое ... но я люблю один вкладыш ... Я могу легко настроить все прямо в командной строке ... только для тех, у кого нет времени, чтобы открыть файл и написать скрипт.
Монти Монтемайор
3

Вы можете использовать lsmodкоманду для получения статуса загруженных модулей / драйверов устройств в ядре Linux.

Для конкретного устройства вы можете использовать, dmesg |grep <device-name>чтобы получить детали тоже.


источник
1
Благодарю. Но если я загрузил два драйвера для устройства с одинаковым основным и другим второстепенным нет, и если для устройства используется только один драйвер, как я могу найти, какой драйвер используется для этого устройства?
возможно, этот ТАК вопрос поможет вам в дальнейшем.
Если ваша система не была в сети так долго, что кольцевой буфер перезапустился, обязательно dmesg | grep <имя-устройства> будет работать; это не работает ни на одном из моих маршрутизаторов, как бы то ни было.
Cjac
3

Для устройств на базе USB вы можете увидеть имя драйвера с помощью lsusbкоманды:

lsusb -t

И / или вы используете, lshwкоторый перечисляет устройства на всех шинах, включая USB, PCI и т. Д., Чтобы вы могли видеть, какой драйвер он использует:

sudo lshw
Пирз
источник