Skip to content

Linux 文件权限异常 ​

问题现象 ​

文件存在却报 Permission denied,宿主机可写而容器内不可写,或静态服务不能读取版本链接目标。

适用环境 ​

Linux、systemd 或 Docker bind mount;可能启用 ACL/SELinux。

本文是可复用的排障示例,不代表某次个人生产事故。命令中的名称、账号和数据均为示例,执行前请替换为已确认的目标。

复现或诊断步骤 ​

  1. 用 id 确认进程的实际 UID/GID,而非只看登录用户。
  2. 用 namei -l 检查路径每一级目录的执行权限,检查 ls -l 与 getfacl。
  3. 核对 bind mount 的只读属性、UID 映射和 SELinux 审计;符号链接需要检查最终目标的整条路径。

原因分析 ​

读取文件需要文件读权限以及每级父目录的遍历权限。容器内同名用户未必具有相同 UID。只读挂载和 SELinux 拒绝不能靠普通 chmod 解决;默认 umask 也会影响新建文件。

修复示例 ​

bash
id
namei -l /srv/app/config.yml
ls -ld /srv /srv/app
ls -l /srv/app/config.yml
getfacl /srv/app/config.yml
# 修改前保存指定路径的 ACL;不要递归扫整台服务器
getfacl -p /srv/app /srv/app/config.yml > /tmp/app-permissions.acl
# 恢复(先确认备份内容和目标路径):
# setfacl --restore=/tmp/app-permissions.acl

按服务用户赋予最小读写范围;静态产物通常目录 755、文件 644,私密配置应更严格。修改前记录属主、模式与 ACL,分路径调整;SELinux 根据真实标签修复并保留 enforcing,避免直接关闭。bind mount 读写策略由 Compose 明确声明。

验证方法 ​

使用与服务相同的 UID 执行所需读写操作,再重启或重载验证。确认无关用户不能读取私密配置,符号链接切换后仍可遍历;检查新文件权限与 umask。

常见误区 ​

chmod -R 777 会扩大权限且破坏私密配置保护。不要对整个 /opt 或 /var 递归 chown;同名用户不等于相同数字身份。

官方参考链接 ​

相关分类:部署与运维 · 全部笔记