이 udev 규칙이 실행되지 않는 이유는 무엇입니까?

이 udev 규칙이 실행되지 않는 이유는 무엇입니까?

나는 다음과 같은 매우 기본적인 udev 규칙을 가지고 있습니다 /etc/udev/rules.d/99-sd.rules.

ACTION=="add", SUBSYSTEM=="mmc", KERNEL=="mmcblk0p1", RUN+="/usr/bin/echo 'aa' > /tmp/test"

목표는 testSD 카드를 삽입하고 해당 p1파티션을 인식하면 파일을 생성하는 것입니다.

이제 이 규칙을 만든 후 모든 작업을 수행했습니다.

 sudo udevadm control --reload-rules
 sudo systemctl restart udev
 sudo reboot

그런데 SD카드를 삽입해도 파일이 생성되지 않습니다. (SD 카드도 작동하며 마운트할 수도 있습니다.)

여기서 문제가 무엇입니까? 이것은 나를 미치게 만들고 무엇이 잘못되었는지 알 수 없습니다. udevadm을 통해 SD 카드에 대한 커널 이벤트를 볼 수 있습니다. 그런데 왜 내 파일이 생성되지 않습니까?

운영 체제: 데비안 불스아이

이것은 dmesg입니다:

[   85.299246] mmc0: new ultra high speed SDR104 SDXC card at address aaaa
[   85.301507] mmcblk0: mmc0:aaaa SN64G 59.5 GiB
[   85.307164]  mmcblk0: p1

/tmp"bash"를 사용해봐도 비어 있습니다.

$ cat /etc/udev/rules.d/99-sd.rules
ACTION=="add", SUBSYSTEM=="mmc", KERNEL=="mmcblk0p1", RUN+="/bin/bash -c '/usr/bin/echo aa > /tmp/test'"

udevadm monitor:

$ sudo udevadm monitor
monitor will print the received events for:
UDEV - the event which udev sends out after rule processing
KERNEL - the kernel uevent

KERNEL[191.651922] add      /devices/platform/fe2b0000.dwmmc/mmc_host/mmc0/mmc0:aaaa (mmc)
KERNEL[191.655196] add      /devices/virtual/bdi/179:96 (bdi)
UDEV  [191.656246] add      /devices/platform/fe2b0000.dwmmc/mmc_host/mmc0/mmc0:aaaa (mmc)
UDEV  [191.656604] add      /devices/virtual/bdi/179:96 (bdi)
KERNEL[191.657702] add      /devices/platform/fe2b0000.dwmmc/mmc_host/mmc0/mmc0:aaaa/block/mmcblk0 (block)
KERNEL[191.657862] add      /devices/platform/fe2b0000.dwmmc/mmc_host/mmc0/mmc0:aaaa/block/mmcblk0/mmcblk0p1 (block)
KERNEL[191.658527] bind     /devices/platform/fe2b0000.dwmmc/mmc_host/mmc0/mmc0:aaaa (mmc)
UDEV  [191.689858] add      /devices/platform/fe2b0000.dwmmc/mmc_host/mmc0/mmc0:aaaa/block/mmcblk0 (block)
UDEV  [191.732813] add      /devices/platform/fe2b0000.dwmmc/mmc_host/mmc0/mmc0:aaaa/block/mmcblk0/mmcblk0p1 (block)
UDEV  [191.735289] bind     /devices/platform/fe2b0000.dwmmc/mmc_host/mmc0/mmc0:aaaa (mmc)

답변1

실행할 명령은 exec()셸용이 아니라 셸용이므로 >다음과 같은 명령을 추가할 수 없습니다.

RUN+="/bin/bash -c '/usr/bin/echo aa > /tmp/test'"

작은따옴표 안에 공백을 인용해야 하는 경우 이스케이프된 큰따옴표를 사용할 수 있습니다(예: ) \"abc def\".

로그에서 더 많은 디버그 정보를 얻으려면 임시를 사용하여 디버그 수준을 설정하고 sudo udevadm control --log-priority=debug테일 로그를 사용한 sudo journalctl -f다음 카드를 삽입하면 RUN 명령이 표시됩니다. 재설정 레벨을 사용하십시오 sudo udevadm control --log-priority=info.

답변2

나는 udev가 셸의 RUN에서 명령을 실행한다고 생각하지 않으므로 >생각하는 것을 의미하지 않습니다. (/usr/bin/echo에 매개변수로 전달될 수도 있습니다)

자신만의 쉘 스크립트를 작성하여 파일을 생성하거나 다음과 같은 사용자를 사용해 보십시오.logger

또한 장치가 감지된 후 udev가 파티션 스캔을 트리거하고 새 장치 노드를 채운 후 발생하는 파티션 모양에 대해 트리거하는 것이 일반적입니다. 이것이 큰 의미인지는 모르겠습니다. 다행히도 udevadm monitor저장 장치를 연결하면 udev가 어떤 알림을 받았는지 확인할 수 있습니다.

관련 정보