쉘 스크립트를 실행하는 udev 규칙은 스크립트 전체에서 작동하지만 완료되지 않습니다.

쉘 스크립트를 실행하는 udev 규칙은 스크립트 전체에서 작동하지만 완료되지 않습니다.

쉘 스크립트를 실행하여 디렉토리를 생성하고 장치를 읽기 전용 모드로 마운트하는 udev 규칙이 있습니다. 문제는 규칙이 실행될 때(장치를 연결할 때) 디렉토리가 생성되지만 장치가 마운트되지 않는다는 것입니다.

당연히 스크립트에 뭔가 문제가 있을 것입니다. 그러나 스크립트를 실행할 수 있으며(장치를 연결하고 udev 규칙에 의해 생성된 디렉터리를 수동으로 삭제한 다음 수동으로 스크립트를 실행할 수도 있음) 디렉터리가 생성되고 장치가 제대로 마운트됩니다.

udev 규칙의 관련 부분(파일 이름 = '10-magicusb.rules'):

ENV{MYMOUNT}=="1", RUN+="/etc/udev/scripts/romount.sh"

로마운트.sh:

#!/bin/bash
mkdir /media/sdb1
/bin/mount /dev/sdb1 -o ro,noatime /media/sdb1

기술적으로 장치 이름은 udev 규칙보다 더 높은 수준에서 유래합니다(하드코딩되지 않았습니다. 저를 믿으세요). 생성된 스크립트를 실행 romount.sh하고 해당 스크립트를 장치에 전달합니다 %k. 그러나 이는 스크립트 이후로 관련이 없어야 합니다.달리다udev에서 실행되지만 실행 중간에 중지됩니다.

내 추측으로는 여기에 타이밍 문제가 있는 것 같습니다. 규칙이 실행되면 어떤 이유로 장치를 마운트하지 못하지만 나중에 수동으로 마운트하면 시스템이 문제를 해결할 시간이 있는 것 같습니다. sleep 10bash 스크립트 상단에 아무 소용이 없도록 하나를 추가했습니다 .

미리 감사드립니다.

편집 1

David G.가 게시한 내용을 바탕으로 개선된 스크립트를 사용하여 몇 가지 테스트를 수행했는데 이제 romount.sh다음과 같습니다.

#!/bin/bash
mkdir /media/sdb1
(
    echo 'before while iteration' > /etc/udev/scripts/iteration.txt
    while [[ ! -b /dev/sdb1 ]]
    do
        sleep 1
        echo 'iteration performed' > /etc/udev/scripts/iteration.txt
    done
    /bin/mount /dev/sdb1 -o ro,noatime /media/sdb1
) &

생성된 iteration.txt파일은 before while iteration다음과 같습니다. 이는 while 루프의 조건이 트리거되지 않음을 의미합니다. 이는 실행 시간에 장치 노드를 사용할 수 있다는 의미입니다. 그렇죠?

편집 2

마침내 두 번째 답변으로 작업하게되었습니다.디스크 마운트에 대한 Udev 규칙이 작동하지 않습니다.

systemd-udevd.service에 PrivateMounts=No를 추가하면 나에게 도움이 되었습니다.

답변1

문제는 장치 노드가 생성되기 전에 스크립트가 실행된다는 것입니다. 다음과 같이 시도해 보십시오(즉, 하드 코딩 없이).

#!/bin/bash
mkdir /media/sdb1
(
    while [[ ! -b /dev/sdb1 ]]
    do
        sleep 1
    done
    /bin/mount /dev/sdb1 -o ro,noatime /media/sdb1
) &

중요한 부분은 배경 서브쉘입니다.

udev가 수행하는 작업에 따라 stdin, stdout 및 stderr에서 특정 작업을 수행해야 하는 문제가 발생할 수 있습니다. SIGHUP이나 다른 신호를 무시할 수도 있습니다(필요하지 않을 수도 있음).

관련 정보