首页 > Sysadmin > 正文

Linux 磁盘变只读:排查与恢复实战

huyuanwen 2026-11-04 Sysadmin

草稿待审,未覆盖:XFS/Btrfs 修复命令、真实磁盘 I/O 错误触发只读挂载、循环设备只读后再读写、Btrfs btrfs check --repair 未在 WSL 实测。

磁盘被内核自动挂载为只读,通常是文件系统错误触发的保护机制。本文覆盖 ext4/XFS 两类常见场景,先定位只读原因,再安全恢复。

TL;DR:mount | grep ro 找到只读挂载点后,先修复底层文件系统错误,再 mount -o remount,rw <挂载点>;ext4 可通过 tune2fs -e remount-ro 让内核在出错时自动只读保护。

判断原因

# 列出所有挂载点及选项
findmnt -l

# 快速筛选只读挂载
mount | grep '(ro'

若看到某个设备出现在 ro 行,说明该文件系统当前只读。常见触发条件:文件系统元数据损坏、I/O 错误、内核 errors=remount-ro 保护。

ext4 的 errors=remount-ro 行为由 tune2fs 控制[3];systemd 管理的挂载点也可通过 ReadWriteOnly= 限制只读[4]。

临时恢复读写

只读挂载点可以尝试 remount 回读写:

sudo mount -o remount,rw /mnt/data

mount(8) 说明 -o remount 会尝试在不卸载的情况下变更挂载选项[1]。

注意:如果底层块设备本身是写保护的(如只读光盘、已设为只读的 loop 设备),remount,rw 会失败。实测中,以只读方式挂载 loop 镜像后,remount,rw 报错 “write-protected”,需先删除 loop 再重新挂载。

修复文件系统错误

# ext4:先卸载再检查
sudo umount /dev/sdX1
sudo fsck.ext4 -y -f /dev/sdX1

fsck 是各种文件系统检查器的前端,-y 自动回答 yes,-f 强制检查[2]。

# XFS:同样要求卸载
sudo umount /dev/sdX1
sudo xfs_repair /dev/sdX1

xfs_repair 只能修复已卸载的 XFS 文件系统[5]。

Btrfs 使用 btrfs check --repair(基于文档,尚未在 WSL 实测)。修复完成后再次挂载,确认已恢复读写。

永久预防

  • ext4:sudo tune2fs -e remount-ro /dev/sdX1,让内核在检测到错误时自动只读保护[3]。
  • systemd:在 .mount 单元里加 ReadWriteOnly=no(默认即可),或显式设置 Options=rw[4]。
  • 定期检查:dmesg | grep -i error 监控磁盘 I/O 错误。

排错速查表

现象 可能原因 处理
mount: cannot remount ... read-write, is write-protected loop 设备或块设备写保护 先卸载 loop,重新以读写方式挂载
fsck 报 “device is busy” 目标分区正在挂载 先 umount,或从 recovery 环境执行
修复后仍只读 fstab 或 systemd mount 单元写了 ro 检查 /etc/fstab 和 systemctl cat <mount>
XFS 提示 “device is mounted” xfs_repair 只能在卸载后运行 先 umount
WSL2 里无法运行 fsck WSL2 虚拟磁盘不能从内部 fsck 从 Windows 侧检查磁盘镜像,或重建 distro

回滚与撤销

  • 若 tune2fs 改错了错误行为:sudo tune2fs -e continue /dev/sdX1 恢复默认。
  • 若误删数据:fsck 会重建丢失的 inode,但部分数据可能进入 lost+found。修复前可用 debugfs 或 extundelete 尝试恢复(未实测)。
  • systemd 临时变更:systemctl edit <mount> 加 ReadWriteOnly=no 或修改 Options=,systemctl daemon-reload && systemctl restart <mount> 回滚。

参考资料

文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。