udev 규칙을 사용하려면 /dev/sda와 같은 경로를 얻어야 합니다.

udev 규칙을 사용하려면 /dev/sda와 같은 경로를 얻어야 합니다.

./dev/sd*

목표는 echo $...... > /var/.....일단 값이 저장되면 RUN +=를 사용하여 다른 작업을 수행하는 것입니다... 필요할 때 꺼내겠습니다. 내 설명이 명확하길 바랍니다. 감사합니다.

이 예에서는 현재 디스크에 대한 경로를 얻으려고 합니다 /dev/sd*. udev 규칙을 사용하여 작업을 수행합니다.

SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device", RUN+="/bin/device_added.sh" SUBSYSTEM=="usb", ACTION=="remove", ENV{DEVTYPE}=="usb_device", RUN+="/bin/device_removed.sh" 

문제는 echo $KERNEL > my-file을 사용하여 검색할 때 현재 디스크의 경로를 찾을 수 없다는 것입니다. 방금 도착한 디스크에서 smartctl 명령을 실행하려면 이 변수가 필요합니다.

device_add.sh의 목표는 마지막으로 연결된 디스크로 smartctl -a /dev/sd*바꾸는 것을 제외하고 명령을 시작하는 것입니다. 이제 이것이 내 문제입니다. 규칙에 의해 감지된 /dev/sd*마지막으로 연결된 디스크/경로를 복원해야 합니다 .udev

답변1

질문을 제대로 이해했는지 아직도 잘 모르겠습니다.

문제는 "udev 규칙 내에서 RUN을 사용하여 프로그램을 실행할 때 해당 이벤트에 대해 커널이 생성한 실제 장치 노드에 어떻게 액세스합니까?"입니다. 그렇다면 하드 드라이브를 연결하거나 제거할 때 실제 커널 장치가 포함된 KERNEL환경 변수(참고자료 참조 )를 확인하세요.man udevsda

이것이 당신이 원하는 것이 아니라면 설명해주세요이게 왜 필요해요?/dev/sda, 즉 어떤 목적으로 어떤 작업을 수행하려는지 나타냅니다 . 또한 읽어보세요XY 문제.


문제는 실제 디스크에 대한 이벤트를 추가하는 대신 USB 장치에 대한 이벤트를 일치시키는 것입니다(USB 수준에서 장치와 통신할 수 있으며 디스크에만 국한되지 않음). 당신은 다음과 같은 것이 필요합니다

KERNEL=="sd*", SUBSYSTEMS=="usb", ACTION=="add", ...

DEVTYPE이 없거나 ENV{DEVTYPE}="disk".

자세히 읽어보면 새로 생성된 노드에 대한 전체 경로를 포함해야 하는 man udev환경 변수도 있습니다 DEVNODE(테스트하지는 않았습니다).

마지막으로 명령을 실행하려면 smartctl다음 단락을 기억하세요.RUNman udev

이는 매우 단기적으로 실행되는 포그라운드 작업에만 사용할 수 있습니다. 장기 실행 이벤트 프로세스는 해당 장치 또는 슬레이브 장치에 대한 모든 추가 이벤트를 차단할 수 있습니다.

데몬이나 기타 장기 실행 프로세스를 시작하는 것은 udev에 적합하지 않습니다. 분리 여부에 관계없이 분기된 프로세스는 이벤트 처리가 완료된 후 무조건 종료됩니다.

그래서 그것은 달려있다무엇당신이 하고 싶은 일은 smartctl그것이 올바른 장소일 수도 있고 아닐 수도 있습니다.


귀하의 규칙을 시도했지만 작동하지 않고 디스크가 인식되지 않으며 스크립트가 실행되지 않습니다. 나는 그것을 시도했지만 KERNEL=="sd[a-z]"작동하지 않았습니다.

그러면 규칙의 다른 부분이 잘못되었습니다(예: 충족되지 않은 추가 조건). udev추가 하면 /dev/sd*규칙은 다음과 같습니다.KERNEL=="sd[a-z]" ~ 할 것이다성냥.

udevadm info -p /sys/class/block/sdx질문을 편집하고 디스크를 삽입한 후 얻은 정보를 추가하십시오 /dev/sdx( sdx필요에 따라 교체). 현재 사용 중이지만 작동하지 않는 규칙과 비교해 보세요.

관련 정보