chattr +i 是唯一真正防删除的方案,它通过内核vfs层拦截unlink()、rename()等系统调用,使rm、mv等操作均报“operation not permitted”,而+a仅限制截断写入,不阻止删除。

chattr +i 是唯一真正让文件不可删除的方法。其他属性如 +a、+d 都不能阻止 rm,连 root 也拦不住。
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
chattr +i 为什么能防删,而 +a 不行
+i 是内核 VFS 层拦截,直接拒绝 unlink()、rename() 等系统调用;+a 只限制写入方式(禁止 O_TRUNC),但 rm 操作不碰文件内容,只删目录项——它根本没触发 +a 的检查点。
- rm file 在 +a 文件上会成功,在 +i 上一定报 Operation not permitted
- echo "x" > file 在两者上都失败(+a 拦截截断,+i 拦截所有写)
- echo "x" >> file 在 +a 上成功,在 +i 上失败
执行 chattr +i 前必须确认的三件事
- 文件系统必须是ext4 或 xfs:运行 df -T /path/to/file,输出不是 ext4/xfs(比如 nfs、tmpfs、btrfs 默认不支持 i)就无效
- 路径必须挂载为可读写:mount | grep "$(dirname /path/to/file)" 中不能含 ro
- 操作必须由 root 执行,且不能在容器或 chroot 中受限命名空间里——否则 chattr +i 可能静默失败,lsattr 也看不到 i常见误操作和验证要点
- 锁的是符号链接本身?chattr +i mylink 只锁链接文件,不是目标;应先 readlink -f mylink 再对真实路径操作
- lsattr 显示有 i,但 rm 还成功?大概率是文件在只读挂载点下,或文件系统不支持
- 目录加 +i 后 touch newfile 失败,这是正常行为——+i 目录禁止一切元操作(新建、删、重命名)
- 解锁必须用完全相同的绝对路径:chattr -i /etc/sudoers 有效,chattr -i sudoers(相对路径)无效
哪些文件适合加 i,哪些绝对不要碰
- 可加:/etc/passwd、/etc/shadow、/etc/fstab、/boot/grub2/grub.cfg——这些是静态基线,极少变更,且修改必须人工介入
- 别加:/var/log/*.log(rsyslog/journald 写入失败)、/etc/resolv.conf(NetworkManager 动态管理)、/etc/ssh/sshd_config(systemctl reload sshd 会卡住)、任何包管理器预期覆盖的文件(如升级时 yum update openssh 会失败)
真正难的不是命令怎么敲,而是你加完 +i 后,是否还记得自己锁了什么、在哪、为什么锁。










