Làm thế nào để kiểm tra nếu một quy tắc udev bị sa thải?


15

Tôi đang cố gắng làm quen với udev, trong Ubuntu 13.10.

Đây là quy tắc 95.usbbackup.rules đơn giản đầu tiên của tôi:

ACTION=="add", SUBSYSTEMS="usb", RUN+="/usr/local/bin/my_backup.sh"

và đây là tập lệnh (đã được chmodded + x) my_backup.sh:

#!/bin/bash
touch /tmp/test

Không có gì xảy ra khi tôi cắm vào ổ đĩa ngoài. Làm cách nào tôi có thể kiểm tra (nhật ký, lệnh, bất cứ thứ gì) nếu quy tắc được kích hoạt?

Cảm ơn rất nhiều


2
Tôi nghĩ bạn có ý nghĩa SUBSYSTEMS=="usb". Tức là nhân đôi ==kiểm tra sự bằng nhau thay vì đơn lẻ =gán giá trị cho khóa.
Lqueryvg

Câu trả lời:


5

Tôi khá chắc chắn rằng điều này sẽ làm việc. Bạn đã tải lại quy tắc udev của bạn sau khi chỉnh sửa quy tắc của bạn?

udevadm control --reload-rules && udevadm trigger làm gốc.


Tôi đã thực hiện một quy tắc hẹp hơn: KERNEL == "sdb", hoạt động. Có phải udev chỉ xử lý các quy tắc xác định một số phần cứng duy nhất?
pouzzler

Không, hãy thử KERNEL!="sdz*"và bạn sẽ nhận được mọi thứ (ngoại trừ sdz [1-9])
Redsandro

5
Điều này không thực sự trả lời câu hỏi. Làm thế nào để bạn biết nếu các quy tắc kích hoạt?
DanielSank

1
Bạn biết vì kịch bản được chạy. Bạn có thể làm cho nó ghi vào một logfile. Ngoài raudevadm monitor
Redsandro

2

Bạn có thể đưa ra một lệnh như root như thế này:

màn hình udevadm

Nó sẽ hiển thị khi một quy tắc đã bị sa thải.


11
udevadm monitorchỉ hiển thị các sự kiện udev, nhưng không hiển thị nếu một quy tắc tương ứng được kích hoạt. Tuy nhiên, bạn có thể tìm kiếm sự kiện sẽ kích hoạt quy tắc, nhưng sau đó bạn không biết liệu quy tắc của mình có hoạt động không.
F.Raab

2

Tôi đang chạy kernel 3.0.35, nhưng cách sau đây phù hợp với tôi.

Để có được đường dẫn cho thiết bị, bạn có thể làm một cái gì đó như thế này:

udevadm info --name /dev/sda1 --query all

Bạn sẽ nhận được nhiều thông tin hơn bạn cần nhưng bạn quan tâm đến DEVPATH. Sau đó, để xem những gì quy tắc udev được thực thi, bạn chạy này:

udevadm test DEVPATH

Tôi không nghĩ rằng điều này thực sự thực thi các quy tắc, tài liệu nói rằng điều này 'mô phỏng' các sự kiện cho thiết bị đã cho. Để có thêm thông tin, hãy xem trang người đàn ông này: https://www.freedesktop.org/software/systemd/man/udevadm.html


1

Với udev / systemd phiên bản 241 và tương tự, như root:

udevadm control --log-priority=debug
journalctl -f

Hoặc để làm cho nó vĩnh viễn, một lần nữa là root:

vi /etc/udev/udevd.conf
systemctl restart systemd-udevd
journalctl -f

PS: câu trả lời sai thường xuyên nhất nhưng IMHO trông giống như:

udevadm -d kiểm tra / thiết bị / trong đó / là / của tôi / thiết bị | & ít hơn

... nhưng điều này có một số vấn đề. Những cái chính:

  • where/is/my/device? Vô dụng, phức tạp và dễ bị lỗi.

  • So sánh các câu trả lời cũ với đầu ra phiên bản udev gần đây, udevadm testdường như hiển thị ít thông tin hơn trước đây.

  • udevadm -d test chỉ là một mô phỏng ! Mỗi khi nó cảnh báo:

    Chương trình này chỉ dành cho gỡ lỗi, nó không chạy bất kỳ chương trình nào được chỉ định bởi khóa RUN. Nó có thể hiển thị kết quả không chính xác, bởi vì một số giá trị có thể khác hoặc không có sẵn khi chạy mô phỏng.

udevadm test là để phát triển một quy tắc mới, nó không phải để khắc phục các quy tắc bị hỏng, bị thiếu hoặc bị ghi đè.


0

Tôi đã gặp vấn đề tương tự với Raspberry Pi 3 B +. Tôi đã cố gắng gọi một tập lệnh khi lắp thiết bị lưu trữ USB. Các quy tắc không được đăng nhập vào syslog, vì vậy rất khó để hiểu quy tắc nào hoạt động hoặc quy tắc nào thất bại.

Vì vậy, tôi đã làm như sau:

  1. Tôi đã tạo tệp quy tắc của mình trong /etc/udev/rules.d/100-myrule.rules
  2. Sau đó tôi chạy lệnh sudo /etc/init.d/udev restart

và khi tôi kiểm tra, nó đã hoạt động.

Một phần thông tin, có thể có hoặc không hữu ích, đó là các hệ thống tập tin chỉ đọc cho udev cho đến khi lệnh trong bước 2 được thực thi.


0

udevadm test $(udevadm info --query=path --name=device_name)sẽ cho bạn biết các lệnh nào sẽ được thực thi trên thiết bị cắm vào, trích dẫn các udevquy tắc liên quan. Ví dụ:

# udevadm test /block/sdd
...
udev_rules_apply_to_event: PROGRAM '/sbin/multipath -c /dev/sdd' /lib/udev/rules.d/40-multipath.rules:11
...
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.