linux目录只读保护需分层选择:chmod 555防普通用户误操作但root仍可改;chattr +i实现内核级冻结,root也无法增删改;chattr +a限仅追加,适合日志目录;mount -o ro锁定整个挂载点,适用于备份盘或nfs共享。

Linux 给目录设置“只读保护”,不能只靠 chmod 简单设成 444 或 555——因为目录的“只读”含义和文件不同,且普通权限对 root 无效,防护层级也各不相同。关键是要明确:你防的是谁?防什么操作?场景是什么?
以下是四种主流、实用、分层分明的方式,按防护强度从弱到强排列:
1. chmod 设置目录基础权限(防普通用户误操作)
目录的“可读”(r)指能 ls 列出内容,“可执行”(x)指能 cd 进入,“可写”(w)指能新建/删除/重命名文件。
- 要让普通用户能进、能看、但不能改:
chmod 555 /path/to/dir # r-x r-x r-x → 所有人都可进入、可列出,不可增删改
- ❗注意:
chmod 444 /path/to/dir会去掉 x 权限 → 普通用户连cd都进不去,ls也会报 Permission denied - ⚠️ root 仍可无视该权限:
rm -rf、touch、mv全部有效(只要父目录可写)
2. chattr +i 冻结整个目录(内核级硬锁,root 也无法修改)
这是真正意义上的“只读保护”,适用于证书、关键配置目录等必须防 root 误操作的场景:
sudo chattr +i /path/to/dir
- 效果:目录下任何文件都无法新增、删除、重命名、覆盖(哪怕子文件本身没加 i)
- 验证:
lsattr /path/to/dir输出末尾含i字符 - 解锁必须用:
sudo chattr -i /path/to/dir - ⚠️ 常见坑:脚本批量处理前未检查
lsattr,遇到 +i 目录直接中断;容器环境可能因缺失CAP_LINUX_IMMUTABLE而失败
3. chattr +a 限制为仅追加(适合日志类目录)
如果目录需持续写入新文件(如日志归档),但禁止删除或覆盖已有内容:
sudo chattr +a /path/to/logdir
- 效果:只允许
touch新文件、cp新文件、echo >>追加;rm、mv、> file、vim保存均失败 - 对目录设 +a:允许创建新文件,但不允许删除/重命名已有文件
- ❗+a 和 +i 互斥,不能共存
4. mount -o ro 挂载为只读(整块设备级防护)
当你要保护的是整个分区、备份盘、NFS 共享或镜像挂载点时,这才是合理选择:
# 临时挂载为只读 sudo mount -o ro /dev/sdb1 /mnt/archive # 已挂载后尝试重挂(需文件系统支持 remount) sudo mount -o remount,ro /mnt/archive # 永久生效:编辑 /etc/fstab,加 ro 选项 UUID=abcd-1234 /mnt/archive ext4 defaults,ro 0 2
- 优势:无需逐个文件设属性,所有路径自动拒绝写入
- 注意:某些只读文件系统(如 squashfs)无法 remount 为 rw,umount 后才可重新挂载
不复杂但容易忽略:选错层级,要么锁不住(如用 chmod 防 root),要么锁太死(如对日志目录误用 +i 导致服务写失败)。先想清楚目标,再挑对应工具。











