udev 규칙을 자동으로 사용하여 exfat 마운트

udev 규칙을 자동으로 사용하여 exfat 마운트

udev 규칙을 사용하여 다양한 SD 카드를 자동으로 마운트하려고 합니다. 나는 시작했다이 규칙으로, 문제는 다음의 도움으로 해결되었습니다.이 문제, 이제 다음과 같은 상황이 발생했습니다.

ext4 및 vfat 형식의 장치는 제대로 작동하지만 exfat 또는 NTFS 형식의 디스크를 삽입하면 다음 줄이 표시됩니다 mount.

/dev/sda1 on /media/GoPro type fuseblk (rw,nosuid,nodev,noatime,user_id=0,group_id=0,default_permissions,allow_other,blksize=4096)

디렉토리 목록은 다음과 같습니다.

$ ls -l /media/
ls: cannot access '/media/GoPro': Transport endpoint is not connected
total 0
d????????? ? ? ? ?            ? GoPro

해당 마운트 지점에서는 루트로서도 아무것도 할 수 없습니다.

$ sudo ls -l /media/GoPro
ls: cannot access '/media/GoPro': Transport endpoint is not connected

오류 메시지가 있는 다른 사람들에게서 발견한 유일한 문제는 Transport endpoint is not connected디스크가 제대로 마운트 해제되지 않은 후에 발생하는 것 같습니다. 그런데 디스크를 마운트하는 데 문제가 있습니다.

내 현재 udev 규칙은 다음과 같습니다.

KERNEL!="sd[a-z][0-9]", GOTO="media_by_label_auto_mount_end"
ACTION=="add", PROGRAM!="/sbin/blkid %N", GOTO="media_by_label_auto_mount_end"

# Do not mount devices already mounted somewhere else to avoid entries for all your local partitions in /media
ACTION=="add", PROGRAM=="/bin/grep -q ' /dev/%k ' /proc/self/mountinfo", GOTO="media_by_label_auto_mount_end"

# Global mount options
ACTION=="add", ENV{mount_options}="noatime"
# Filesystem-specific mount options
ACTION=="add", PROGRAM=="/sbin/blkid -o value -s TYPE %E{device}", RESULT=="vfat|ntfs", ENV{mount_options}="%E{mount_options},utf8,uid=1000,gid=100,umask=002"
ACTION=="add", PROGRAM=="/sbin/blkid -o value -s TYPE %E{device}", RESULT=="exfat", ENV{mount_options}="%E{mount_options},utf8,allow_other,umask=002,uid=1000,gid=1000"

# Get label if present, otherwise assign one
ENV{ID_FS_LABEL}!="", ENV{dir_name}="%E{ID_FS_LABEL}"
ENV{ID_FS_LABEL}=="", ENV{dir_name}="usbhd-%k"

# Mount the device
ACTION=="add", ENV{dir_name}!="", RUN+="/bin/mkdir -p '/media/%E{dir_name}'", RUN+="/bin/mount -o %E{mount_options} /dev/%k '/media/%E{dir_name}'"

# Clean up after removal
ACTION=="remove", ENV{dir_name}!="", RUN+="/bin/umount -l '/media/%E{dir_name}'"
ACTION=="remove", ENV{dir_name}!="", RUN+="/bin/rmdir '/media/%E{dir_name}'"

# Exit
LABEL="media_by_label_auto_mount_end"

user_id나는 and group_id대신 uidand 를 사용해 보았지만 gid아무 소용이 없었습니다.

장치를 수동으로 설치하면 문제가 없습니다.

$ sudo mount -o noatime,utf8,allow_other,umask=002,uid=1000,gid=1000 /dev/sdb1 /media/GoPro/
FUSE exfat 1.2.5
$ ls -l /media/
total 132
drwxrwxr-x 1 pi   pi   131072 Jan  1  1970 GoPro

답변1

TL;DR: udev와 fusion은 실제로 호환되지 않습니다.


이 문제가 exfat뿐만 아니라 NTFS로 포맷된 장치에서도 나타나는 것을 확인한 후, udev 및 fusion의 문제를 구체적으로 찾기 시작했습니다.

내가 찾은 조합에 대한 몇 가지 의견:

퓨즈 프로세스가 종료된 것 같습니다. udev 규칙에서는 수명이 긴 프로세스를 시작할 수 없으며 이는 systemd에서 처리해야 합니다.

(데비안 개발에서)

경고: 이동식 드라이브를 마운트하려면 udev 규칙에서 마운트를 호출하지 마세요. FUSE 파일 시스템의 경우 전송 끝점이 연결되지 않음 오류가 발생합니다. 대신 자동 마운트를 올바르게 처리하는 udisk를 사용하여 /usr/lib/systemd/system/systemd-udevd.service를 /etc/systemd/system/systemd-udevd에 복사하거나 udev 서비스 내에서 마운트 작업을 수행하고 MountFlags=를 바꿀 수 있습니다. MountFlags=Shared인 슬레이브. [3] udev는 장기 실행 프로세스를 호출하기 위한 것이 아닙니다.

(ArchWiki에서)

더있다.

나는 결국 사용했다이 답변의 스크립트 및 구성 파일. 모든 파일 시스템 유형에서 완벽하게 작동합니다. 디버깅, 시행착오의 시간을 절약할 수 있도록 이 사실을 더 일찍 발견했으면 좋았을 것입니다.

관련 정보