Linux文件只读需按威胁等级选择方法:chmod 444仅防普通用户,root仍可改;chattr +i实现内核级不可变,root也无法操作;chattr +a允追加禁覆盖,适合日志;mount -o ro适用于整设备或挂载点。

Linux 设置文件只读不是“一个命令搞定”的事,得先想清楚:你要防谁?防到什么程度?普通用户误改、脚本乱写、还是连 root 都不能碰?选错方法,要么锁不住,要么把自己也拦在外面。
chmod 444 只对普通用户有效,root 仍可覆盖
这是最常用也最容易误判的方式。执行 chmod 444 file.txt 后,ls -l 显示 r--r--r--,看起来很安全——但 root 仍能 echo "new" > file.txt 或 rm file.txt(只要父目录可写)。
- 适用场景:限制同组或普通用户编辑配置模板、临时共享文档
- 不适用场景:保护私钥、证书、系统关键配置(如
/etc/shadow) - 注意:
chmod -R 444 dir/会让目录无法进入(缺 x 权限),应改用chmod 555 dir/ - 验证方式:普通用户执行
echo test >> file.txt应失败;但sudo echo test > file.txt会成功
chattr +i 是真正的内核级只读,root 也得先解锁
chattr +i 设置的是文件系统不可变(immutable)属性,在 write 系统调用阶段就被内核拦截,优先级高于所有 POSIX 权限。加了 i 的文件,root 也无法修改、删除、重命名、硬链接、软链接指向它,vim 或 sed -i 直接报 Operation not permitted。
- 设置命令:
sudo chattr +i /path/to/file - 验证是否生效:
lsattr /path/to/file输出末尾含i - 目录加
+i后,禁止在其中新建、删除、重命名任何文件(哪怕子文件没加 i) - 常见坑:批量脚本前没
lsattr扫描,遇到+i文件直接中断;容器中因缺失CAP_LINUX_IMMUTABLE能力而失败
chattr +a 适合日志类文件:只允许追加,禁止覆盖
对 /var/log/app.log 这类需要持续写入但绝不允许清空或覆盖的文件,+a 比 +i 更合理。它允许 >> 追加,但拒绝 > 覆盖、truncate、rm 或 mv。
- 设置命令:
sudo chattr +a /var/log/app.log - 测试追加:
echo "$(date)" >> /var/log/app.log应成功 - 测试覆盖:
echo "reset" > /var/log/app.log应报Permission denied - 注意:
+a对目录生效时,允许创建新文件、修改已有文件内容,但禁止删除或重命名
挂载点级只读:适合整块设备或 NFS 共享
当你要保护的不是单个文件,而是一整块设备(比如备份盘、只读镜像、NFS 挂载点),mount -o ro 是更自然的选择。它让整个挂载点下所有文件和目录都拒绝写入,且不依赖单个文件属性。
- 临时挂载为只读:
sudo mount -o ro /dev/sdb1 /mnt/archive - 已挂载后重挂为只读:
sudo mount -o remount,ro /mnt/archive(需文件系统支持 remount) - fstab 持久化:
UUID=abcd-1234 /mnt/archive ext4 defaults,ro 0 2,之后sudo mount -a测试 - 常见失败原因:底层文件系统损坏、只读 squashfs 不支持 remount、或挂载点被占用
真正容易被忽略的点是层级混用风险:比如先 chmod 444 再 chattr +i,解除时必须先 chattr -i 才能 chmod;又比如在 LVM 逻辑卷上设了 lvchange -p r,再单独给文件加 +i 就多余了。防护强度要匹配真实威胁面,而不是堆砌命令。


















