Tại sao Udev đang tải hai mô-đun hạt nhân cho một thiết bị USB?


0

Tôi có bộ điều hợp ethernet USB dựa trên RTL8153 , sử dụng cdc_ethertrình điều khiển theo mặc định.

Tôi muốn sử dụng r8152trình điều khiển, có thể được tải bằng cách tạo quy tắc udev tùy chỉnh, như hiện tại trong nguồn trình điều khiển linux của Realtek.

Nhưng đây là một phần khó hiểu, khi tôi cắm bộ điều hợp, cả hai mô-đun cdc_etherr8152mô-đun đều được tải. Câu hỏi của tôi là

  1. Tại sao?
  2. Làm thế nào tôi có thể tìm thấy quy tắc udev chịu trách nhiệm tải cdc_ether?
  3. Làm thế nào tôi có thể ngừng tải mô-đun đó? Vì không cần thiết phải tải hai mô-đun trong trường hợp này.

Một dòng của quy tắc Udev

ACTION=="add", DRIVER=="r8152", ATTR{idVendor}=="2357", ATTR{idProduct}=="0601", ATTR{bConfigurationValue}!="$env{REALTEK_NIC_MODE}", ATTR{bConfigurationValue}="$env{REALTEK_NIC_MODE}"

Phần DRIVER==không cần thiết.


Bạn đã thử danh sách đen? Kiểm tra /etc/modprobe.d của bạn để biết ví dụ.
Gerard H. Pille

Không, tôi không muốn đưa vào danh sách đen mô-đun, vì nó cũng được sử dụng để kết nối USB. Cảm ơn !
Arnab

Vui lòng đọc 3. cẩn thận: "mô-đun đó, không cần thiết"
Gerard H. Pille

Vâng, cảm ơn đã sửa chữa. Quên đề cập rõ ràng rằng nó không cần thiết trong trường hợp này, nhưng cần thiết cho các thiết bị khác.
Arnab

1
Phiên bản kernel của bạn là gì? lkml.org/lkml/2017/9/25/711
Gerard H. Pille

Câu trả lời:


2
ACTION=="add", DRIVER=="r8152", ATTR{idVendor}=="2357", ATTR{idProduct}=="0601", ATTR{bConfigurationValue}!="$env{REALTEK_NIC_MODE}", ATTR{bConfigurationValue}="$env{REALTEK_NIC_MODE}"

Ý nghĩa của quy tắc udev này như sau: "Khi một thiết bị có idVendorgiá trị 2357 và idProductgiá trị 0601 (và được quản lý bởi trình điều khiển" r8152 ") được thêm vào hệ thống, nếu đó bConfigurationValuekhông phải là bất kỳ giá trị nào được xác định trong biến môi trường REALTEK_NIC_MODE, hãy đặt bConfigurationValuethành giá trị đó. "

Nói cách khác, quy tắc udev này không tải trình điều khiển r8152, nó sẽ chuyển thiết bị sang chế độ chính xác cho trình điều khiển đó nếu cần.

Khi một thiết bị mới được thêm vào, nhân Linux về cơ bản chạy modprobevới ID phần cứng (và một số thứ khác) của thiết bị được mã hóa trong "tên" của mô-đun mà nó yêu cầu. "Tên" này sau đó được so sánh bằng các modprobechuỗi ký tự đại diện được nhúng vào mỗi mô-đun dưới dạng bí danh mô-đun. Các depmodlệnh tập hợp lên các tên bí danh và lưu trữ chúng vào /lib/modules/<kernel version>/modules.alias[.bin]để tìm kiếm nhanh chóng. Bạn có thể xem các chuỗi bí danh được nhúng vào các mô-đun hạt nhân bằng modinfolệnh.

Đối với bộ điều hợp ethernet USB của bạn, "tên" là một cái gì đó giống như usb:v2357p0601d.... Thật không may, cdc_ethermô-đun có một bí danh ký tự đại diện cũng sẽ phù hợp với nó.

Bất kỳ bí danh nào được xác định trong /etc/modprobe.dsẽ được ưu tiên hơn các bí danh được nhúng vào chính các mô-đun. Vì vậy, bạn có thể chỉ định một bí danh sẽ khớp với bộ điều hợp ethernet của bạn và khiến r8152mô-đun được tải thay thế.

Hãy thử thêm nó dưới dạng /etc/modprobe.d/usbnic.conf:

alias usb:v2357p0601d*dc*dsc*dp*ic*isc*ip*in* r8152

Sau đó chạy depmod -abằng root, rút ​​bộ điều hợp ethernet USB, rút ​​cả hai r8152cdc_ethercác mô-đun, cắm lại bộ điều hợp ethernet và xem điều gì xảy ra. Nếu chỉ có mô-đun r8152 được tải, tốt.

Nếu cdc_ethervẫn được tải, bí danh có thể cần phải cụ thể hơn (nghĩa là một hoặc nhiều dấu sao trong đó cần phải được thay thế bằng các giá trị thực tế, bất kể chúng có thể là gì) để bí danh này là cụ thể nhất và do đó trận đấu "hay nhất".

Cập nhật: Dưới đây là mô tả về định dạng bí danh mô-đun: http://people.skolelinux.org/pere/blog/Modalias_strings___a_prreal_way_to_map__ ware__to_hardware.html


Đó chính xác là những gì tôi đang tìm kiếm, giải pháp hoàn hảo. Nhưng tôi có một câu hỏi, làm thế nào bạn tính được bí danh ký tự đại diện?
Arnab

1
Nếu bạn làm modinfo <any USB device driver>bạn sẽ thấy một hoặc nhiều ví dụ. Hai yếu tố đầu tiên rõ ràng là vID endor và Roduct p, và phần còn lại chỉ theo định dạng và thay thế bất kỳ biến nào khác bằng ký tự đại diện. Mô tả đầy đủ tại đây: people.skolelinux.org/pere/blog/ từ
telcoM

3

Có một bản vá cho vấn đề này trong các hạt nhân gần đây: https://lkml.org/lkml/2017/9/25/711


Bản vá đó dường như không khớp với ID nhà cung cấp & sản phẩm của thiết bị gửi bài gốc, vì vậy tôi e rằng nó sẽ không có hiệu lực. Nhưng nó sẽ là một mô hình tuyệt vời để tạo ra một bản vá tương tự cho thiết bị của OP.
telcoM
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.