Вопрос или проблема
Если мое устройство подключено к одному устройству и для этого устройства загружено много драйверов, как я могу понять, какое устройство использует какой драйвер?
Просто используйте /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
-
Запустите lspci для идентификации устройства.
Для начала вам необходимо использовать командуlspci
, чтобы найти ваше устройство. Это позволит вам увидеть все устройства, подключенные через шину PCI, и их идентификаторы. Например:sudo lspci
В выводе найдите ваше устройство, например, Ethernet-контроллер:
02:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller (rev 01)
-
Ищите драйвер через 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)
Другие методы для определения драйверов
-
Используйте lshw для получения информации о всех устройствах.
Командаlshw
показывает более детальную информацию о всех подключенных устройствах, включая и их драйвера:sudo lshw
-
Устройство USB.
Для USB-устройств используйтеlsusb
иlsusb -t
, чтобы увидеть какие драйвера используются:lsusb -t
-
Информация о интерфейсах с помощью ethtool.
Установитеethtool
и используйте его следующим образом:ethtool -i enp2s0 | grep driver | awk '{print $2}'
Это предоставит вам имя драйвера, например
r8169
. -
Системные журналы dmesg.
Используйтеdmesg
для получения информации о конкретном устройстве:dmesg | grep <device-name>
-
Использование udev для получения свойств устройства.
Можно также запросить информацию из udev:udevadm info --query=property /sys/class/net/enp4s0
Здесь вы получите множество свойств, включая ID_NET_DRIVER
.
Заключение
Определение драйвера, используемого вашим устройством в Linux, может быть выполнено различными способами. Используя команды lspci
, ethtool
, доступ к /sys/class/net
, и другие утилиты, вы сможете получать необходимые данные об оборудовании и их драйверах. Понимание того, какие драйвера используются, позволит вам лучше управлять системой и обеспечивать ее надёжную работу.