Quy tắc Udev để phù hợp với bất kỳ thiết bị lưu trữ usb


10

Làm cách nào tôi có thể thực hiện udevcác quy tắc cho bất kỳ thiết bị lưu trữ dung lượng lớn USB nào được cắm, không chỉ cho một thiết bị cụ thể? Những gì nên được thay đổi trong idVendor, và idProduct?

 ACTION=="add", SUBSYSTEM=="usb", SYSFS{idVendor}=="0204", SYSFS{idProduct}=="6025",
     RUN+="/home/workspace/bash_script.sh"

Câu trả lời:


7

Một thiết bị lưu trữ nằm trong blockhệ thống con, vì vậy bạn sẽ muốn SUBSYSTEM=="block"theo quy tắc của mình, như thế này:

ACTION=="add", KERNEL=="sd?", SUBSYSTEM=="block", ENV{ID_BUS}=="usb", \
    RUN+="/path/to/script"

Nếu bạn đang sử dụng systemd, bạn có thể chạy một systemdthiết bị mỗi lần thiết bị lưu trữ USB được thêm vào. Tạo tệp đơn vị, ví dụ /etc/systemd/system/my-usb-rule.service:

[Service]
Type=oneshot
ExecStart=/path/to/script

và quy tắc, ví dụ /etc/udev/rules.d/85-my-usb-rule.rules:

ACTION=="add", KERNEL=="sd?", SUBSYSTEM=="block", ENV{ID_BUS}=="usb", \
    ENV{SYSTEMD_WANTS}="my-usb-rule.service"

Bây giờ udevsẽ kích hoạt my-usb-rule.service(lần lượt sẽ thực thi tập lệnh của bạn) trên bất kỳ sự kiện thêm thiết bị lưu trữ usb nào .


Đừng quên tải lại cấu hình sau khi bạn chỉnh sửa các quy tắc / đơn vị:

udevadm control --reload
systemctl daemon-reload

Khi tôi thêm bộ lưu trữ lớn USB, tôi muốn hành động trên (các) phân vùng mà nó chứa. Ở cấp độ udev tôi có thể thấy các sự kiện từ 4 hệ thống con: usb, scsi, bdi và block (theo thứ tự này). 3 cái đầu tiên không sử dụng được, vì phân vùng chưa được biết. Sự kiện chặn có ID_BUS = scsi, không phải usb như trong ví dụ mã của bạn. Tôi không thấy bất kỳ thuộc tính phù hợp nào trong sự kiện khối, điều đó sẽ cho tôi biết đó có phải là bộ lưu trữ lớn USB hay không. (Điều tra được thực hiện bằng cách sử dụng màn hình udevadm và thông tin udevadm). Trừ khi tôi có thể tin tưởng rằng ID_BUS = scsi không thể là thứ gì khác ngoài bộ nhớ lưu trữ lớn USB.
Gewe Uwe

@UweGeuder - không có gì ngăn bạn sử dụng tên thiết bị làm đối số cho chương trình của bạn và dựa trên hành động đó trên các phân vùng ...
don_crissti

Chà, trong các sự kiện USB, tên thiết bị có dạng như / dev / bus / usb / 002/040. Không chắc chắn những gì để làm với điều đó trong chương trình của tôi. Trong các sự kiện Chặn, tên thiết bị là một cái gì đó như / dev / sdb hoặc / dev / sdb1. Đó là những gì tôi muốn, nhưng bây giờ tôi trở lại vấn đề ID_BUS = scsi. Tôi có thêm một chút: Có một tệp quy tắc 80-udisk2, có thêm thuộc tính ID_DRIVE_THUMB. Không chắc nó mạnh đến mức nào, dường như có rất ít nhà cung cấp được liệt kê. Tệp quy tắc của tôi được gọi là 70- *, vì vậy, như mong đợi / dev / sdb của tôi không khớp. Thật kỳ lạ / dev / sdb1 phù hợp, mặc dù quy tắc của tôi chạy trước.
Uwe Geuder

1
Ah tôi chỉ lưu ý câu hỏi ban đầu là bất kỳ ổ lưu trữ lớn USB nào . Điều đó sẽ làm việc với quy tắc SUBSYSTEM=="block", SUBSYSTEMS=="usb"(lưu ý sự khác biệt với S ). Tôi nghi ngờ nó luôn có thể làm việc với ENV{ID_BUS}=="usb"câu trả lời ban đầu, bởi vì tôi thấy giá trị scsi ở đây. Nhưng tôi đang làm việc với một vấn đề hơi khác so với yêu cầu ban đầu, tôi muốn bất kỳ thanh USB nào (Pendrive), nhưng không có ổ đĩa ngoài.
Uwe Geuder

1
Trên thực tế, sự thật khó chịu là ENV{ID_BUS}giá trị không giống nhau trên tất cả các hệ thống. Hôm qua tôi đã làm việc trên một hệ thống cũ hơn với udev 210 (tôi tin. Không thể kiểm tra ngay bây giờ vì máy không có trên internet), Có giá trị là scsi . Bây giờ, tôi đang dùng máy mới hơn với udev 228 và giá trị là usb . Đối với cùng một thanh USB, tôi đang mang nó bên mình. (không chắc chắn cho dù phiên bản udev là yếu tố liên quan ở đây, cũng có thể là hạt nhân hoặc bất kỳ quy tắc udev gói cài đặt khác, e, g, udisks2) Tuy SUBSYSTEM=="block", SUBSYSTEMS=="usb"(lưu ý S ) có thể di động và an toàn.
Gewe Uwe
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.