科技 · 实用指南
rm 提示“Operation not permitted”?chmod 或 chattr 前先证明 unlink 边界
保留准确 errno,检查父目录和 inode 属性,区分 sticky、挂载、命名空间与策略原因,再用一次性同级探针验收单一修复。

“Operation not permitted”是 unlink 边界的证据,不代表 rm 需要更强制。真正控制操作的可能是父目录、immutable/append-only 属性、sticky 所有权、文件系统规则、命名空间能力或安全策略。
先保存准确路径与 errno,不做更改地逐层检查。只修复一个已证明原因,用一次性同级探针验证父目录;只有明确获准且已备份时,才删除准确目标。
1. 固定路径与真实错误
保存完整命令、准确 stderr、有效用户、工作目录和命名空间。目标应存在时用 realpath -e 解析,并分别记录目标与父目录的 stat;同时保留原始路径,因为 unlink 操作的是目录项,符号链接、绑定挂载或改名的父目录都会改变讨论对象。
不要把所有“cannot remove”都当成 EPERM。Linux 将父目录缺少写入或搜索权限标为 EACCES,只读文件系统标为 EROFS,挂载点或某些 NFS 情况标为 EBUSY。若需 strace,只在一次性复现环境,或删除已获准且已备份时执行,因为成功的跟踪会真的删掉名称。
2. 先查父目录,再看文件模式
用 namei -l 逐组件检查,并分别 stat 直接父目录和目标。删除名称会修改父目录;让文件本身可写并不会授予目录操作。只记录所有者、组、模式和 ACL 证据,不先更改。
父目录带 sticky 位时,除非有效用户拥有文件、拥有目录或具备相应能力,Linux 可能拒绝 unlink。保留共享目录保护,证明正确执行者或所有权,不要从 /tmp 或共享工作区移除 sticky。
3. 读取目标与父目录的 inode 属性
对目标和父目录都运行 lsattr -d --。immutable 会阻止删除和重命名,append-only 也会让 unlink 返回 EPERM。并非所有文件系统都支持全部属性;不支持本身只是继续排查的证据。
若属性已被证明为原因,先记录对象所有者和设置原因,只在准确对象上清除所需的 i 或 a,并从持有 CAP_LINUX_IMMUTABLE 的主机或命名空间操作。不要递归 chattr,也不要为绕过诊断授予容器广泛特权。
4. 区分挂载、文件系统与策略边界
对准确目标运行 findmnt -T,记录来源、文件系统类型和选项。只读挂载返回 EROFS,不等于 EPERM;挂载点或 NFS silly rename 可能返回 EBUSY。overlay、网络和容器文件系统还增加所有权与命名空间边界,旧的产品特例不能当成通用修复。
若模式、sticky 所有权和 inode 属性都无法解释拒绝,再收集策略证据:可用时查看 ls -lZ、近期 AVC 或内核日志、有效 capabilities 以及相关容器或用户命名空间。只修具体策略或拥有层,不要全局关闭 SELinux/AppArmor,也不要把工作负载改成全面 privileged。
5. 只修一个原因并完成验收
只做与证据对应的一处可逆更改:纠正目标父目录的所有者或访问、清除一个已证明属性、以合法 sticky 所有者执行、修复挂载/存储层,或更新具体安全规则。之后重新读取 stat、lsattr 和 findmnt,留下因果记录。
在接触真实目标前,策略允许时在同一父目录创建并删除一次性同级探针。它能证明父目录操作,但不等于有权删除目标。确认准确路径、备份和所有者批准后只删除一次。unlink 删除的是名称;已打开文件会一直保留 inode 和数据,直到最后一个描述符关闭。
