chmod 777 不会将权限更改为 777

chmod 777 不会将权限更改为 777

我正在尝试将 temp_dir 的权限更改为 777。为什么这些命令无法实现这一点?顺便说一下,我使用的是 Linux。

kylefoley@kfoley76:/mnt/disks$ chmod 777 /mnt/disks/temp_dir
kylefoley@kfoley76:/mnt/disks$ stat -c "%a %n" temp_dir
755 temp_dir

我也尝试了详细开关

kylefoley@kfoley76:/mnt/disks$ chmod -v 777 /mnt/disks/temp_dir
mode of '/mnt/disks/temp_dir' changed from 0755 (rwxr-xr-x) to 0777 (rwxrwxrwx)
kylefoley@kfoley76:/mnt/disks$ stat -c "%a %n" temp_dir
755 temp_dir

我也不明白为什么我不能使用sudo

kylefoley@kfoley76:/mnt/disks/temp_dir$ sudo chmod 777 fix_mistakes
chmod: cannot access 'fix_mistakes': Permission denied

即使我以 root 用户身份登录

kylefoley@kfoley76:/mnt/disks/temp_dir$ sudo -i
root@kfoley76:~# sudo chmod 777 /mnt/disks/temp_dir
chmod: cannot access '/mnt/disks/temp_dir': Permission denied

我还应该补充一点,这个错误一定与所讨论的目录是 gcsfuse 挂载的磁盘(可从 gcloud 获得)有关。其他更改权限的尝试都成功了:

kylefoley@kfoley76:~$ mkdir hey
kylefoley@kfoley76:~$ stat -c "%a %n" hey
755 hey
kylefoley@kfoley76:~$ chmod 777 hey
kylefoley@kfoley76:~$ stat -c "%a %n" hey
777 hey

答案1

gcsfuse 在挂载时设置文件和目录的权限。具体来说,选项为:

  • file_mode– 文件的权限位,以八进制表示
  • dir_mode– 目录的权限位,以八进制表示

来源:https://github.com/GoogleCloudPlatform/gcsfuse/blob/e0a0e0826897b09581c24065fb6a92912ee79d03/flags.go#L78

如果不指定选项,则默认为dir_mode=0755,file_mode=0644

来源:https://github.com/GoogleCloudPlatform/gcsfuse/blob/e0a0e0826897b09581c24065fb6a92912ee79d03/flags.go#L51

这些选项适用于挂载中的所有文件和目录。此 FUSE 文件系统无法更改特定文件或目录的权限,因此chmod不执行任何操作。


此外,gcsfuse 还具有额外的访问限制,限制了挂载文件系统的用户的访问。详细信息:

作为一种安全措施,fuse 本身将文件系统访问限制为安装文件系统的用户(参见保险丝.txt)。因此,gcsfuse 默认显示所有文件为调用用户所有。因此,您应该以将使用文件系统的用户身份调用 gcsfuse,而不是以 root 身份。

如果你知道自己在做什么,你可以用以下方法覆盖这些行为:allow_otherfuse 支持的 mount 选项以及gcsfuse 支持的--uid--gid标志。请注意,这可能存在安全隐患!

来源:https://github.com/GoogleCloudPlatform/gcsfuse/blob/d25be2491879e3745c3ed3d8e816774defc1cc5c/docs/mounting.md#access-permissions

这就是您无法从其他用户访问该挂载的原因。要允许其他用户访问该挂载,请allow_other在挂载选项中指定。

答案2

我能够通过以下方式解决问题:我必须转到 Cloud API 访问范围并在 VM 配置下验证它是否具有对存储的读写或完全访问权限。这涉及在列出我的实例的 gcloud 控制台上按编辑。在页面底部,有存储限制,我将其更改为“完整”。就这样。

相关内容