我有一台使用软件 RAID-1 阵列的 Ubuntu 18 服务器,并且smartctl
指示我的/dev/sda
出现故障。Throughput_Performance
和均Reallocated_Sector_Ct
列为“FAILING_NOW”。
但是,这并没有触发 RAID 故障,因为/proc/mdstat
仍然表明两个驱动器都正常。
不幸的是,尽管 smartctl 显示我的文件/dev/sdb
系统完全正常,但上面的错误/dev/sda
不知何故导致我的文件系统变为只读。任何写入或删除文件的尝试都会报告以下错误:
rm: cannot remove '<somefile>': Read-only file system
我知道 Linux 在检测到可能的驱动器故障时会执行此操作,以防止写入造成进一步的损坏。
但是我认为 RAID-1 的整个意义以及我使用它的原因在于它通过在两个驱动器之间镜像所有数据来避免单个驱动器故障破坏文件系统?驱动器故障应该会停止镜像,但仍允许操作系统对剩余驱动器进行完全读/写访问,对吗?
我将更换故障的驱动器,但同时如何修复文件系统,并防止单个驱动器故障破坏我的 RAID-1 阵列?
答案1
如果驱动器正在破坏数据,MD 层对此一无所知,它可能会返回或存储无效数据,然后它可能会使用这些数据将损坏的数据写回另一个磁盘;如果它对文件系统结构的理解是错误的,它就会做出错误的决定。
MD 层不会从多个驱动器读取数据并进行比较,也不会对驱动器故障太过敏感。它会不断尝试使用故障驱动器。这就是为什么我要在内核日志中监控“ata 异常”的变化,因为这些变化表明驱动器将比其他任何事情都先发生故障。然后,我只需删除mdadm --manage /dev/mdX --remove /dev/xxx
驱动器,然后使用mdadm --manage /dev/mdX --add /dev/xxx
.
同时,你可能需要移除故障驱动器,dd
对设备进行完整克隆/dev/mdX
作为备份(dd if=/dev/mdX of=/some/file/on/some/other/device bs=4M
)(或写入 stdout 并通过 ssh 传输),然后从 sysrescue CD/USB 驱动器执行fsck -f -C /dev/mdX
,多次(事实证明,这样做是必要的)。
(备份组件驱动器而不是镜像可能更为明智)