磁盘自动装载机的 fmask 和 dmask 的默认值在哪里定义?

磁盘自动装载机的 fmask 和 dmask 的默认值在哪里定义?

我已经安装了 Ubuntu 16.04 LTS(如果重要的话,还安装了 MATE DE)。

插入 USB 闪存后,它通常会自动安装到/media/username/VOLUMEIDmount显示以下信息:

/dev/sdc1 on /media/username/VOLUMEID type vfat (rw,nosuid,nodev,relatime,uid=1000,gid=1000,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,showexec,utf8,flush,errors=remount-ro,uhelper=udisks2)

注意:这个问题是我其他问题

如何以及在何处更改默认fmaskdmask安装选项的确切值?

我可以阅读man mount和使用mount -o fmask=...,dmask=...,但实际上我问的是它们的默认值配置。

答案1

我刚刚在 Debian 10.5 上使用 Mate DE 解决了同样的问题(但我不知道这是否相关)。

虽然 /etc/fstab 中列出了没有 uid 和 gid 选项的 usb 设备,但 udisks2 以 root 身份将 usb 密钥挂载到 /media/usb0 中。用户可以读取和卸载磁盘,但不能写入。这是我的 fstab:

/dev/sdb1       /media/usb0     auto    rw,user,noauto  0       0

注释掉这一行就完成了。
现在我的 USB 磁盘已安装在 /media/$USER/samething 中,并且具有正确的权限。

我希望这对您和所有其他发布的类似问题有所帮助(我发现了很多有关此问题的未解决的问题。

答案2

对于 Ubuntu 22.04.2 LTS 和闪存驱动器,我也遇到过类似的问题,exfat它们也默认挂载fmask=0022,dmask=0022,导致所有文件默认被标记为可执行文件。

外部闪存驱动器的自动安装由UDisks 守护进程- 通过输出uhelper=udisks2中列出的元选项可以明显看出这一点:mount

$ mount | grep /dev/sde1
/dev/sde1 on /media/user/Sandisk128 type exfat (rw,nosuid,nodev,relatime,uid=1000,gid=1000,fmask=0022,dmask=0022,iocharset=utf8,errors=remount-ro,uhelper=udisks2)

U盘可以配置为不同的文件系统类型/不同的设备传递特定的挂载选项。配置示例可以在中找到/etc/udisks2/mount_options.conf.example,我基于它创建了:

$ cat /etc/udisks2/mount_options.conf
[defaults]
exfat_defaults=uid=$UID,gid=$GID,iocharset=utf8,errors=remount-ro,fmask=0133,dmask=0022
exfat_allow=uid=$UID,gid=$GID,dmask,errors,fmask,iocharset,namecase,umask

本质上添加fmask=0133,dmask=0022exfat_defaults(其他*_defaults/*_allow应用于其他文件系统类型,例如vfat_defaults/ vfat_allowfor vfat,请参阅/etc/udisks2/mount_options.conf.example示例)。

现在重新启动 UDisksudo systemctl restart udisks并重新插入我在日志中看到的闪存驱动器:

Apr 13 11:26:55 host udisksd[9586]: Using overridden mount options: uid=$UID,gid=$GID,iocharset=utf8,errors=remount-ro,fmask=0133,dmask=0022

并在挂载输出中应用设置:

$ findmnt /media/user/Sandisk128
TARGET              SOURCE  FSTYPE OPTIONS
/media/user/Sandisk128 /dev/sde1 exfat  rw,nosuid,nodev,relatime,uid=1000,gid=1000,fmask=0133,dmask=0022,iocharset=utf8,errors=remount-ro

回答这些默认值从何而来的问题更加有趣。

在没有任何选项的情况下安装exfat磁盘,我们可以跟踪到没有选项传递给内核:

# strace -e mount -f mount -t exfat /dev/sde1 /mnt/point/
mount("/dev/sde1", "/mnt/point", "exfat", 0, NULL) = 0
+++ exited with 0 +++

fmask=0022,dmask=0022仍然存在于选项列表中:

$ findmnt /mnt/point
TARGET  SOURCE  FSTYPE OPTIONS
/mnt/point /dev/sde1 exfat  rw,relatime,fmask=0022,dmask=0022,iocharset=utf8,errors=remount-ro

查看内核源代码,我们可以看到fmask=...,dmask=...附加在exfat_show_options()基于opts->fs_fmask, opts->fs_dmask价值观:

static int exfat_show_options(struct seq_file *m, struct dentry *root)
{
    ...
    seq_printf(m, ",fmask=%04o,dmask=%04o", opts->fs_fmask, opts->fs_dmask);

fs_fmaskfs_dmask设置在exfat_parse_param()如果提供了相关的挂载选项(不是我们的情况),否则从当前任务umask中初始化exfat_init_fs_context()

static int exfat_init_fs_context(struct fs_context *fc)
{
    ...
    sbi->options.fs_fmask = current->fs->umask;
    sbi->options.fs_dmask = current->fs->umask;

我们可以确认 Udisks 正在umask运行0022

$ grep '^Umask:' "/proc/$(pgrep udisksd)/status"
Umask:  0022

并手动确认umask流程的改变将改变使用的fmask/ dmask,例如umask 0133

# umask 0133
# umask -S
u=rw,g=r,o=r
# strace -e mount -f mount -t exfat /dev/sde1 /mnt/point/
mount("/dev/sde1", "/mnt/point", "exfat", 0, NULL) = 0
+++ exited with 0 +++
# findmnt /mnt/point
TARGET  SOURCE  FSTYPE OPTIONS
/mnt/point /dev/sde1 exfat  rw,relatime,fmask=0133,dmask=0133,iocharset=utf8,errors=remount-ro
# ls -l /mnt/point/README.txt
-rw-r--r-- 1 root root 72 Apr 12 11:40 /mnt/point/README.txt
# mkdir /mnt/point/directory
# ls -ld /mnt/point/directory/
drw-r--r-- 2 root root 131072 Apr 13 11:19 /mnt/point/directory/
# umount /mnt/point

即文件系统的默认fmask值来自进程(dmaskexfatumask相同用于vfat文件系统)。由于我们通常希望有不同的fmask/ dmask(使目录可执行,而常规字段不可执行),因此自定义fmask/ 的首选方法dmask是按照上述建议在 UDisks 守护进程配置中明确添加这些选项。

相关内容