You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何将ext4文件系统中滞留的未写入脏数据刷入已恢复的磁盘?

如何将ext4文件系统中滞留的未写入脏数据刷入已恢复的磁盘?

遇到这种情况真的太闹心了——RAID万幸恢复了,文件系统也能正常读,但内存里几百MB的脏数据死活刷不进去,生怕一重启就丢了,完全不敢动对吧?我先帮你理清楚当前的状况,再给你几个针对性的排查和解决方向。

先明确你的场景

你用的是Ubuntu 22.04 LTS,存储栈是硬件RAID → LUKS加密 → LVM逻辑卷 → ext4文件系统。之前RAID故障触发了ext4自动切换为只读模式,恢复RAID后文件系统能正常读取,e2fsck也没检出错误,但内存里的脏数据始终无法写入磁盘——sync ; grep Dirty /proc/meminfo能明显看到几百MB的脏数据,这就是你不敢重启的核心原因。

你已经尝试过的操作(我帮你梳理清楚)

  • 尝试重新挂载文件系统为读写:
    mount -o remount /dev/mapper/vg1-data
    
    但报错:mount: /data: cannot remount /dev/mapper/vg1-data read-write, is write-protected
  • 验证过所有底层设备都是读写状态:
    • cat /sys/block/dm-*/ro输出全为0,说明设备 mapper 管控的所有卷(包括RAID之上的层)都是读写模式
    • dmsetup info vg1-data显示卷状态为ACTIVE(而非ACTIVE (READ-ONLY)
    • lvs输出的卷属性为正常的-wi-ao----
  • 查看ext4的错误日志:tune2fs -l显示上次错误是ext4_remount函数在5822行触发EBUSY,syslog里还记录了EXT4-fs error (device dm-N): ext4_remount:5822: comm mount: Abort forced by user
  • 试过先将LVM卷设为只读再切回读写:
    dmsetup table vg1-data | dmsetup reload -r vg1-data
    dmsetup resume vg1-data
    dmsetup info vg1-data
    
    但重新挂载仍报错,切回读写后错误时间戳还会更新
  • 尝试过cryptsetup reload,没有效果

问题核心分析

现在的关键矛盾是:所有底层设备(RAID、LUKS、LVM)都处于读写状态,但ext4文件系统本身被卡在了只读保护模式,无法执行写入操作,导致脏数据无法刷入磁盘。从ext4的错误日志来看,ext4_remount时触发EBUSY且被强制中止,这大概率是因为文件系统在RAID故障时进入了某种“安全锁定”状态,哪怕底层设备恢复了,文件系统自身没解除这个锁定。

针对性解决思路

1. 先排查是否有进程还在占用挂载点

EBUSY错误最常见的原因就是有进程还在挂载点上活跃——哪怕你停了所有业务应用,可能还有隐藏的后台服务、定时任务,甚至某个终端的当前目录还在/data下。你可以用这两个命令排查:

lsof /data
# 或者
fuser -mv /data

找到所有关联进程后,彻底终止它们,再尝试重新挂载为读写。

2. 尝试卸载文件系统后清除只读标记

如果能成功卸载文件系统(前提是所有进程都已退出),可以用tune2fs清除ext4的只读标记:

# 先卸载
umount /data
# 清除只读标记
tune2fs -o ^ro /dev/mapper/vg1-data
# 重新挂载
mount /dev/mapper/vg1-data /data

卸载前一定要确保没有进程占用,否则会触发卸载失败。

3. 检查LUKS加密层的读写状态

虽然你试过cryptsetup reload,但可以再仔细确认下crypt设备的状态:

cryptsetup status <你的crypt设备名>

如果发现异常,可以尝试重新加载crypt映射并强制指定读写模式:

cryptsetup reload --rw <你的crypt设备名>

4. 检查硬件RAID控制器的缓存状态

因为是硬件RAID,有可能控制器的缓存还处于异常状态,导致内核无法确认磁盘的可写性。你可以用RAID控制器的管理工具(比如megaclistorcli,具体取决于你的控制器型号):

  • 查看RAID阵列的健康状态和缓存配置
  • 尝试刷新控制器缓存或重置控制器(注意:重置前一定要确认RAID阵列已经完全恢复健康)

5. 最后的备选:内存脏数据dump(谨慎操作)

如果以上方法都不行,且你绝对不能重启,可以考虑尝试dump内存中的脏数据页,但这个操作需要对内核内存有一定了解,风险较高。你可以先查看脏数据对应的内存页信息,再通过工具导出,但这属于进阶操作,建议只有在万不得已时才尝试。

重要提醒

在所有操作前,如果你有条件,一定要先对当前磁盘做快照或备份,避免操作失误导致数据丢失。

备注:内容来源于stack exchange,提问作者Kai Petzke

火山引擎 最新活动