Cách gỡ lỗi một quy tắc udev (trong /etc/udev/rules.d/,)


15

Tôi đang tạo một quy tắc cơ bản mới

/etc/udev/rules.d/10-myrule.rules

chứa:

KERNEL!="sdb*", GOTO="auto_mount_end"
ACTION=="add", RUN+="/usr/bin/mount /dev/sdb1 /media"
LABEL="auto_mount_end"

Tôi đã lưu, khởi động lại và lắp thẻ SD (được nhận ra bởi /dev/sdb1, tôi thấy nó với dmesg), nhưng không có gì xảy ra. Khi tôi làm thủ công mount /dev/sdb1 /media, nó hoạt động.

Làm thế nào tôi có thể khắc phục sự cố / gỡ lỗi một udevquy tắc như vậy ?

Lưu ý: Tôi đang sử dụng ArchLinux, nhưng nó có giống nhau trên bất kỳ bản phân phối nào không?


1
Thay đổi tên tệp thành 99-myrule.rules...
jasonwryan

@jasonwryan: giống nhau: không có gì xảy ra. Làm thế nào để khắc phục sự cố một quy tắc udev? Tôi có nên kích hoạt thủ công không (trong trường hợp này như thế nào?)
Basj

systemdthay đổi một cái gì đó để hành vi udev bình thường?
Basj

1
thử udevadm monitor, xem cái nàycái này
Sức mạnh của Bảo Bình

1
AFAIK không cần phải khởi động lại để yêu cầu udev đọc lại các quy tắc (xem unix.stackexchange.com/a/39371/44760 ). Tôi đã thực hiện gỡ lỗi udev của mình (đây thực sự không phải là nhiệm vụ dễ dàng nhất!) Với udevadm testcác quy tắc được xác thực chống lại thực tế với udevadm info.
zagrimsan

Câu trả lời:


11
  • 10-như được đề cập bởi jasonwryan, sử dụng đánh số cao (tốt 90). Vì vậy, quy tắc của bạn sẽ không bị ghi đè bởi một người khác.
  • Sử dụng các phím tối thiểu như bạn thực sự cần. Ví dụ, !=& GOTO/ LABEL, thay vì sử dụng trực tiếp==

    ACTION=="add", KERNEL=="sdb*", RUN+="/usr/bin/mount /dev/sdb1 /media"
    
  • Mục tiêu của bạn là sdb1với lệnh cố định, giảm thiểu trận đấu mù bằng cách sử dụngKERNEL=="sdb1"

  • Tôi thấy nó hữu ích để tạo quy tắc gỡ lỗi bóng, tôi gọi là bóng vì tôi luôn để nó ở đó trong cùng một tệp, vì vậy tôi sử dụng nó khi tôi cần.

    ACTION=="add", KERNEL=="sdb*", RUN+="/bin/sh -c 'echo == >> /home/user/Desktop/udev-env.txt; env >> /home/user/Desktop/udev-env.txt'"
    #ACTION=="add", KERNEL=="sdb*", RUN+="/usr/bin/mount /dev/sdb1 /media"
    

    Lưu ý: udev-env.txt được tạo sau đó quy tắc được kích hoạt bằng mọi cách. Dòng==tương ứng với một nút phù hợp. ENV được ghi trong tệp đó có thể là hỗn hợp giữa 2 nút trở lên, được tạo gần như cùng lúc, đó là mộtstdoutvấn đề về bộ đệm.

  • Sử dụng udevadm monitor -u, udevadm test ...udevadm trigger ... để xác minh các quy tắc xử lý các sự kiện.

  • Bên trong các tập lệnh tùy thuộc vào bạn để tạo nhật ký gỡ lỗi và bắt các lệnh không thành công, bằng cách lưu cả giá trị stdout& stderrthông báo trả về của chúng .

Cập nhật:

  • Tham khảo: udev_237 - man udev (Ubuntu_18.04)

    RUN{type}

    Note that running programs that access the network or mount/unmount filesystems is not
    allowed inside of udev rules, due to the default sandbox that is enforced on
    systemd-udevd.service.
    

1
Rất hữu ích. Một vài ý kiến udevadm test...dường như chỉ hiển thị cho bạn các biến môi trường, để giúp ATTRSbạn có thể sử dụng udevadm info $DEVICEđể tìm các cài đặt khác này.
Att Righ

1
Khi udevadm infotrả về, một cây các thiết bị hãy cẩn thận để phân biệt các cài đặt giữa một thiết bị và các thiết bị mẹ của nó (các thuộc tính dường như được kế thừa nếu không bị ghi đè). Trong trường hợp của tôi, hệ thống con đã sai.
Att Righ

udevadm test "This program is for debugging only, it does not run any program specified by a RUN key. It may show incorrect results, because some values may be different, or not available at a simulation run."Không có cách nào để theo dõi những gì đang thực sự xảy ra?
MarcH

@MarcH, bạn có thể sử dụng udevadm monitor -uđể kiểm tra các sự kiện / điều kiện & udevadm trigger ...để kiểm tra hành động của họ.
user.dz

@MarcH, nhưng bên trong các tập lệnh tùy thuộc vào bạn để tạo nhật ký gỡ lỗi và bắt các lệnh không thành công (bằng cách lưu giá trị trả về của chúng cũng các thông báo stdout & stderr).
user.dz

1

Tôi nghĩ rằng lệnh bạn đang tìm kiếm ở đây là udevadm. Bạn sẽ sử dụng triggertestcác tham số để kích hoạt quét lại các sự kiện udev và để kiểm tra một sự kiện cụ thể, tương ứng.

Tôi đã học được điều này một cách khó khăn khi đặt ra xung quanh với cách đặt tên thiết bị mạng mới trong EL 7. Chúc may mắn!


1
  1. Tạo một tệp quy tắc udev

    sudo nano /etc/udev/rules.d/99-removable-sd.rules
    
  2. Thêm quy tắc nói với udisks để tự động hóa nó

    SUBSYSTEM=="block", SUBSYSTEMS=="mmc", DRIVERS=="mmcblk", ATTRS{type}=="SD", ENV{UDISKS_AUTO}="1", ENV{UDISKS_SYSTEM}="0"
    

    ATTRS{type}=="SD" có thể không cần thiết nếu bạn đang sử dụng các loại khác nhau.

  3. Quy tắc tải lại

    sudo udevadm control -R
    
  4. Đẩy nó ra sau đó đặt lại.

Tham khảo: Archlinux Wiki: Một số thiết bị, được coi là có thể tháo rời, không


0

Tôi đã gặp vấn đề tương tự với RASPBERRY PI 3 B +, có thể các lệnh trên có thể giúp bạn. Nhưng nó KHÔNG giúp tôi. 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, do đó, 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

sau đó tôi kiểm tra nó hoạt động. Một phần thông tin, có thể hữu ích cho bạn hoặc có thể không, nhưng các hệ thống tập tin chỉ đọc cho udev cho đến khi lệnh tại (2) được thực thi.

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.