Linux: ¿Cómo encontrar el controlador de dispositivo utilizado para un dispositivo?

59

Si mi objetivo tiene un dispositivo conectado y muchos controladores para ese dispositivo cargado, ¿cómo puedo entender qué dispositivo está usando qué controlador?

Alexios
fuente

Respuestas:

46

Solo úsalo /sys.

Ejemplo. Quiero encontrar el controlador para mi tarjeta 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

Es decir r8169.

Primero necesito encontrar coordenadas del dispositivo usando lspci; entonces encuentro el controlador que se usa para los dispositivos con estas coordenadas.

Igor Chubin
fuente
35
lspci -vlo hace solo
poige
77
lspci -nkle mostrará los controladores adjuntos. En general, el sysfs es el lugar adecuado para buscar.
0andriy
@AndyShevchenko gracias! Este será un gran ahorro de tiempo para mí :-D
pepoluan
1
Sé que el OP solicitó "controladores en uso", pero ¿qué pasa si el controlador no está instalado o no se usa? ¿Cómo averiguarlo solo por el vendorID:productID? Además, ¿qué pasa si no es un dispositivo PCI, y solo lo ve lsusbpor ejemplo?
Dr Beco
1
@DrBeco: Pero si el controlador no está instalado, ¿qué quieres encontrar? Deberías buscar en Google en este caso
Igor Chubin
24

Aquí hay un pequeño guión que escribí :

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

Salida de muestra:

$ ~/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
fuente
1
Prefiero leer enlaces a encontrar / grepping. Buena solución
Chris Mendez
¡Gracias! Mucho mejor que el poco confiable 'dmesg | grep' (anillo de búfer ...)
Dominik R
Me gustaría encontrar una solución que encontraría también vethy otros controladores virtuales. En mi humilde opinión la única solución es utilizar ethtoolo lshw.
pevik
8

sudo lspci -vlo mostrará Me gusta esto:

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

También puedes combinarlo grepasí:

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

Si solo quiere usar sysfs y no quiere lidiar con todos estos comandos que eventualmente se ven dentro de sysfs de todos modos, así es como:

¿Cuál es el módulo / controlador para eth6? "sfc" es

# 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

o mejor aún ... deja que readlink resuelva el camino por ti.

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

entonces ... para descubrir cuáles son los controladores para todas sus interfaces de red:

# 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
fuente
¿Cómo es este mejor que el que Jonathan Reinhart publicó? unix.stackexchange.com/a/225496/47663
nhed
1
Probablemente sea lo mismo ... pero me encanta un trazador de líneas ... Puedo ajustar las cosas fácilmente en la línea de comando ... solo para aquellos que no tienen tiempo para abrir un archivo y escribir un guión.
Monty Montemayor
3

Puede usar el lsmodcomando para obtener el estado de los módulos / controladores de dispositivos cargados en el kernel de Linux.

Para un dispositivo específico, también puede usar dmesg |grep <device-name>para obtener los detalles.


fuente
1
Gracias. Pero si cargué dos controladores para un dispositivo con el mismo no mayor y no menor diferente, y si solo se usa un controlador para el dispositivo, ¿cómo puedo encontrar qué controlador se usa para ese dispositivo?
Quizás esta pregunta SO pueda ayudarte más.
Si su sistema no ha estado en línea tanto tiempo que el búfer en anillo se ha reiniciado, seguro dmesg | grep <device-name> funcionará; Sin embargo, esto no funciona en ninguno de mis enrutadores.
cjac
3

Para dispositivos basados ​​en USB, puede ver el nombre del controlador mediante el lsusbcomando:

lsusb -t

Y / o usa el lshwque enumera los dispositivos en todos los buses, incluidos USB, PCI, etc. para que pueda ver qué controlador usa:

sudo lshw
Pierz
fuente