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,被内核拦截了。