udev에 의해 호출 될 때 mount가 실행되지 않습니다


17

USB 플래시 드라이브를 마운트 및 마운트 해제하기위한 udev 규칙을 만들려고했습니다. 순간의 규칙은 매우 간단합니다.

ACTION=="add",KERNEL=="sd[b-z]",RUN+="/root/scripts/plug_flash_drive.sh %k"
ACTION=="remove",KERNEL=="sd[b-z]",RUN+="/root/scripts/unplug_flash_drive.sh %k"

plug_flash_drive.sh도 매우 간단합니다 :

device_name=$1
mount_options="umask=000,utf8"
if [ ! -e "/media/$device_name" ]; then
    mkdir "/media/$device_name"
fi
sleep 1
/usr/bin/mount "/dev/$device_name" "/media/$device_name" -o "$mount_options"

unplug_flash_drive.sh :

device_name=$1

umount "/dev/$device_name"
rmdir "/media/$device_name"

몇 가지 테스트를 수행하여 다음을 확인할 수 있습니다.

  • 플러그인하면 플래시 드라이브가 감지됩니다. 파일은 / dev에 생성됩니다
  • plug_flash_drive.sh는 udev에 의해 호출됩니다
  • 스크립트의 mkdir 부분은 작동합니다
  • 그러나 스크립트의 "마운트"부분이 실행되지 않아 내 드라이브가 마운트되지 않은 것 같습니다.
  • 커맨드 라인에서 스크립트를 호출하면 완벽하게 작동합니다.

udev가 호출 할 때 mount가 실행되지 않는 이유를 아는 사람이 있습니까?

편집 28/08/14 : 스크립트가 끝나기 전에 장치가 실제로 마운트되었는지 디버그 로그에서 확인하기 위해 스크립트 끝에 "grep -q / proc / mounts && echo success || echo failure"를 추가했습니다. udev가 스크립트를 호출하더라도 해당 시점에 장치 마운트 된 것으로 보입니다 . 따라서 실제 문제는 "udev를 통해 호출 될 때 마운트 스크립트 종료 후 내 블록 장치가 마운트 해제 된 것 같습니다"입니다.


이 점 옆에,하지만 왜 당신은 할 수 있습니다 mkdir "$mount_dir"rmdir "/media/$device_name"? 어디에 $mount_dir설정되어 있습니까?
G-Man, 'Reinstate

죄송합니다, 이것은 오타입니다. 나는 원래 코드에서 약간의 쓸모없는 변수들을 사용했고 명확성을 위해 여기에서 그것들을 제거했습니다
magva

구식 디버깅을 시도 했습니까? 예를 들면,에 의해 퍼팅 set -xvexec >> "$HOME"/mount.log 2>&1.sh파일?
G-Man, 'Reinstate

1
나는 그것을했지만, 내가 얻는 로그에 따르면, 스크립트는 udev에 의해 호출 될 때 mount가 실행됩니다. udev 호출과 명령 행 호출 간의 로그에는 차이가 없습니다 ... 실제로는 다소 당황 스럽습니다
magva

1
이 경우 명령 줄에서 실행할 때 스크립트도 실패합니다.
magva

답변:


22

systemd-udevd는 자체 파일 시스템 네임 스페이스에서 실행되며 기본적으로 udev .rules 내에서 수행 된 마운트는 호스트로 전파되지 않습니다. 기존 스크립트를 작동 시키려면 다음 MountFlags=shared에서 /usr/lib/systemd/system/systemd-udevd.service사본을 설정 하거나 (더 나은) 작성 및 편집 할 수 있습니다 ./etc/systemd/system/

자세한 man 5 systemd.exec내용은 MountFlags옵션을 참조하십시오 .


"호스트에게 전파하지 마십시오"는 무슨 뜻입니까?
sebelk

2
@sebelk user83388은 "root"네임 스페이스로 전파되지 않음을 의미합니다
Mark

2

이 글을 쓰는 시점에서 다른 답변이 잘못되었습니다 (또는 오래되었습니다).

mountSystemd 서비스에서 실행하지 않아야합니다 . 에서 MountFlagsPrivateMounts행을 주석 처리 한 후에도 systemd-udevd.serviceNTFS 또는 exFAT와 같은 FUSE 파일 시스템에서는 규칙이 작동하지 않습니다. FUSE 프로세스가 Systemd에 의해 유용하게 종료되기 때문입니다.

몇 가지 더 나은 옵션 이 나열된이 ArchWiki 페이지 를 참조하십시오 . 내 환경 설정은 udev-media-automount 라는 GitHub의 작은 프로젝트로 Udev 규칙에서 Systemd 서비스를 다시 시작합니다. 네임 스페이스 및 자식 프로세스에 대한 Udev의 여러 번거로운 제한 사항을 해결할 수있는 편리한 방법입니다.

Udev 변수를 사용하여 Systemd 장치를 시작하는 방법을 보여주는 이 anwser 도 참조하십시오 SYSTEMD_WANTS.


-1

규칙 RUN 할당 :=대신에 사용을 시도 할 수 있습니다 +=.

:=오퍼레이터는리스트의 값을 설정하고, 상기 변경을 허용하지.


고마워,하지만 여전히 마운트가 작동하지 않습니다 :(
magva

1
어쩌면 귀하의 경우는 아니지만 내 시스템 마운트에서 / bin / mount에 있습니다. "command -v mount"를 시도하십시오.
xae

1
내 시스템에서 "command -v mount"로 반환되는 경로는 / usr / bin / mount입니다. 나는 / bin / mount 실행 파일도 가지고 있음을 알았지 만 udev에 의해 호출 될 때 작동하지 않는다
magva
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.