chattr +i 是唯一能防 root 删除/覆盖的内核级锁,它在 VFS 层拦截 write、unlink、rename、truncate 等系统调用,错误统一返回 Operation not permitted,适用于 /etc/passwd 等静态关键文件,但不可用于日志或动态配置文件。

Linux 中没有“统一文件锁定”这回事,flock、chattr +i、fcntl 解决的是完全不同的问题——选错机制,轻则无效,重则让服务挂掉。
chattr +i 是唯一能防 root 删除/覆盖的内核级锁
它不是“设只读”,而是让内核在 VFS 层直接拦截 write、unlink、rename、truncate 等系统调用,错误统一返回 Operation not permitted。这意味着:
-
echo "x" > /etc/sudoers、rm -f /etc/passwd、mv sshd_config old全部失败,哪怕文件权限是777 -
visudo、usermod、yum update会卡住或报错,因它们内部依赖写入这些文件 - 加锁前必须确认该文件是「静态、极少变更、且修改必须人工介入」的,比如:
/etc/passwd、/etc/shadow、/boot/grub2/grub.cfg - 绝对不能对日志文件(
/var/log/*.log)、数据库目录(/var/lib/mysql)、/etc/resolv.conf或包管理器预期覆盖的文件(如升级时重写的/etc/ssh/sshd_config)加+i
flock 只适用于进程协作场景,不防误操作或 root
flock 是建议性锁(advisory lock),依赖所有相关进程主动调用并检查锁状态。它不改变文件权限,也不拦截系统调用,所以:
-
rm -f file、chmod 666 file、echo > file都能照常执行,flock完全拦不住 - 典型适用场景是多进程写日志、定时任务去重、配置更新原子性控制,例如:
flock -x /var/log/app.log -c "echo 'ok' >> /var/log/app.log" - 常用组合:
-x(排他锁)、-n(非阻塞,抢不到就退出)、-c(执行命令后自动解锁) - 不要直接锁目标文件本身(如
/etc/config.json),推荐用独立锁文件(如/tmp/config.json.lock),避免权限或 SELinux 干扰
chmod 444 和 chown root:root 只是基础防线,不是锁定
chmod 444 仅控制 POSIX 权限检查,root 用户可绕过;chown root:root 也只是防止普通用户写入。它们的作用是:
- 作为
chattr +i的前置加固:先规范权限,再加不可变属性,降低误操作风险 - 配合包管理器验证:RHEL/CentOS 上可用
rpm -V sudo检查/etc/sudoers是否被意外修改或残留+i - 不能替代
chattr +i——因为 root 执行chmod 644 /etc/sudoers && echo "ALL ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers依然成功 - 也不能替代
flock——因为它不解决并发写入竞争问题
真正关键的判断点:你到底要防谁?
这个问题决定一切:
- 防 root 误删/覆盖关键配置?→ 必须用
chattr +i,但加之前得确认它不会让systemctl reload sshd或yum update失败 - 防多个脚本同时写一个日志或临时文件?→ 用
flock,别碰chattr,否则日志服务直接崩 - 防普通用户改敏感文件?→
chmod 440 && chown root:root就够了,chattr +i是过度防御 - 需要加密存储?→
fscrypt或eCryptfs,和锁机制无关
最容易被忽略的一点:加 chattr +i 后,连 visudo 都打不开——这不是 bug,是设计如此。维护前必须先 chattr -i,改完再加回去,漏掉这步就是生产事故。


















