udev 규칙을 디버깅하는 방법(/etc/udev/rules.d/...)

udev 규칙을 디버깅하는 방법(/etc/udev/rules.d/...)

새 기본 규칙을 만드는 중입니다.

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

포함하다:

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

저장하고 재부팅하고 SD 카드를 삽입했지만( /dev/sdb1보았던 것으로 인식됨 dmesg) 아무 일도 일어나지 않았습니다. 수동으로 하면 mount /dev/sdb1 /media작동됩니다.

udev이러한 규칙을 어떻게 제외/디버깅할 수 있나요 ?

참고: 저는 ArchLinux를 사용하고 있지만 모든 배포판에서 동일해야 합니까?

답변1

고쳐 쓰다

  • 인용하다: udev_237 -수동 udev (Ubuntu_18.04)

    RUN{type}

       ︙

      기본 샌드박스가 systemd-udevd.service에 적용되므로 네트워크에 액세스하거나 파일 시스템을 마운트/마운트 해제하는 프로그램은 udev 규칙 내에서 실행될 수 없습니다.


원래 답변디버그 힌트는 다른 udev 규칙 애플리케이션에 유효합니다.

  • 10-Jasonwryan이 언급한 것처럼 높은 숫자(90이 좋음)를 사용하세요. 따라서 귀하의 규칙은 다른 규칙에 의해 재정의되지 않습니다.

  • 실제 필요에 따라 가장 적은 수의 키를 사용하십시오. 예를 들어 !=& GOTO/를 LABEL직접 사용하는 대신==

      ACTION=="add", KERNEL=="sdb*", RUN+="/usr/bin/mount /dev/sdb1 /media"
    
  • 당신의 목표는 sdb1최소한의 블라인드 매칭을 사용하여 명령을 수정하는 것입니다.KERNEL=="sdb1"

  • 섀도우 디버그 규칙을 만드는 것이 유용하다고 생각합니다. 항상 동일한 파일에 남겨두고 필요할 때 사용하기 때문에 섀도우라고 부릅니다.

      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"
    

    노트:

    • udev-env.txt일단 생성되면 규칙이 트리거됩니다. ==해당 행하나일치하는 노드. 이 파일에 기록된 ENV는 대략 같은 시간에 생성된 2개 이상의 노드 간의 혼합일 수 있으며 이는 stdout버퍼링 문제입니다.
    • 이 디버그에 표시된 일부 환경 변수는 이 시점에서 udev 처리 일치 항목이 아직 채워지지 않았기 때문에(이전 규칙에 따라) 해당 조건에 사용하지 못할 수 있습니다. 바라보다https://www.suse.com/support/kb/doc/?id=000016106(댓글에서 @clonejo가 언급함)
  • udevadm monitor -u, udevadm test ...및 를 사용하여 udevadm trigger ... 이벤트를 처리한 규칙을 확인하세요.

  • 스크립트 내에서는 stdout반환 값과 메시지를 저장하여 디버그 로그를 생성하고 실패한 명령을 캡처 할 수 있습니다 stderr.

답변2

이 명령을 사용하면 규칙 실행을 관찰할 수 있습니다.

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

(그리고 udevadm control --log-priority=info원래 수준으로 복원)

답변3

여기서 찾고 있는 명령은 및 매개변수를 udevadm사용하여 udev 이벤트 재검색을 트리거하고 특정 이벤트를 각각 테스트할 것입니다. triggertest

나는 EL 7에서 새로운 네트워크 장치 이름을 연구할 때 이것을 어렵게 배웠습니다. 행운을 빌어요!

답변4

RASPBERRY PI 3 B+를 사용할 때 동일한 문제가 발생했습니다. 위 명령이 도움이 될 수 있습니다. 그러나 이것은 나에게 도움이 되지 않습니다. USB 저장 장치에 연결하는 스크립트를 호출하려고 합니다. 이러한 규칙은 시스템 로그에 기록되지 않으므로 어떤 규칙이 작동했는지 실패했는지 알기 어렵습니다.

그래서 나는 다음을 수행했습니다.

(1) /etc/udev/rules.d/100-myrule.rules에 규칙 파일을 만들었습니다.

(2) 그런 다음 명령을 실행합니다.sudo /etc/init.d/udev restart

그런 다음 작동하는지 확인합니다. 유용할 수도 있고 그렇지 않을 수도 있지만 파일 시스템은 (2)의 명령이 실행될 때까지 udev에 대해 읽기 전용입니다.

관련 정보