今天早上醒来,我发现我的 RAID 主机(Linux 软件 RAID)发来一封电子邮件,告诉我一个驱动器发生故障。这是消费级硬件,没什么大不了的。我有冷备件。然而,当我到达服务器时,整个系统都没有反应。在某个时候,我想我别无选择,只能切断电源并重新启动。
系统启动后,故障驱动器仍被标记为故障,/proc/mdstat
看起来正确。但是,它无法安装/dev/md0
并告诉我:
mount: /dev/md0: can't read superblock
现在我开始担心了。所以我尝试xfs_check
和xfs_repair
,前者告诉我:
xfs_check: /dev/md0 is invalid (cannot read first 512 bytes)
后者:
Phase 1 - find and verify superblock...
superblock read failed, offset 0, size 524288, ag 0, rval 0
fatal error -- Invalid argument
现在我开始害怕了。到目前为止,我的谷歌搜索毫无结果。现在,我还没有陷入恐慌,因为我以前也害怕过,而且几天内总会解决。我今晚仍然可以插入我的冷备用,让它重建(36 小时),然后看看文件系统是否处于更可用的状态。我甚至可以尝试将阵列从当前的 11 个驱动器重新调整为 10 个驱动器(因为我还没有扩展文件系统),看看这是否有帮助(这需要一周的时间)。
但是当我在工作时,在我今晚在家做这些事情之前,我想在这里寻求专家的帮助。
有谁对文件系统和 RAID 有更了解,有什么建议吗?也许我可以从这里通过 SSH 做一些事情来进一步诊断文件系统问题,甚至可能修复它?
编辑:
看起来/proc/mdstat
实际上是在提供一个线索:
Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] [multipath]
md0 : inactive sdk1[10] sdh1[7] sdj1[5] sdg1[8] sdi1[6] sdc1[2] sdd1[3] sde1[4] sdf1[9] sdb1[0]
19535119360 blocks
inactive
? 因此我尝试组装数组:
# mdadm --assemble /dev/md0 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 /dev/sdf1 /dev/sdg1 /dev/sdh1 /dev/sdi1 /dev/sdj1 /dev/sdk1
mdadm: device /dev/md0 already active - cannot assemble it
它已经处于活动状态?尽管/proc/mdstat
它告诉我它处于非活动状态?
答案1
事实证明,它并不像我开始担心的那样可怕——潜在的数据丢失。当我注意到阵列已经存在inactive
但无法组装时,我停止了它:
# mdadm -S /dev/md0
mdadm: stopped /dev/md0
然后尝试组装它:
# mdadm --assemble /dev/md0 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 /dev/sdf1 /dev/sdg1 /dev/sdh1 /dev/sdi1 /dev/sdj1 /dev/sdk1
mdadm: /dev/md0 assembled from 10 drives - not enough to start the array while not clean - consider --force.
还是有点害怕,让我们看看有什么/proc/mdstat
要说的:
# cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] [multipath]
md0 : inactive sdb1[0](S) sdk1[10](S) sdf1[9](S) sdg1[8](S) sdh1[7](S) sdi1[6](S) sdj1[5](S) sde1[4](S) sdd1[3](S) sdc1[2](S)
19535119360 blocks
全部... 备用...?好吧,又害怕了。再停一下:
# mdadm -S /dev/md0
mdadm: stopped /dev/md0
并尝试使用其建议的方法--force
:
# mdadm --assemble /dev/md0 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 /dev/sdf1 /dev/sdg1 /dev/sdh1 /dev/sdi1 /dev/sdj1 /dev/sdk1 --force
mdadm: /dev/md0 has been started with 10 drives (out of 11).
11 个中的 10 个,因为其中一个坐在电脑旁边的架子上,到目前为止一切都很好:
# cat /proc/mdstat
Personalities : [linear] [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] [multipath]
md0 : active raid6 sdb1[0] sdk1[10] sdf1[9] sdg1[8] sdh1[7] sdi1[6] sdj1[5] sde1[4] sdd1[3] sdc1[2]
17581607424 blocks level 6, 64k chunk, algorithm 2 [11/10] [U_UUUUUUUUU]
松一口气,最后进行一次测试:
# mount /dev/md0 /mnt/data
# df -ahT
Filesystem Type Size Used Avail Use% Mounted on
/dev/root ext4 73G 6.9G 63G 10% /
proc proc 0 0 0 - /proc
sysfs sysfs 0 0 0 - /sys
usbfs usbfs 0 0 0 - /proc/bus/usb
tmpfs tmpfs 1.7G 0 1.7G 0% /dev/shm
/dev/md0 xfs 15T 14T 1.5T 91% /mnt/data
一切都松了一口气。我需要喝点东西……
答案2
2009 年我遇到过类似的问题,在 Facebook 上炫耀过,但后来却无法重现解决方案。不过,数据丢失更可怕。我发帖是为了后人,也是为了我自己能找到它。
问题略有不同 - gparted 说 sda1 是 xfs 而 sda2 未知,两者都应该是 raid 分区,并且 xfs 应该在 md0 上
# mdadm --assemble --force /dev/md0 /dev/sda1 /dev/sdb1
# xfs_repair -v /dev/md0
# mount /dev/md0 /mount/myRaid