chattr +i 是唯一能在内核 vfs 层真正阻止 root 删除文件的方式,它拦截 unlink()、rename() 等系统调用并统一返回 operation not permitted;而 rm -i 别名和 trash-cli 仅作用于交互式场景,对脚本、服务进程及 root 绕过完全无效。

chattr +i 是唯一能在内核层真正阻止 root 删除文件的方式,chmod 或别名 rm -i 都可被绕过或忽略。
为什么 rm -i 别名和 trash-cli 不够用
它们只作用于交互式 shell 场景,对脚本、cron 任务、服务进程(如 systemd、rsyslog)完全无效。比如一个定时脚本执行 rm /etc/hosts,无论你 alias 怎么设,它都直接删——trash-cli 同样不介入非交互调用。更关键的是,root 用户能直接绕过所有用户态防护,包括 SELinux 策略(若配置不当)和 ACL。
-
rm -i依赖用户每次敲命令时都触发,但自动化流程里根本不会停 -
trash-cli本质是 mv + 垃圾目录管理,不能防unlink()系统调用,且不兼容所有程序(如yum update内部调用) - 权限控制(
chmod、chown)仅检查 UID/GID,root 永远 bypass
chattr +i 的真实行为和生效边界
它不是“设只读”,而是让内核 VFS 层拒绝所有写类元操作:write、unlink、rename、truncate、link,错误统一返回 Operation not permitted。哪怕文件权限是 777,加了 +i 就彻底锁死。
PyCharm 2026.2.0.1 Linux版提供 JetBrains 官方 2026.2.0.1 版本安装包,适合需要指定 PyCharm 版本进行 Python 项目开发、运行和调试的用户。
- 必须用 root 执行:
sudo chattr +i /etc/sudoers - 验证是否生效:
lsattr /etc/sudoers输出含i字符(如----i---------e---) - 目录加
+i后,禁止在该目录下mkdir、touch、rm任何条目,子项自身属性无关 - 不支持 FAT32/NTFS 挂载点;
df -T /path必须显示ext4或xfs
哪些文件能加 +i,哪些绝对不能碰
加之前必须确认:该文件是静态的、极少变更的、且修改必须人工介入。一旦加错,系统可能无法升级、重载服务甚至启动失败。
- 适合加:
/etc/passwd、/etc/shadow、/etc/group、/etc/sudoers、/boot/grub2/grub.cfg - 严禁加:
/var/log/*.log(rsyslog直接报错退出)、/var/lib/mysql/(mysqld启动失败)、/etc/resolv.conf(被NetworkManager动态覆盖)、/etc/ssh/sshd_config(systemctl reload sshd失败) - 包管理器预期覆盖的文件(如
yum升级时重写/etc/ssh/sshd_config)加了+i会导致更新中断
实操中三个最容易翻车的细节
新手常在没验证前提下直接执行 chattr +i,结果维护时连 visudo 都打不开。关键不是“怎么加”,而是“加之前怎么做”。
- 加锁前必须备份到其他挂载点:
cp /etc/sudoers /backup/sudoers.$(date +%s)—— 加完+i后cp也失败 - 加锁后所有依赖写入该文件的命令都会卡住或报错,比如
usermod、visudo、yum update,临时维护必须先chattr -i,改完立刻重新加 - SELinux 上下文可能冲突:
ls -Z /etc/sudoers若类型是admin_home_t,需先chcon -t etc_t /etc/sudoers再加+i,否则部分策略会拒绝访问
真正难的不是执行 chattr +i 这一行命令,而是判断这个文件是否真的“静态到值得锁死”,以及你能否接受后续所有自动化流程都必须人工介入解锁 —— 这才是多数人忽略的代价。










