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

Вопрос или проблема

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

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

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

$ sudo lspci
...
02:00.0 Контроллер Ethernet: 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; затем я нахожу драйвер, который используется для устройств с этими координатами.

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

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

sudo lspci -v покажет это. вот так:

$ sudo lspci -v
00:01.0 VGA совместимый контроллер: Advanced Micro  Devices, Inc......
...
Драйвер ядра в использовании: radeon
Ядро модули: radeon

Вы также можете объединить его с grep вот так:

$ sudo lspci -v | grep -A 20 VGA

Если вы просто хотите использовать 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

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

lsusb -t

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

sudo lshw

Когда ethtool установлен, вы можете просто использовать:

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

где enp2s0 это имя устройства. ethtool предоставляет подробную информацию о интерфейсе:

$ 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

Чтобы установить на Debian/Ubuntu:

apt install ethtool

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

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

Вы можете использовать inxi с соответствующим параметром. Например, чтобы увидеть сетевые устройства и драйверы, вы можете использовать inxi -N

mint@computer:~$ inxi -N

Сеть:
  Устройство-1: Intel 82540EM Gigabit Ethernet драйвер: e1000
  Устройство-2: Intel 82371AB/EB/MB PIIX4 ACPI тип: сетевой мост
    драйвер: piix4_smbus

Некоторые параметры, которые вы можете использовать. Чтобы увидеть полный список, проверьте страницу man

-A
    Показать информацию о аудио/звуковой карте. 
-G
    Показать информацию о графической карте. Карта(ы), сервер отображения (производитель и номер версии)
-N
    Показать информацию о сетевой карте. С -x показывает PCI BusID, номер порта. 

Для меня мне нужен был способ связать названия сетевых устройств с названиями драйверов pci, вот однострочник (отрегулируйте или удалите “grep ens” на любое имя, которое вы хотите искать)

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

Наблюдая файловую систему /sys/ Например, для устройства eth0, с командой

ls /sys/class/net/eth0/device/driver -l

Вывод говорит, что драйвер связан с драйвером “virtio”

    lrwxrwxrwx 1 root root 0 Mar 11 14:43 /sys/class/net/eth0/device/driver -> ../../../../bus/virtio/drivers/virtio_net

Вы можете запросить udev для свойства ID_NET_DRIVER.

udevadm info --query=property /sys/class/net/enp4s0
DEVPATH=/devices/pci0000:00/0000:00:1c.2/0000:04:00.0/net/enp4s0
INTERFACE=enp4s0
IFINDEX=2
SUBSYSTEM=net
ID_NET_DRIVER=r8169
ID_NET_NAMING_SCHEME=v255
ID_NET_NAME_MAC=enx7503f7f7d053
ID_OUI_FROM_DATABASE=GIGA-BYTE TECHNOLOGY CO.,LTD.
ID_NET_NAME_PATH=enp4s0
ID_BUS=pci
ID_VENDOR_ID=0x10ec
ID_MODEL_ID=0x8168
ID_PCI_CLASS_FROM_DATABASE=Network controller
ID_PCI_SUBCLASS_FROM_DATABASE=Ethernet controller
ID_VENDOR_FROM_DATABASE=Realtek Semiconductor Co., Ltd.
ID_MODEL_FROM_DATABASE=RTL8111/8168/8211/8411 PCI Express Gigabit Ethernet Controller (Onboard Ethernet)
ID_PATH=pci-0000:04:00.0
ID_PATH_TAG=pci-0000_04_00_0
ID_NET_LINK_FILE=/usr/lib/systemd/network/99-default.link
ID_NET_NAME=enp4s0

Вы также можете спросить NetworkManager:

$ busctl get-property org.freedesktop.NetworkManager /org/freedesktop/NetworkManager/Devices/2 org.freedesktop.NetworkManager.Device Driver
s "r8169"

(Вам нужно знать номер устройства, который, по-видимому, соответствует индексу интерфейса):

$ ip -j -d l show dev enp1s0 | jq '.[].ifindex'
2

Ответ или решение

Как найти драйвер устройства в Linux: Пошаговое руководство

В мире Linux знать, какой драйвер используется для конкретного устройства, может быть критически важным для обеспечения его оптимального функционирования и производительности. В следующем руководстве мы рассмотрим несколько методов, которые помогут вам определить, какие драйвера подключены к вашим устройствам, использованию в том числе, информации о сетевых интерфейсах и других типах оборудования.

Определение драйвера устройства с помощью lspci

  1. Запустите lspci для идентификации устройства.
    Для начала вам необходимо использовать команду lspci, чтобы найти ваше устройство. Это позволит вам увидеть все устройства, подключенные через шину PCI, и их идентификаторы. Например:

    sudo lspci

    В выводе найдите ваше устройство, например, Ethernet-контроллер:

    02:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 01)
  2. Ищите драйвер через sysfs.
    После того как вы нашли идентификатор устройства, используйте find для поиска, какой драйвер ему соответствует:

    find /sys | grep drivers.*02:00

    Это может привести к результату, как в примере ниже, где r8169 — это драйверы для вашего Ethernet-контроллера:

    /sys/bus/pci/drivers/r8169/0000:02:00.0

Использование /sys/class/net для сетевых интерфейсов

Для более углубленного анализа сетевых интерфейсов можно использовать директорию /sys/class/net.

Пример Bash-скрипта

Вот простой скрипт, который выводит сетевые интерфейсы и их драйвера:

#!/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. Используйте lshw для получения информации о всех устройствах.
    Команда lshw показывает более детальную информацию о всех подключенных устройствах, включая и их драйвера:

    sudo lshw
  2. Устройство USB.
    Для USB-устройств используйте lsusb и lsusb -t, чтобы увидеть какие драйвера используются:

    lsusb -t
  3. Информация о интерфейсах с помощью ethtool.
    Установите ethtool и используйте его следующим образом:

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

    Это предоставит вам имя драйвера, например r8169.

  4. Системные журналы dmesg.
    Используйте dmesg для получения информации о конкретном устройстве:

    dmesg | grep <device-name>
  5. Использование udev для получения свойств устройства.
    Можно также запросить информацию из udev:

    udevadm info --query=property /sys/class/net/enp4s0

Здесь вы получите множество свойств, включая ID_NET_DRIVER.

Заключение

Определение драйвера, используемого вашим устройством в Linux, может быть выполнено различными способами. Используя команды lspci, ethtool, доступ к /sys/class/net, и другие утилиты, вы сможете получать необходимые данные об оборудовании и их драйверах. Понимание того, какие драйвера используются, позволит вам лучше управлять системой и обеспечивать ее надёжную работу.

Оцените материал
Добавить комментарий

Капча загружается...