Linux: Bagaimana menemukan driver perangkat yang digunakan untuk perangkat?

59

Jika target saya memiliki satu perangkat yang terhubung dan banyak driver untuk perangkat itu dimuat, bagaimana saya bisa mengerti perangkat apa yang menggunakan driver mana?

Alexios
sumber

Jawaban:

46

Gunakan saja /sys.

Contoh. Saya ingin mencari driver untuk kartu Ethernet saya:

$ 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

Yaitu r8169.

Pertama, saya perlu mencari koordinat perangkat menggunakan lspci; kemudian saya menemukan driver yang digunakan untuk perangkat dengan koordinat ini.

Igor Chubin
sumber
35
lspci -vmelakukannya dengan sendirinya.
poige
7
lspci -nkakan menunjukkan kepada Anda driver yang terpasang. Secara umum sysfs adalah tempat yang tepat untuk mencari.
0andriy
@AndyShevchenko terima kasih! Ini akan menjadi penghemat waktu yang hebat bagi saya :-D
pepoluan
1
Saya tahu OP meminta "driver yang digunakan", tetapi bagaimana jika driver tidak diinstal atau digunakan? Bagaimana cara mengetahuinya vendorID:productID? Juga, bagaimana jika itu bukan perangkat PCI, dan Anda hanya melihatnya lsusbmisalnya?
Dr Beco
1
@ Debeco: Tetapi jika driver tidak diinstal, apa yang ingin Anda temukan? Anda seharusnya hanya google dalam kasus ini
Igor Chubin
24

Berikut ini skrip kecil yang saya tulis :

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

Output sampel:

$ ~/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
sumber
1
Saya lebih suka membaca tautan daripada menemukan / menangkap. Solusi bagus
Chris Mendez
Terima kasih! Jauh lebih baik daripada 'dmesg | grep' (penyangga dering ...)
Dominik R
Saya ingin mencari solusi yang juga akan menemukan vethdan driver virtual lainnya. IMHO satu-satunya solusi adalah menggunakan ethtoolatau lshw.
pevik
8

sudo lspci -vakan menunjukkannya. seperti ini:

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

Anda juga dapat menggabungkannya dengan grepseperti ini:

$ sudo lspci -v | grep -A 20 VGA
mlibre
sumber
4

Jika Anda hanya ingin menggunakan sysfs dan tidak ingin berurusan dengan semua perintah ini yang akhirnya terlihat di dalam sysfs, begini caranya:

katakanlah, apa modul / driver untuk eth6? "sfc" itu

# 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

atau lebih baik lagi .. biarkan readlink menyelesaikan jalur untuk Anda.

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

jadi ... untuk mencari tahu apa driver untuk semua antarmuka jaringan Anda:

# 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
sumber
bagaimana ini lebih baik daripada yang diposting Jonathan Reinhart? unix.stackexchange.com/a/225496/47663
nhed
1
Mungkin sama ... tapi saya suka satu liner ... Saya dapat dengan mudah menyesuaikan hal-hal yang benar di baris perintah ... hanya untuk mereka yang tidak punya waktu untuk membuka file dan menulis skrip.
Monty Montemayor
3

Anda dapat menggunakan lsmodperintah untuk mendapatkan status driver modul / perangkat yang dimuat di Linux Kernel.

Untuk perangkat tertentu, Anda dapat menggunakan dmesg |grep <device-name>untuk mendapatkan detailnya juga.


sumber
1
Terima kasih. Tetapi jika saya memuat dua driver untuk perangkat dengan no mayor yang sama dan minor no yang berbeda, dan jika hanya satu driver yang digunakan untuk perangkat tersebut, bagaimana saya bisa menemukan driver mana yang digunakan untuk perangkat itu?
mungkin pertanyaan SO ini dapat membantu Anda lebih jauh.
Jika sistem Anda belum online begitu lama sehingga penyangga cincin telah dimulai kembali, tentu saja dmesg | grep <device-name> akan berfungsi; ini tidak bekerja pada router saya.
cjac
3

Untuk perangkat berbasis USB Anda dapat melihat nama driver dengan menggunakan lsusbperintah:

lsusb -t

Dan / atau Anda menggunakan lshwyang menyebutkan perangkat di semua bus termasuk USB, PCI, dll sehingga Anda dapat melihat driver yang digunakannya:

sudo lshw
Pierz
sumber