chattr +i 是最硬的只读锁,连 root 也无法修改、删除或重命名该文件或目录,必须先 chattr -i 解锁;+a 则允许追加写入但禁止覆盖,适用于日志文件。

chattr +i 是最硬的只读锁,但 root 也能删
普通 chmod 设的只读(如 chmod 444 file)只能防普通用户写入,root 或拥有写权限的组仍可修改甚至删除。真要防误删,得用 chattr 加不可变属性:chattr +i file。加完后,连 root 都不能改、删、重命名、覆盖该文件——除非先 chattr -i 解锁。
注意:+i 对目录也生效,但效果不同:目录加 +i 后,无法新建、删除或重命名其中任何文件(哪怕文件本身没加 +i),相当于整个目录被“冻住”。
- 必须用 root 权限执行
chattr,普通用户会报Operation not permitted -
lsattr file可查看是否已设i属性;输出里带i字符即生效 - ext4/xfs 等主流文件系统支持,但某些容器环境或 NFS 挂载点可能不支持
i标志
chattr +a 适合日志类文件,允许追加但禁止覆盖
有些场景不需要完全锁死,比如日志文件——你希望程序能持续 append 写入,但不能 truncate 或 overwrite。这时用 chattr +a file 更合适。加了 +a 的文件,只有 open(..., O_APPEND) 方式能写,其他所有写法(包括 echo > file、vim 保存)都会失败,报错 Operation not permitted。
-
+a不影响读取和删除(删除仍需父目录写权限) - 对目录设
+a,表示只允许在该目录中创建新文件,不允许删除或重命名已有文件 -
+a和+i互斥,不能同时设置
误设 +i 后打不开文件?不是权限问题,是属性锁住了
常见现象:给配置文件加了 chattr +i,再用 vim 或 sed -i 修改时,提示 "file" [readonly] — not writable 或直接报 Operation not permitted。这不是 chmod 没设好,而是 chattr 的 i 属性在起作用——编辑器尝试 truncate+rewrite,被内核拦截了。
解决办法只有一步:chattr -i file。别试图绕过,也不用改 chmod 或换用户,i 属性优先级高于所有 POSIX 权限。
- 脚本中批量处理前,建议先
lsattr扫描,避免对+i文件执行写操作导致中断 - 某些备份工具(如
rsync --fake-super)遇到+i文件会跳过或报错,需提前清理属性
chattr 在容器和云盘里不一定管用
很多用户在 Docker 容器里运行 chattr +i 失败,报 Operation not permitted,即使用了 --privileged 也可能无效。这是因为容器默认禁用 CAP_LINUX_IMMUTABLE 能力,且底层存储驱动(如 overlay2)不透传 i 属性。同样,挂载的腾讯云 CFS、阿里云 NAS 或部分 SMB/CIFS 共享盘也不支持 chattr 扩展属性。
验证是否生效的最简方法:touch test && chattr +i test && rm test。如果 rm 成功,说明当前环境不支持 i 属性。
- 生产环境关键文件加
+i前,务必在同构环境(相同内核、相同文件系统、相同容器配置)中实测 - 替代方案可考虑用只读挂载(
mount -o remount,ro /path)或访问控制列表(setfacl -m u:untrusted:r-- file),但防护强度不如+i










