我已经安装了 Ubuntu 16.04 LTS(如果重要的话,还安装了 MATE DE)。
插入 USB 闪存后,它通常会自动安装到/media/username/VOLUMEID
并mount
显示以下信息:
/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)
注意:这个问题是我其他问题。
如何以及在何处更改默认fmask
和dmask
安装选项的确切值?
我可以阅读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=0022
到exfat_defaults
(其他*_defaults
/*_allow
应用于其他文件系统类型,例如vfat_defaults
/ vfat_allow
for 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_fmask
,fs_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
值来自进程(dmask
exfat
umask
相同用于vfat
文件系统)。由于我们通常希望有不同的fmask
/ dmask
(使目录可执行,而常规字段不可执行),因此自定义fmask
/ 的首选方法dmask
是按照上述建议在 UDisks 守护进程配置中明确添加这些选项。