Mount

從 udev 安裝時未應用 umask

  • April 5, 2019

我有一個 udev 規則,它在連接時自動安裝 USB 設備

規則如下:

# cat /etc/udev/rules.d/10-usbdetectd.rules 
KERNEL!="sd[a-z]*", GOTO="media_by_label_auto_mount_end"
# Import FS infos
IMPORT{program}="/sbin/blkid -o udev -p %N"
# Global mount options
ACTION=="add", ENV{mount_options}="relatime"
# Filesystem-specific mount options
ACTION=="add", ENV{ID_FS_TYPE}=="vfat|ntfs", ENV{mount_options}="$env{mount_options},utf8,uid=1000,gid=1000,umask=022"
# Mount the device
ACTION=="add", RUN+="/bin/mount -o $env{mount_options} /dev/%k /media/usb"
# Clean up after removal
ACTION=="remove", RUN+="/bin/umount -l /media/usb" 
# Exit
LABEL="media_by_label_auto_mount_end"

此規則執行良好,但是,我想以完全權限安裝設備。為此,我必須設置 umask=000

當我手動嘗試時,它按預期工作

# ls -dl /media/usb/
drwxr-xr-x    2 root     root          4096 Jan 29  2019 /media/usb/

# mount -o relatime,utf8,uid=1000,gid=1000,umask=000 /dev/sda1 /media/usb/

# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/root              6643016     86356   6199492   1% /
devtmpfs                223204         0    223204   0% /dev
tmpfs                   256484         0    256484   0% /dev/shm
tmpfs                   256484        48    256436   0% /tmp
tmpfs                   256484       132    256352   0% /run
/dev/mmcblk0p1           20185      2854     17331  14% /boot
/dev/sda1              1957600        96   1957504   0% /media/usb

# ls -dl /media/usb/
drwxrwxrwx    2 user    user        16384 Jan  1  1970 /media/usb/

但是,當安裝由 udev 完成時,不會應用遮罩

# ls -dl /media/usb/
drwxr-xr-x    2 root     root          4096 Jan 29  2019 /media/usb/

[USB drive plug]

# df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/root              6643016     86356   6199492   1% /
devtmpfs                223204         0    223204   0% /dev
tmpfs                   256484         0    256484   0% /dev/shm
tmpfs                   256484        52    256432   0% /tmp
tmpfs                   256484       132    256352   0% /run
/dev/mmcblk0p1           20185      2854     17331  14% /boot
/dev/sda1              1957600        96   1957504   0% /media/usb

# ls -dl /media/usb/
drwxr-xr-x    2 root     root         16384 Jan  1  1970 /media/usb/

似乎當安裝由 udev 完成時,沒有應用任何安裝選項。

uid=1000 和 gid=1000 對應我的使用者

# cat /etc/passwd 
[...]
user:x:1000:1000:- Standard user:/home/user:/bin/bash
[...]

似乎問題來自 udev 規則語法。

在使用外部腳本而不是直接呼叫/bin/mount和添加一些日誌之後,我指出只有relatime選項被傳遞給腳本。

修改udev規則後:

[...]
# Global mount options
ACTION=="add", ENV{mount_options}="relatime,utf8,uid=1000,gid=1000,dmask=0000,fmask=0000"
# Mount the device
ACTION=="add", RUN+="/bin/mount -o $env{mount_options} /dev/%k /media/usb"
[...]

udev 規則有效,並以預期的權限安裝 USB 驅動器。

因此,一旦定義了環境變數(或者我沒有使用正確的語法),似乎就不可能將環境變數覆蓋到 udev 規則中。

如果有人知道我如何保留文件系統特定的掛載選項,我會很高興看到它。

否則,即使不是最佳解決方法,這種解決方法對我的情況也足夠了。

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