chattr +i 是文件系统级不可变锁,连 root 也无法删除、修改或重命名已锁定文件;需用 lsattr 验证是否生效,且不支持 nfs 或部分容器文件系统。

chattr +i 是唯一真正防删的方案
普通 chmod 444 或者把文件所有者设为别人,对 root 来说形同虚设——删、改、重命名全都可以。真要防误删(尤其是关键配置或日志归档),必须用 chattr +i。它不是权限控制,而是文件系统级的“不可变”锁,连 root 都会被内核直接拒绝,报 Operation not permitted。
-
chattr +i后,文件不能修改、删除、重命名、硬链接,也不能被vim、sed -i、echo > file等任何方式覆盖 - 目录加
+i更狠:里面一个文件都新建/删除/重命名不了,相当于整棵树被“冻住” - 必须用 root 执行,普通用户会提示
Operation not permitted - 生效前先确认文件系统支持:ext4/xfs 没问题;NFS 挂载点、某些容器 overlayfs 可能不认
i标志
lsattr 查看状态比猜更可靠
你不确定文件是不是真锁住了?别靠 ls -l 看权限,得用 lsattr。输出里带 i 字符(比如 ----i--------e-)才算生效;没这个字母,就等于没锁。
-
lsattr /etc/resolv.conf→ 快速验证单个文件 -
lsattr -d /var/log/nginx→ 查目录自身属性(不递归子项) -
lsattr -R /backup/conf→ 递归查看整个目录树,适合批量检查 - 如果看到
lsattr: Operation not supported,说明当前路径不支持扩展属性(常见于 /proc、/sys 或某些远程挂载)
chattr +a 适合日志类文件,但和 +i 互斥
如果你要的是“只追加、不覆盖”,比如 /var/log/app.log,那 chattr +a 更合适——它允许 echo "msg" >> file 或程序用 O_APPEND 写入,但禁止 > 截断、vim 保存、truncate 清空等所有覆盖行为。
-
+a和+i不能共存,同时设置会失败 - 目录加
+a:只允许新建文件,不允许删或重命名已有文件 -
+a不影响删除操作本身(删文件仍需父目录有写权限),只是让文件自己“拒绝被覆盖” - 误用
+a后echo "x" > file报错Operation not permitted,不是权限错了,是属性在拦截
解锁前务必确认影响范围
chattr -i 解锁看着简单,但风险藏在细节里:比如你给整个 /etc 下的 passwd、shadow 加了 +i,解锁前没停掉相关服务,useradd 会直接失败并报 cannot open /etc/passwd;又或者你在脚本里自动 chattr +i 一批配置,却忘了在部署流程里配好对应的 -i 步骤,后续升级就卡死。
- 批量加锁慎用
-R:比如chattr -R +i /opt/myapp/conf,若 conf 下有临时生成的缓存文件,后续程序可能因无法写入而异常 - 生产环境加锁前,先在测试机跑一遍
lsattr对比,确认没误锁不该锁的运行时文件 - 所有加锁操作建议记录到变更日志,包括时间、执行人、原因;解锁操作同样要留痕
最常被忽略的一点:chattr 锁的是文件本身,不是路径名。如果文件被 mv 走再新建同名文件,新文件默认没锁——锁不会自动继承。










