새 기본 규칙을 만드는 중입니다.
/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 이벤트 재검색을 트리거하고 특정 이벤트를 각각 테스트할 것입니다. trigger
test
나는 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에 대해 읽기 전용입니다.