批量修改 AWS S3 挂载目录下文件权限
内容提要
在服务器上挂载的 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。