我的 mdadm RAID5 阵列刚刚经历了 5>8 磁盘增长和重塑。这持续了好几天并且不间断。当cat /proc/mdstat
说它完成时,我重新启动了系统,现在阵列不再显示。
我发现的一个潜在问题是,我在添加新驱动器时使用了完整的磁盘(例如,/dev/sda
不使用/dev/sda1
)。然而,这些驱动器上有应该跨越整个驱动器的分区。
我努力了:
$ sudo mdadm --assemble --scan
mdadm: No arrays found in config file or automatically
新添加的三个驱动器似乎没有 md 超级块:
$ sudo mdadm --examine /dev/sd[kln]
/dev/sdk:
MBR Magic : aa55
Partition[0] : 4294967295 sectors at 1 (type ee)
/dev/sdl:
MBR Magic : aa55
Partition[0] : 4294967295 sectors at 1 (type ee)
/dev/sdn:
MBR Magic : aa55
Partition[0] : 4294967295 sectors at 1 (type ee)
$ sudo mdadm --examine /dev/sd[kln]1
mdadm: No md superblock detected on /dev/sdk1.
mdadm: No md superblock detected on /dev/sdl1.
mdadm: No md superblock detected on /dev/sdn1.
其他五个人这样做并显示了数组的正确统计数据:
$ sudo mdadm --examine /dev/sd[ijmop]1
/dev/sdi1:
Magic : a92b4efc
Version : 1.2
Feature Map : 0x1
Array UUID : 7399b735:98d9a6fb:2e0f3ee8:7fb9397e
Name : Freedom-2:127
Creation Time : Mon Apr 2 18:09:19 2018
Raid Level : raid5
Raid Devices : 8
Avail Dev Size : 15627795456 (7451.91 GiB 8001.43 GB)
Array Size : 54697259008 (52163.37 GiB 56009.99 GB)
Used Dev Size : 15627788288 (7451.91 GiB 8001.43 GB)
Data Offset : 254976 sectors
Super Offset : 8 sectors
Unused Space : before=254888 sectors, after=7168 sectors
State : clean
Device UUID : ca3cd591:665d102b:7ab8921f:f1b55d62
Internal Bitmap : 8 sectors from superblock
Update Time : Tue Jul 14 11:46:37 2020
Bad Block Log : 512 entries available at offset 72 sectors
Checksum : 6a1bca88 - correct
Events : 401415
Layout : left-symmetric
Chunk Size : 512K
Device Role : Active device 3
Array State : AAAAAAAA ('A' == active, '.' == missing, 'R' == replacing)
...等
强制装配不起作用:
$ sudo mdadm /dev/md1 --assemble --force /dev/sd[ijmop]1 /dev/sd[kln]
mdadm: /dev/sdi1 is busy - skipping
mdadm: /dev/sdj1 is busy - skipping
mdadm: /dev/sdm1 is busy - skipping
mdadm: /dev/sdo1 is busy - skipping
mdadm: /dev/sdp1 is busy - skipping
mdadm: Cannot assemble mbr metadata on /dev/sdk
mdadm: /dev/sdk has no superblock - assembly aborted
我不知道如何继续。
非常感谢您提供的所有帮助。
答案1
我发现的一个潜在问题是,我在添加新驱动器时使用了完整的磁盘(例如,
/dev/sda
不使用/dev/sda1
)。然而,这些驱动器上有应该跨越整个驱动器的分区。
将完整磁盘用于分区表以外的任何内容都是危险的。一旦其他任何东西写入分区表,您的全磁盘 RAID / LUKS / LVM / 文件系统元数据就会消失。除了用户错误之外,有很多工具和环境可以在不需要真正询问您的情况下编写分区表。
这似乎正是发生在你身上的事情。您或其他人用分区表覆盖了三个磁盘上的元数据。通常无法恢复丢失的元数据。例如,parted
'smklabel gpt
会将 mdadm 1.2 元数据(从开始起 4K)完全清零。
因此,你唯一的希望就是重新创建 RAID从头开始构建新的元数据。
并且必须以完全相同的方式重新创建它,因此,如果您确定使用完整磁盘而不是分区,则必须使用完整磁盘重新创建它,并且也按正确的顺序。恢复数据后,请考虑迁移到分区而不是完整磁盘设备。
请注意,您的驱动器顺序不是按字母顺序排列的,您仅显示了阵列中恰好是第四个驱动器(从 0 开始计数,设备角色 3)的mdadm --examine
输出。/dev/sdi1
为了成功重新创建,请仔细阅读检查输出以推断出正确的设置。此外,您的数据偏移量不寻常(因为--grow
更改了它)。
和写时复制覆盖在适当的位置,您正在寻找的命令应该类似于:
mdadm --create /dev/md100 --assume-clean \
--level=5 --chunk=512 --data-offset=127488 --layout=left-symmetric \
--raid-devices=8 /dev/mapper/sd{?,?,?,i,?,?}1 /dev/mapper/sd{k,l,n}
(我不知道你的驱动器顺序,所以我用?
正确的驱动器字母代替,还要注意{c,b,a}
语法在不保持顺序的情况下保持顺序不变[cba]
。如果有疑问,请将其写出来,而不是使用 shell 扩展。)
为了确保现有的 GPT 分区表不会再次干扰,您应该将其删除wipefs
(仅从完整磁盘成员中)。这会删除磁盘开头和结尾处的 GPT,因此任何寻找 GPT 并在磁盘结尾处找到它的软件都不会感到被迫在磁盘开头还原它,从而在此过程中擦除元数据。
# wipefs --no-act --all --types gpt,PMBR /dev/loop0
/dev/loop0: 8 bytes were erased at offset 0x00000200 (gpt): 45 46 49 20 50 41 52 54
/dev/loop0: 8 bytes were erased at offset 0x7ffffe00 (gpt): 45 46 49 20 50 41 52 54
/dev/loop0: 2 bytes were erased at offset 0x000001fe (PMBR): 55 aa
(移除--no-act
以实际执行擦除。)
祝你好运...如果分区表是唯一的问题,那么你应该有很大的成功机会。如果其他数据也被更改(创建分区并格式化它们的某些内容),您将看到 RAID 本身的数据损坏。
附:
$ sudo mdadm /dev/md1 --assemble --force /dev/sd[ijmop]1 /dev/sd[kln] mdadm: /dev/sdi1 is busy - skipping
此消息(忙跳过)通常意味着md
设备已组装(由于增量组装方法,阵列不完整时会发生这种情况)。
在这种情况下,您必须mdadm --stop
先访问非活动数组,然后mdadm --assemble
再尝试访问它。 (如果之前确实缺少驱动器,则继续增量组装)。