udev가 호출되면 마운트가 실행되지 않습니다.

udev가 호출되면 마운트가 실행되지 않습니다.

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를 통해 호출할 때 마운트 스크립트가 끝난 후 내 블록 장치가 마운트 해제된 것처럼 보입니다."입니다.

답변1

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

옵션 man 5 systemd.exec에 대한 자세한 내용은 참고자료를 참조하세요 .MountFlags

답변2

이 글을 쓰는 시점에서 다른 답변은 올바르지 않거나 오래되었습니다.

mountSystemd 서비스에서 실행 하면 안 됩니다 . MountFlagsPrivateMounts의 행을 주석 처리한 후에도 systemd-udevd.serviceFUSE 프로세스가 Systemd에 의해 효과적으로 종료되므로 FUSE 파일 시스템(예: NTFS 또는 exFAT)에는 규칙이 적용되지 않습니다.

바라보다이 ArchWiki 페이지거기에는 몇 가지 더 나은 옵션이 나열되어 있습니다. 나는 GitHub의 작은 프로젝트를 선호합니다.udev 미디어 자동 마운트, Udev 규칙에서 Systemd 서비스를 다시 시작합니다. 이는 네임스페이스 및 하위 프로세스에 대한 Udev의 다양하고 번거로운 제한을 피할 수 있는 편리한 방법입니다.

당신은 또한 볼 수 있습니다이 답변SYSTEMD_WANTS, Udev 변수를 사용하여 Systemd 장치를 시작하는 방법을 보여줍니다 .

답변3

systemd-mountudev 규칙을 사용하여 블록 장치를 마운트 할 수 있습니다 . Raspberry Pi Pico를 자동으로 마운트하는 예ArchWiki 페이지@Metamorphic이 언급되었습니다(이 작업을 미리 수행해야 합니다 /mnt/pico.

ACTION=="add", SUBSYSTEMS=="usb", SUBSYSTEM=="block", ENV{ID_FS_USAGE}=="filesystem", ATTRS{idVendor}=="2e8a", ATTRS{idProduct}=="0003", RUN+="/usr/bin/logger --tag rpi-pico-mount Mounting what seems to be a Raspberry Pi Pico", RUN+="/usr/bin/systemd-mount --no-block --collect -o gid=users,fmask=113,dmask=002 $devnode /mnt/pico"

게시물에서 플래그 추가에 대해 언급했지만 --automount=yes이로 인해 재설치 문제가 발생했습니다.

변경 사항을 적용하려면 udev 규칙을 다시 로드해야 합니다.

sudo udevadm control --reload

규칙에 메시지를 추가하면 logger디버깅에 도움이 될 수 있습니다. 를 보면 인쇄된 것을 볼 수 있습니다 journalctl -f. 일반적인 일치 패턴으로 시작한 다음 보다 구체적인 일치 패턴을 구축하는 것이 유용합니다.

답변4

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

운영자는 :=목록 값을 설정하고 추가 변경을 허용하지 않습니다.

관련 정보