批量修改 AWS S3 挂载目录下文件权限

💡 原文中文,约2700字,阅读约需7分钟。
📝

内容提要

在服务器上挂载的 S3 类似对象存储中,由于文件数量过多,需将文件权限改为 644,导致系统负载高。解决方案是修改挂载参数,设置 umask=022,并指定 uid 和 gid。重新挂载后,文件权限正常,但新建文件的所有者由挂载参数决定。修改挂载会影响 Docker 容器,需重启容器以避免错误。权限信息存储在 S3 对象的元数据中。

🎯

关键要点

  • 服务器上挂载了 S3 类似的对象存储,用于存放网站的图片。

  • 需要将挂载目录下的所有文件权限改为 644,但系统负载很高。

  • S3 是对象存储,执行 chmod 时需为每个文件发送网络请求,导致高负载。

  • 解决方案是修改挂载参数,添加 umask=022,并指定 uid 和 gid。

  • 需停掉相关 Docker 容器,卸载目录,修改挂载参数,重新挂载,再启动 Docker 容器。

  • umask 的作用是规定“不允许”出现哪些权限,权限通过从“满权限”中减去 umask 的值计算。

  • 新建文件的所有者由挂载参数决定,umask 只影响权限,不影响所有者。

  • 修改挂载参数后重新挂载会影响 Docker 容器,需重启容器以避免错误。

  • 权限信息存储在 S3 对象的元数据中,包括存储权限位、所有者的 UID 和组的 GID。

🔎

延伸解读

系统负载高的原因

在执行 chmod 命令时,S3 对象存储需要为每个文件发送网络请求,这导致了高系统负载。虽然 CPU 和内存占用不高,但由于网络延迟,系统负载显著增加。了解这一点有助于在处理大量文件时选择合适的操作方式,避免不必要的性能问题。

umask 的作用与限制

umask 主要用于设置新建文件的权限,但不影响文件的所有者。在 S3 挂载环境中,新建文件的所有者由挂载参数决定,而不是由 umask 控制。这一点在进行文件管理时需要特别注意,以避免权限和所有权混淆。

Docker 容器的影响

修改 S3 挂载参数后,必须重启 Docker 容器以避免出现空目录或失效的文件句柄错误。Docker 容器在启动时与宿主机的挂载点建立连接,重新挂载后,容器不会自动更新连接,可能导致数据访问问题。

延伸问答

如何批量修改 AWS S3 挂载目录下文件的权限?

可以通过修改挂载参数,设置 umask=022,并指定 uid 和 gid,然后重新挂载目录来实现。

为什么在修改 S3 挂载目录文件权限时系统负载会很高?

因为每个文件的 chmod 操作需要发送网络请求,8 万个文件意味着需要进行 8 万次网络往返,导致系统负载高。

修改挂载参数后对 Docker 容器有什么影响?

修改挂载参数后需要重启 Docker 容器,否则容器内部可能会看到空目录或遇到失效的文件句柄错误。

umask 的作用是什么?

umask 是用户文件创建掩码,用于规定不允许出现哪些权限,通过从满权限中减去 umask 的值来计算文件权限。

新建文件的所有者是如何决定的?

新建文件的所有者由挂载时的参数决定,而不是由 umask 决定,umask 只影响文件权限。

S3 对象的权限信息存储在哪里?

权限信息存储在 S3 对象的元数据中,包括存储权限位、所有者的 UID 和组的 GID。

🏷️

标签

➡️

继续阅读