Linux: jak znaleźć sterownik urządzenia używanego dla urządzenia?

59

Jeśli do mojego celu podłączono jedno urządzenie i załadowano wiele sterowników dla tego urządzenia, jak mogę zrozumieć, które urządzenie używa tego sterownika?

Alexios
źródło

Odpowiedzi:

46

Po prostu użyj /sys.

Przykład. Chcę znaleźć sterownik mojej karty 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

Że jest r8169.

Najpierw muszę znaleźć współrzędne urządzenia za pomocą lspci; następnie znajduję sterownik używany dla urządzeń o tych współrzędnych.

Igor Chubin
źródło
35
lspci -vrobi to samo.
poige
7
lspci -nkpokaże ci dołączone sterowniki. Ogólnie rzecz biorąc, sysfs jest właściwym miejscem do wyszukiwania.
0andriy
@AndyShevchenko dziękuję! To będzie dla mnie świetna oszczędność czasu :-D
pepoluan
1
Wiem, że OP poprosił o „używanie sterowników”, ale co jeśli sterownik nie jest zainstalowany ani używany? Jak się dowiedzieć po prostu vendorID:productID? A co jeśli nie jest to urządzenie PCI, a widzisz je tylko lsusbna przykład?
Dr Beco
1
@DrBeco: Ale jeśli sterownik nie jest zainstalowany, co chcesz znaleźć? W tym przypadku powinieneś po prostu google
Igor Chubin
24

Oto mały skrypt, który napisałem :

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

Przykładowe dane wyjściowe:

$ ~/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)
Jonathon Reinhart
źródło
1
Wolę czytać linki niż znajdowanie / grepping. Niezłe rozwiązanie.
Chris Mendez,
Dzięki! O wiele lepsze niż niewiarygodne „dmesg | grep” (bufor pierścieniowy ...)
Dominik R
Chciałbym znaleźć rozwiązanie, które znalazłoby także vethinne sterowniki wirtualne. IMHO jedynym rozwiązaniem jest użycie ethtoollub lshw.
pevik
8

sudo lspci -vpokaże to. lubię to:

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

Możesz również połączyć to z grepnastępującymi:

$ sudo lspci -v | grep -A 20 VGA
mlibre
źródło
4

Jeśli chcesz po prostu używać sysfs i nie chcesz zajmować się wszystkimi tymi poleceniami, które ostatecznie i tak zaglądają do sysfs, oto jak:

powiedzmy, co to jest moduł / sterownik dla eth6? „sfc” to jest

# 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

lub jeszcze lepiej ... niech readlink rozpozna dla Ciebie ścieżkę.

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

więc ... aby dowiedzieć się, jakie są sterowniki dla wszystkich interfejsów sieciowych:

# 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
Monty Montemayor
źródło
w jaki sposób ten jest lepszy od tego, który napisał Jonathan Reinhart? unix.stackexchange.com/a/225496/47663
nhed
1
Prawdopodobnie to samo ... ale uwielbiam jedną linijkę ... Mogę łatwo dopasowywać rzeczy bezpośrednio z wiersza poleceń ... tylko dla tych, którzy nie mają czasu, aby otworzyć plik i napisać skrypt.
Monty Montemayor
3

Możesz użyć lsmodpolecenia, aby uzyskać status załadowanych modułów / sterowników urządzeń w jądrze Linux.

W przypadku konkretnego urządzenia możesz także użyć, dmesg |grep <device-name>aby uzyskać szczegółowe informacje.


źródło
1
Dzięki. Ale jeśli załadowałem dwa sterowniki dla urządzenia z tym samym głównym nr i innym mniejszym nie, a jeśli dla urządzenia używany jest tylko jeden sterownik, jak mogę znaleźć, który sterownik jest używany dla tego urządzenia?
być może to pytanie SO może ci pomóc.
Jeśli twój system nie był w trybie online tak długo, że bufor pierścieniowy został ponownie uruchomiony, na pewno dmesg | grep <nazwa urządzenia> będzie działać; nie działa to jednak na żadnym z moich routerów.
cjac
3

W przypadku urządzeń opartych na USB możesz zobaczyć nazwę sterownika, używając lsusbpolecenia:

lsusb -t

I / lub używasz, lshwktóry wylicza urządzenia we wszystkich magistralach, w tym USB, PCI itp., Dzięki czemu możesz zobaczyć, którego sterownika używa:

sudo lshw
Pierz
źródło