命令详解 chattr
chattr 用于修改 Linux 文件系统支持的 inode 标志,例如不可修改、仅追加和不参与某些备份流程。它不是通用的“扩展属性”编辑器,也不等同于 ACL、SELinux 上下文或 xattr。
风险提示:
+i和+a可能阻止应用写入、日志轮转、软件升级和文件删除。生产环境修改前要记录目标、原因和恢复命令,不要对根目录或大范围路径递归试验。
基本语法
chattr [options] mode files...
模式中的运算符:
+:增加指定标志。-:移除指定标志。=:仅保留指定标志,可能清除其他标志,谨慎使用。
先查看再修改:
lsattr -- /path/to/file
sudo chattr +i -- /path/to/file
lsattr -- /path/to/file
sudo chattr -i -- /path/to/file
-- 用于结束选项解析,避免以连字符开头的文件名被当成参数。
常见标志
| 标志 | 典型作用 | 主要注意事项 |
|---|---|---|
i |
immutable,不允许修改、删除、重命名或创建硬链接 | 应用更新、包管理、日志轮转也会失败 |
a |
append only,仅允许追加写入 | 不等于日志防篡改;有权限的管理员仍可移除标志 |
A |
不更新 atime | 与挂载参数、内核和文件系统行为共同决定 |
d |
dump 程序可忽略 | 只对理解该标志的工具有意义 |
S |
同步更新 | 可能明显降低写入性能 |
不同内核和文件系统对标志的支持不同。即使命令返回成功,也应通过 lsattr 和实际读写测试确认效果。
典型用法
临时保护关键配置
sudo chattr +i /etc/example/app.conf
lsattr /etc/example/app.conf
需要变更时按受控流程解锁、修改、验证并重新保护:
sudo chattr -i /etc/example/app.conf
sudoedit /etc/example/app.conf
sudo chattr +i /etc/example/app.conf
更成熟的做法是把配置纳入版本控制、配置管理和审计,而不是仅依赖 +i。
仅追加日志
sudo chattr +a /var/log/example.log
这会影响日志轮转。实施前必须验证应用、logrotate 和备份流程,并准备 chattr -a 的维护步骤。对抗恶意管理员时它不是可信的审计边界,应使用远程日志、WORM 存储或独立审计系统。
权限与文件系统限制
- 修改某些标志需要 root 权限或相应 capability,普通所有者并不一定能操作。
- ext2/3/4 支持较完整;XFS、Btrfs、overlayfs、网络文件系统和容器卷可能只支持部分标志或行为不同。
- 符号链接、绑定挂载、快照和只读挂载可能让结果与预期不同。
chattr不显示或修改 POSIX ACL;ACL 使用getfacl/setfacl。- SELinux 上下文使用
ls -Z、restorecon等工具管理。
排障顺序
遇到 Operation not permitted 时,按以下顺序核查:
lsattr -d -- /path/to/file
namei -l /path/to/file
findmnt -T /path/to/file
getfacl -- /path/to/file
ls -lZ /path/to/file
还要检查只读挂载、容器 capability、NFS 导出策略、SELinux/AppArmor 日志以及是否正在操作符号链接目标。