草稿待审,未覆盖: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>回滚。
参考资料
- [1] mount(8) – Linux manual page(man7-mount)
- [2] fsck(8) – Linux manual page(man7-fsck)
- [3] tune2fs(8) – Linux manual page(man7-tune2fs)
- [4] systemd.mount – Mount unit configuration(sd-mount)
- [5] xfs_repair(8) – Linux manual page(man7-xfs-repair)
文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。