디스크 마운트에 대한 Udev 규칙이 작동하지 않습니다.

디스크 마운트에 대한 Udev 규칙이 작동하지 않습니다.

/etc/udev/rules.d/81-external-disk.rules에 다음이 있습니다.

ENV{ID_FS_UUID}=="6826692e-79f4-4423-8467-cef4d5e840c5", RUN{program}+="/bin/mount -o nofail,x-systemd.device-timeout=1 -t ext4 -U 6826692e-79f4-4423-8467-cef4d5e840c5 /backup/external"

실행 후:

udevadm control --reload ; udevadm trigger /dev/sdb1

아무것도 하지 않습니다. 그러나 /bin/touch /tmp/xyz 등에 대한 마운트 명령을 변경하면 작동합니다.

버전:

[root@helsinki rules.d]# rpm -qa | grep udev
libgudev1-219-19.el7_2.12.x86_64
python-pyudev-0.15-7.el7_2.1.noarch
[root@helsinki rules.d]# rpm -qa | grep systemd
systemd-libs-219-19.el7_2.12.x86_64
systemd-219-19.el7_2.12.x86_64
systemd-sysv-219-19.el7_2.12.x86_64
[root@helsinki rules.d]# cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core) 

답변1

Ubuntu 18.04에서도 동일한 문제가 발생하며 근본 원인은 동일합니다. 이 문제를 해결하기 위해 덮어쓰기 파일을 만듭니다 systemd-udevd.

sudo systemctl edit systemd-udevd

그리고 다음을 삽입하세요:

[Service]
MountFlags=shared

(Ubuntu 20.04에서는 MountFlags=shared로 바꾸세요 PrivateMounts=no.)

파일을 저장하고 다음을 실행합니다.

sudo systemctl daemon-reload
sudo service systemd-udevd --full-restart

답변2

이것은 시스템화된 기능입니다. 원래 udev명령은 다음으로 대체되었습니다 systemd-udevd(해당 매뉴얼 페이지 참조). 한 가지 차이점은 자체 파일 시스템 네임스페이스를 생성하므로 마운트가 완료되지만 주체 네임스페이스에는 표시되지 않는다는 것입니다. ( systemctl status systemd-udevd서비스의 기본 PID를 가져온 다음 파일 시스템의 내용을 보면 /proc/<pid>/mountinfo이를 확인할 수 있습니다.)

프라이빗 파일 시스템 네임스페이스 대신 공유 파일 시스템 네임스페이스를 사용하도록 되돌리려면 다음 /etc/systemd/system/systemd-udevd.service내용이 포함된 파일을 생성하세요.

.include /usr/lib/systemd/system/systemd-udevd.service
[Service]
MountFlags=shared 

/etc/systemd/system/systemd-udevd.service.d/myoverride.conf또는 마지막 두 줄만 포함하는 새 디렉터리와 파일, 즉

[Service]
MountFlags=shared

그리고 systemd-udevd 서비스를 다시 시작하십시오. 나는 아직 이것의 결과를 발견하지 못했습니다.

답변3

현재 MountFlags 설정을 기반으로 하는 몇 가지 솔루션이 있지만(이전 답변에서 언급한 대로), 개발자가 과거에 기본 설정을 변경한 것 같다는 점을 고려하면 절대적인 권한을 얻기 위해 미래에 기본 설정을 완전히 제거할 수도 있다는 점이 우려됩니다. 더 많은 통제력을 갖기 위해 계속 노력하고 있습니다.

그래서 대체 솔루션은 다음과 같습니다. /usr/local/bin에서 다음을 uysdm 파일에 넣습니다.

#!/bin/bash
umask 077
rp=`mktemp -d /tmp/uysd_XXXXX`
if [ $? != 0 ]; then
        exit 1
fi
mkfifo $rp/fifo

echo $rp/fifo "$*" >/var/uysd/fifo &
X=$!
res=`cat $rp/fifo`
stat=$?
rm -rf "$rp"
wait $X
if [ $? != 0 ]; then
        exit $?
fi
exit "$res"

그런 다음 uysdmd 파일에 넣으십시오.

#!/bin/bash
# Up yours systemd mount daemon

if [ ! -e /var/uysd/fifo ]; then
        umask 0077
        mkdir -p /var/uysd
        mkfifo /var/uysd/fifo
fi

(
        while true; do (
                IFS=" "
                read rp mt </var/uysd/fifo
                if [ "$mt" = "" ]; then
                        exit 1
                fi
                echo "$mt" | xargs mount >&2
                echo $? >"$rp"
        ) done
) &

그리고 실행 가능하게 만드세요.

/lib/systemd/system/uysdmd.service 파일을 넣으십시오.

[Unit]
Description=Up Yours Systemd udev mount daemon

[Service]
ExecStart=/usr/local/bin/uysdmd
Type=forking

[Install]
WantedBy=systemd-udevd.service

그런 다음 sudo systemctl 활성화 uysdmd.service를 실행하고 마지막으로 sudo systemctl restart systemd-udevd를 실행합니다.

이제 udev 후크에서 마운트하는 것처럼 uysdm 프로그램을 사용할 수 있습니다.

이는 uysdm 명령에서 수신된 마운트 요청 수행을 수신하는 데몬을 생성합니다.

이는 udev 이벤트가 동시에 처리되는 것이 아니라 순차적으로 처리되는 것에 의존합니다. 제 생각에는 그럴 것 같습니다.

관련 정보