Linux设置文件只读需分层选择:chmod 444仅防普通用户,root仍可覆盖;chattr +i实现内核级不可变锁定,连root也无法修改、删除或重命名;mount -o ro锁定整个挂载点;lvchange -p r在LVM层禁写。

Linux 设置文件只读,不是“一个命令搞定”的事——选错方法,root 仍能覆盖、脚本照样失败、容器里直接报错。
chmod 444 或 a=r 只防普通用户,root 无视它
这是最常用也最容易误判的方式。执行 chmod 444 file 或 chmod a=r file 后,ls -l file 显示 r--r--r--,但 root 依然能:echo test > file、rm file、mv newfile file。
- 适用场景:临时限制同组或他人编辑配置文件(如
/etc/nginx/conf.d/*.conf),且你信任 root 操作 - 不适用场景:私钥(
/etc/ssl/private/server.key)、CA 证书、系统启动配置等需防 root 误操作的文件 - 注意目录不能用
chmod 444 dir/:会去掉执行位(x),导致cd dir/失败;应改用chmod 555 dir/
chattr +i 是真·只读,连 root 也得先解锁
chattr +i 触发内核级拦截,在 write 系统调用阶段就拒绝,优先级高于所有 POSIX 权限。加了 i 属性的文件,root 也无法修改、删除、重命名、硬链接、软链接指向它,vim 或 sed -i 直接报 Operation not permitted。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 设置命令:
sudo chattr +i /path/to/file - 验证是否生效:
lsattr /path/to/file输出末尾含i - 目录加
+i后,禁止在其中新建/删除/重命名任何文件(哪怕子文件没加 i) - 常见坑:批量脚本未提前
lsattr扫描,遇到+i文件直接中断;Docker 容器中若没启用CAP_LINUX_IMMUTABLE,chattr会静默失败
mount -o ro 锁整个挂载点,适合备份盘或 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测试 - 若
remount失败,说明底层文件系统损坏或不支持(如 squashfs 无法从 ro 切到 rw),只能先umount再重新挂载
lvchange -p r 在 LVM 层禁写,适合归档逻辑卷
对使用 LVM 管理的长期归档卷(如 /dev/vg0/archive_lv),lvchange -p r 从逻辑卷层面禁用写入,比逐个文件加 chattr +i 更轻量、更易管理。
- 设置只读:
sudo lvchange -p r /dev/vg0/archive_lv - 验证:
sudo lvs -o +attr /dev/vg0/archive_lv,输出中第二列含r表示只读 - 恢复可写:
sudo lvchange -p w /dev/vg0/archive_lv - 注意:该操作不影响已挂载的文件系统状态,若已挂载为读写,需配合
mount -o remount,ro才真正生效
真正难的不是命令怎么敲,而是想清楚:你要防谁?是普通用户误改,还是 root 误删?是单个密钥,还是整块备份盘?选错层级,防护就形同虚设。

















