用lsattr可直接查看文件是否被chattr锁定,如输出含“i”表示不可修改(root也无法删改)、含“a”表示仅可追加;不支持扩展属性的文件系统会提示Operation not supported。

怎么用 lsattr 查看文件是否被 chattr 锁定
Linux 中“文件属性锁定”特指通过 chattr 设置的扩展属性(如不可删、不可改),和 flock 或 fcntl 这类进程级锁无关。lsattr 是唯一能直接读取这类属性的命令。
常见误判点:很多人把“文件被进程占用”当成“属性被锁定”,结果用 lsattr 查不到任何输出,就以为没锁——其实根本不是同一类机制。
-
lsattr /path/to/file:显示该文件的扩展属性,如----i---------e-----中的i表示不可修改(even by root) -
lsattr -R /path/to/dir:递归查看目录下所有文件属性(慎用,可能很慢) -
lsattr不显示普通权限(rw-)、所有权或 ACL,那些得用stat或getfacl - 若提示
Operation not supported,说明文件系统不支持扩展属性(如某些 NFS、FAT 分区)
stat 能不能看出文件被加了属性锁
不能直接看出 i 或 a 这类属性,但 stat 可以帮你交叉验证:lsattr 显示有 i,而 stat 显示权限正常、所有者是 root,那就基本确认是属性级锁定而非权限问题。
stat 的关键价值在于排除干扰:
-
stat -c "%a %U %G %x %y %z" /path/to/file:一次性看八进制权限、所有者、修改时间、变更时间(%z是 Change time,chattr操作会更新它) - 如果
%z时间远新于%y(Modify time),且你没改过内容,大概率刚执行过chattr -
stat输出里没有 “immutable” 字样,也不报错,说明文件系统支持扩展属性——这是lsattr能生效的前提
为什么 fuser 和 lsof 查不到属性锁
因为 fuser 和 lsof 查的是“进程打开/持有文件”,不是“文件系统级属性”。chattr +i 后,哪怕没有任何进程在用这个文件,它照样不能删、不能写。
典型现象:
-
fuser -v /etc/shadow可能显示systemd或login在用,但chattr +i /etc/shadow后,rm仍失败——这不是进程锁,是内核拒绝操作 -
lsof /path/to/file | grep "DEL"为空,不代表文件“没被锁”,只代表没进程正在删除它 - 用
sudo fuser -k杀掉所有占用进程,对i属性锁完全无效
查属性锁必须用 root 权限吗
不一定,但强烈建议用。普通用户运行 lsattr 可以看到自己有读权限的文件的属性,但以下情况会失败:
- 目标文件属主不是当前用户,且没开放读权限(
lsattr需要读 inode 扩展属性) - 文件系统挂载时用了
noatime或nodev等选项,部分旧内核版本会连带禁用扩展属性访问 - 最稳妥方式始终是
sudo lsattr /path/to/file,避免因权限静默失败
真正容易被忽略的点:属性锁(chattr)和进程锁(flock)完全独立,排查时别混用工具;lsattr 看不到 flock,lslocks 也看不到 i 属性——它们压根不在一个抽象层上。


















