Câu trả lời:
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.
lspci -nk
sẽ 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.
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 lsusb
ví dụ thì sao?
Đâ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)
veth
và các trình điều khiển ảo khác. IMHO giải pháp duy nhất là sử dụng ethtool
hoặc lshw
.
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
Bạn có thể sử dụng lsmod
lệ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.
lspci -v
tự nó làm