Udev

使用 udev 規則自動掛載 exfat

  • March 19, 2019

我正在嘗試使用 udev 規則自動安裝各種 SD 卡。我從這些規則開始,在this question的幫助下解決了一個問題,現在我有以下情況:

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

我不能在那個掛載點下做任何事情,即使是 root:

$ 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_idandgroup_id而不是uidandgid但無濟於事。

手動安裝設備可以正常工作:

$ 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

TL;DR:udev 和 fuse 並不真正兼容


在註意到這個問題不僅出現在 exfat 上,而且出現在 NTFS 格式的設備上後,我開始專門尋找 udev 和 fuse 的問題。

關於我發現的組合的一些評論:

我認為保險絲程序正在被殺死。您不能從 udev 規則啟動長期存在的程序,這應該由 systemd 處理。

來自 Debian-devel

警告:要掛載可移動驅動器,請勿從 udev 規則呼叫 mount。如果是 FUSE 文件系統,您將收到 Transport endpoint not connected 錯誤。相反,您可以使用正確處理自動掛載的 udisk 或在 udev 規則中進行掛載,將 /usr/lib/systemd/system/systemd-udevd.service 複製到 /etc/systemd/system/systemd-udevd.service 並替換 MountFlags =從屬 MountFlags=共享。

$$ 3 $$請記住,udev 並非旨在呼叫長時間執行的程序。

來自 ArchWiki

還有更多。

我最終使用了這個答案中的腳本和配置文件。它適用於所有文件系統類型。我希望我早點發現這個,它可以讓我免去幾天的調試、試驗和錯誤。

引用自:https://unix.stackexchange.com/questions/444936