使用 udev 規則自動掛載 exfat
我正在嘗試使用 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_id
andgroup_id
而不是uid
andgid
但無濟於事。手動安裝設備可以正常工作:
$ 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 處理。
警告:要掛載可移動驅動器,請勿從 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 並非旨在呼叫長時間執行的程序。
還有更多。
我最終使用了這個答案中的腳本和配置文件。它適用於所有文件系統類型。我希望我早點發現這個,它可以讓我免去幾天的調試、試驗和錯誤。