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


15

새로운 기본 규칙을 만들고 있습니다

/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
파일 이름을 다음으로 변경하십시오 99-myrule.rules.
jasonwryan

@ Jasonwryan : 동일 : 아무 일도 일어나지 않습니다. udev 규칙 문제를 해결하는 방법? 수동으로 트리거해야합니까 (이 경우 어떻게?)
Basj

systemd정상적인 udev 동작으로 무언가를 변경 합니까 ?
Basj

1
시도해보십시오 udevadm monitor. 이것이것을
Aquarius Power

1
AFAIK는 udev가 규칙을 다시 읽도록하기 위해 재부팅하지 않아도됩니다 ( unix.stackexchange.com/a/39371/44760 참조 ). 나는 udev 디버깅 (실제로 가장 쉬운 작업은 아닙니다!)을 수행 udevadm test하고로 현실에 대한 규칙을 검증했습니다 udevadm info.
zagrimsan

답변:


11
  • 10-jasonwryan이 언급했듯이 높은 번호 매기기 (90의 좋음)를 사용하십시오. 따라서 규칙은 다른 규칙에 우선하지 않습니다.
  • 필요한만큼 최소 키를 사용하십시오. 예를 들어, !=& GOTO/ LABEL대신 직접 사용하십시오.==

    ACTION=="add", KERNEL=="sdb*", RUN+="/usr/bin/mount /dev/sdb1 /media"
    
  • 당신의 목표는 sdb1고정 명령으로,KERNEL=="sdb1"

  • 섀도 디버깅 규칙을 만드는 것이 유용하다는 것을 알았습니다. 항상 같은 파일에 그대로두기 때문에 shadow라고했습니다. 그래서 필요할 때 사용합니다.

    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버퍼링 문제입니다.

  • 사용 udevadm monitor -u, udevadm test ...그리고 udevadm trigger ... 규칙이 이벤트를 처리하는 확인합니다.

  • 스크립트 내부에는 반환 값 stdoutstderr메시지를 저장하여 디버그 로그를 작성하고 실패한 명령을 잡을 수 있습니다.

최신 정보:

  • 참조 : udev_237- man udev (우분투 _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
매우 유용한. 몇 가지 주석은 udevadm test...환경 변수 만 표시 하며 이러한 다른 설정을 찾는 데 ATTRS사용할 수 있습니다 udevadm info $DEVICE.
Att Righ

1
에서 udevadm info반환 장치 트리 장치 및 그 부모 장치 사이의 설정을 구별 할주의 (속성 재정의 (override)되지 않는 경우 상속 된 것 같다). 필자의 경우 하위 시스템이 잘못되었습니다.
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."실제로 일어나는 일을 추적 할 방법 이 없습니까?
MarcH

@MarcH, udevadm monitor -u이벤트 / 조건을 확인 udevadm trigger ...하고 동작을 테스트하는 데 사용할 수 있습니다 .
user.dz

@MarcH이지만 스크립트 안에는 디버그 로그를 만들고 실패한 명령을 잡는 데 달려 있습니다 (반환 값을 stdout & stderr 메시지로 저장하여).
user.dz

1

나는 당신이 찾고있는 명령이 여기 있다고 생각합니다 udevadm. triggertest매개 변수를 사용하여 udev 이벤트의 재검색을 트리거하고 각각 특정 이벤트를 테스트합니다.

EL 7에서 명명 된 새로운 네트워크 장치를 사용하여이 문제를 해결하는 데 어려움을 겪었습니다. 행운을 빌어 요!


1
  1. udev 규칙 파일 작성

    sudo nano /etc/udev/rules.d/99-removable-sd.rules
    
  2. udisk에 자동 마운트를 지시하는 규칙 추가

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

    ATTRS{type}=="SD" 다른 유형을 사용하는 경우 필요하지 않을 수 있습니다.

  3. 새로 고침 규칙

    sudo udevadm control -R
    
  4. 꺼내서 다시 넣습니다.

참조 : Archlinux Wiki : 이동식으로 처리해야하는 일부 장치는 그렇지 않습니다


0

RASPBERRY PI 3 B +와 동일한 문제가 발생했습니다. 위의 명령이 도움이 될 수 있습니다. 그러나 그것은 도움이되지 않았습니다. USB 저장 장치를 삽입 할 때 스크립트를 호출하려고했습니다. 규칙은 syslog에 기록되지 않으므로 어떤 규칙이 작동했는지 또는 어떤 규칙이 실패했는지 이해하기가 매우 어려워집니다.

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

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.