linux中将分区设为只读的核心是通过挂载选项ro实现,临时用mount -o remount,ro,持久化需在/etc/fstab中配置defaults,ro,内核在vfs层拦截所有写操作,root亦不可绕过。

在 Linux 中将分区设为只读,核心目标是阻止任何写入操作(包括病毒写入、误删改、恶意覆盖),但必须区分“临时挂载只读”和“持久化只读”,且不能影响系统正常运行。关键不在于表面权限,而在于挂载行为本身被内核拦截。
一、临时将已挂载分区设为只读(推荐用于应急防护)
适用于已挂载的设备(如 /dev/sdb1 挂在 /mnt/usb),且文件系统支持重新挂载(ext4、xfs 等主流格式均支持):
- 先确认挂载点:运行 mount | grep sdb1 或 findmnt /mnt/usb,确保目标分区当前是可写的(输出含 rw)
- 执行重挂载命令:sudo mount -o remount,ro /mnt/usb
- 验证是否生效:再次运行 mount | grep sdb1,输出中必须显示 ro;再尝试 touch /mnt/usb/test,应报错 Read-only file system
⚠️ 注意:若提示 mount: /mnt/usb is busy,说明有进程正在访问该分区(如 shell 当前在其中、文件被打开、备份工具扫描中)。可用 lsof +D /mnt/usb 或 fuser -vm /mnt/usb 查看并终止相关进程。
二、卸载后重新以只读方式挂载(更稳妥,适合归档盘、镜像盘)
适用于未挂载或可安全卸载的设备(如备份硬盘、只读 ISO 镜像):
- 识别设备名:lsblk -f 或 sudo fdisk -l,找到目标分区(如 /dev/sdc1)及文件系统类型(如 ntfs 或 vfat)
- 若已挂载,先卸载:sudo umount /mnt/usb
- 重新挂载为只读:sudo mount -o ro,uid=1000,gid=1000 /dev/sdc1 /mnt/usb(ro 是核心参数;uid/gid 确保普通用户能浏览内容)
- 验证同上:检查 mount 输出与 touch 测试
三、开机自动以只读挂载(fstab 持久化)
适用于固定用途的只读设备(如只读系统镜像、合规审计盘),避免每次重启手动设置:
- 获取设备唯一标识:sudo blkid /dev/sdc1,复制 UUID(如 UUID=abcd-1234)
- 编辑 fstab:sudo nano /etc/fstab
- 新增一行:UUID=abcd-1234 /mnt/readonly ext4 defaults,ro 0 2(注意:文件系统类型按实际填写,如 vfat 或 ntfs;ro 必须放在 defaults, 后面)
- 测试配置是否合法:sudo mount -a,无报错即生效;下次启动将自动只读挂载
四、不推荐但需避开的误区
以下操作看似“设只读”,实则无效或危险:
- 仅用 chmod 444 /mnt/usb/*:只改文件权限,对 root 无效,也无法阻止新建文件或删除目录项
- 对整个挂载点目录设 chattr +i:会锁死目录本身,导致无法进入(Permission denied),且卸载后属性仍保留,易引发后续问题
- 在 Windows 下设 NTFS “只读属性” 再插到 Linux:Linux 不识别该标志,完全无效
真正起作用的是挂载时的 ro 标志——它由内核在 VFS 层拦截所有 write 系统调用,连 root 也无法绕过。











