Linux: Làm thế nào để tìm trình điều khiển thiết bị được sử dụng cho một thiết bị?


59

Nếu mục tiêu của tôi có một thiết bị được kết nối và nhiều trình điều khiển cho thiết bị đó được tải, làm sao tôi có thể hiểu thiết bị nào đang sử dụng trình điều khiển nào?

Câu trả lời:


46

Chỉ cần sử dụng /sys.

Thí dụ. Tôi muốn tìm trình điều khiển cho thẻ Ethernet của mình:

$ 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

Đó là r8169.

Đầu tiên tôi cần tìm tọa độ của thiết bị bằng cách sử dụng lspci; sau đó tôi tìm trình điều khiển được sử dụng cho các thiết bị có tọa độ này.


35
lspci -vtự nó làm
poige

7
lspci -nksẽ hiển thị cho bạn trình điều khiển đính kèm. Nói chung các sysfs là nơi thích hợp để tìm kiếm.
0andriy

@AndyShevunn cảm ơn bạn! Đây sẽ là một công cụ tiết kiệm thời gian tuyệt vời cho tôi :-D
pepoluan

1
Tôi biết OP đã yêu cầu "trình điều khiển đang được sử dụng", nhưng nếu trình điều khiển không được cài đặt và không được sử dụng thì sao? Làm thế nào để tìm ra chỉ bằng cách vendorID:productID? Ngoài ra, nếu đó không phải là thiết bị PCI và bạn chỉ nhìn thấy nó trong lsusbví dụ thì sao?
Bác sĩ Beco

1
@DrBeco: Nhưng nếu trình điều khiển chưa được cài đặt, bạn muốn tìm gì? Bạn chỉ nên google trong trường hợp này
Igor Chubin

24

Đây là một kịch bản nhỏ tôi đã viết :

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

Đầu ra mẫu:

$ ~/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
Tôi rất thích đọc các liên kết để tìm / grepping. Giải pháp tốt đẹp.
Chris Mendez

Cảm ơn! Cách tốt hơn so với 'dmesg | grep' không đáng tin cậy (bộ đệm vòng ...)
Dominik R

Tôi muốn tìm giải pháp cũng sẽ tìm thấy vethvà các trình điều khiển ảo khác. IMHO giải pháp duy nhất là sử dụng ethtoolhoặc lshw.
pevik

8

sudo lspci -vsẽ hiển thị nó như thế này:

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

Bạn cũng có thể kết hợp nó grepnhư thế này:

$ sudo lspci -v | grep -A 20 VGA

4

Nếu bạn chỉ muốn sử dụng sysfs một cách đơn giản và không muốn xử lý tất cả các lệnh này mà cuối cùng sẽ nhìn vào bên trong sysfs, đây là cách:

nói, mô-đun / trình điều khiển cho eth6 là gì? "sfc" đó là

# 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

hoặc tốt hơn nữa .. hãy để readlink giải quyết đường dẫn cho bạn.

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

vì vậy ... để tìm ra các trình điều khiển cho tất cả các giao diện mạng của bạn là gì:

# 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

Làm thế nào là cái này tốt hơn so với một Jonathan Reinhart đăng? unix.stackexchange.com/a/225496/47663
nhed

1
Có lẽ giống nhau ... nhưng tôi yêu một lớp lót ... Tôi có thể dễ dàng điều chỉnh mọi thứ ngay tại dòng lệnh ... chỉ dành cho những người không có thời gian để mở tệp và viết kịch bản.
Monty Montemayor

3

Bạn có thể sử dụng lsmodlệnh để lấy trạng thái của trình điều khiển mô-đun / thiết bị được tải trong Hạt nhân Linux.

Đối với một thiết bị cụ thể, bạn cũng có thể sử dụng dmesg |grep <device-name>để nhận thông tin chi tiết.


1
Cảm ơn. Nhưng nếu tôi đã tải hai trình điều khiển cho một thiết bị có cùng số không và không chính khác nhau và nếu chỉ có một trình điều khiển đang được sử dụng cho thiết bị, làm thế nào tôi có thể tìm thấy trình điều khiển nào được sử dụng cho thiết bị đó?

có lẽ câu hỏi SO này có thể giúp bạn hơn nữa.

Nếu hệ thống của bạn không trực tuyến quá lâu mà bộ đệm vòng đã khởi động lại, chắc chắn dmesg | grep <tên thiết bị> sẽ hoạt động; điều này không hoạt động trên bất kỳ bộ định tuyến của tôi, tuy nhiên.
cjac

3

Đối với các thiết bị dựa trên USB, bạn có thể thấy tên trình điều khiển bằng cách sử dụng lsusblệnh:

lsusb -t

Và / hoặc bạn sử dụng lshwliệt kê các thiết bị trên tất cả các xe buýt bao gồm USB, PCI, v.v. để bạn có thể xem nó sử dụng trình điều khiển nào:

sudo lshw
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.