简而言之
跟随指南如何在 GNU/Linux 下设置 RAID 1,我已经设置了RAID 1。通过各种方式检查RAID阵列的有效性,似乎是正常的。
然而,重新启动系统后,RAID 阵列无法工作。未按照 中的说明安装有问题的分区/etc/fstab
。手动组装阵列,没有丢失任何数据。
新添加的内部/外部磁盘导致磁盘设备名称发生更改(例如系统将磁盘“重命名”sdd
为),使我接受这是与此名称更改事实相关的问题。sde
然而,这是无关紧要的,因为 RAID 阵列(也)是通过使用唯一的 UUID 构建的。
实际的问题是为什么在启动过程中阵列无法组装?要不然,Funtoo(所有情节发生的操作系统)的启动脚本在处理mdadm -assemble
过程中做了什么?
故事很长
按照上面引用的分步指南,我在 Funtoo 下设置了 RAID 1。检查 RAID 1 阵列的有效性可以通过多种方式完成,主要是使用mdadm
工具本身的功能。
具体来说,数组的详细信息是通过使用mdadm
带有-D
标志的工具来检索的。使用该标志检查属于该阵列的磁盘-E
。mdadm.conf
如果相应的配置文件包含正确的指令(即哪个 md 设备、它的 UUID 是什么等等),则可以轻松读取该配置文件。最后,监视文件/proc/mdadm
对于确保两个磁盘都处于活动状态并且“同步”非常重要。
以下是有关所面临情况的更详细信息。
mdadm -D /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Thu Jul 18 00:25:05 2013
Raid Level : raid1
Array Size : 1953382208 (1862.89 GiB 2000.26 GB)
Used Dev Size : 1953382208 (1862.89 GiB 2000.26 GB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent
Update Time : Thu Jul 18 10:33:37 2013
State : clean
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0
Name : Resilience:0 (local to host Resilience)
UUID : 73bf29ca:89bff887:79a26531:b9733d7a
Events : 6455
Number Major Minor RaidDevice State
2 8 33 0 active sync /dev/sdc1
1 8 49 1 active sync /dev/sdd1
根据命令历史记录,我执行了以下操作
# trying to follow the guide -- various tests...
...
979 18.Jul.13 [ 00:09:07 ] mdadm --zero-superblock /dev/sdd1
980 18.Jul.13 [ 00:09:17 ] mdadm --create /dev/md0 --level=1 --raid-disks=2 missing /dev/sdd1
990 18.Jul.13 [ 00:15:58 ] mdadm --examine --scan
# creating/checking the configuration file
992 18.Jul.13 [ 00:16:17 ] cat /etc/mdadm.conf
993 18.Jul.13 [ 00:16:33 ] mdadm --examine --scan | tee /etc/mdadm.conf
994 18.Jul.13 [ 00:16:35 ] cat /etc/mdadm.conf
# after some faulty attempts, finally it goes
997 18.Jul.13 [ 00:24:45 ] mdadm --stop /dev/md0
998 18.Jul.13 [ 00:24:54 ] mdadm --zero-superblock /dev/sdd1
999 18.Jul.13 [ 00:25:04 ] mdadm --create /dev/md0 --level=1 --raid-disks=2 missing /dev/sdd1
1005 18.Jul.13 [ 00:26:39 ] mdadm --examine --scan | sudo tee /etc/mdadm.conf
1046 18.Jul.13 [ 03:42:57 ] mdadm --add /dev/md0 /dev/sdc1
配置文件内容/etc/mdadm.conf
如下:
ARRAY /dev/md/0 metadata=1.2 UUID=73bf29ca:89bff887:79a26531:b9733d7a name=Resilience:0
从以下内容可以看出,一切正常/proc/mdadm
:
Personalities : [raid6] [raid5] [raid4] [raid1] [raid0] [raid10] [linear] [multipath]
md0 : active raid1 sdc1[2] sdd1[1]
1953382208 blocks super 1.2 [2/2] [UU]
unused devices: <none>
此后,磁盘已同步,访问正常。关闭系统、添加另一个磁盘(外部(通过 USB)或内部)并重新启动系统,导致 RAID1 停止工作!原因是,如果我没记错的话,是磁盘设备号的改变。
在此示例中,前者sdd1
变为在启动系统之前由“新”内部磁盘或连接的外部 USB HDDsde1
保留sdd1
并指示自动安装。
通过删除所有其他磁盘、停止阵列并重新组装它,可以非常轻松地“恢复”“失败”的阵列。在尝试并最终成功取回 ARRAY 时发出的一些命令是:
# booting and unsuccessfully trying to add the "missing" disk
1091 18.Jul.13 [ 10:22:53 ] mdadm --add /dev/md0 /dev/sdc1
1092 18.Jul.13 [ 10:28:26 ] mdadm --assemble /dev/md0 --scan
1093 18.Jul.13 [ 10:28:39 ] mdadm --assemble /dev/md0 --scan --force
1095 18.Jul.13 [ 10:30:36 ] mdadm --detail /dev/md0
# reading about `mdadm`, trying to "stop", incomplete command though
1096 18.Jul.13 [ 10:30:45 ] mdadm stop
1097 18.Jul.13 [ 10:31:12 ] mdadm --examine /dev/sdd
1098 18.Jul.13 [ 10:31:16 ] mdadm --examine /dev/sdd1
1099 18.Jul.13 [ 10:31:20 ] mdadm --examine /dev/sdc
1100 18.Jul.13 [ 10:31:21 ] mdadm --examine /dev/sdc1
# reading again, stop it -- the right way
1101 18.Jul.13 [ 10:33:19 ] mdadm --stop /dev/md0
# assemble & check
1102 18.Jul.13 [ 10:33:25 ] mdadm --assemble /dev/md0 --scan
1111 18.Jul.13 [ 10:34:17 ] mdadm --examine /dev/sd[cd]1
# does the Array have a UUID?
1112 18.Jul.13 [ 10:37:36 ] UUID=$(mdadm -E /dev/sdd1|perl -ne '/Array UUID : (\S+)/ and print $1')
# below, learning how to report on the Array
1115 18.Jul.13 [ 10:42:26 ] mdadm -D /dev/md0
1116 18.Jul.13 [ 10:45:08 ] mdadm --examine /dev/sd[cd]1 >> raid.status
1197 18.Jul.13 [ 13:16:59 ] mdadm --detail /dev/md0
1198 18.Jul.13 [ 13:17:29 ] mdadm --examine /dev/sd[cd]1
1199 18.Jul.13 [ 13:17:41 ] mdadm --help
1200 18.Jul.13 [ 13:18:41 ] mdadm --monitor /dev/md0
1201 18.Jul.13 [ 13:18:53 ] mdadm --misc /dev/md0
但是,我希望这种情况不会发生,并且当基于 UUID 和/或标签进行安装时,能够像其他磁盘/分区一样安全地进行操作。
中的相应条目/etc/fstab
读取(笔记,我跳过了选项nosuid,nodev
)
/dev/md0 geo xfs defaults 0 2
的详细信息sdc1
,输出来自mdadm -E /dev/sdc1
/dev/sdc1:
Magic : a92b4efc
Version : 1.2
Feature Map : 0x0
Array UUID : 73bf29ca:89bff887:79a26531:b9733d7a
Name : Resilience:0 (local to host Resilience)
Creation Time : Thu Jul 18 00:25:05 2013
Raid Level : raid1
Raid Devices : 2
Avail Dev Size : 3906764800 (1862.89 GiB 2000.26 GB)
Array Size : 1953382208 (1862.89 GiB 2000.26 GB)
Used Dev Size : 3906764416 (1862.89 GiB 2000.26 GB)
Data Offset : 262144 sectors
Super Offset : 8 sectors
State : clean
Device UUID : 5552ba2d:8d79c88f:c995d052:cef0aa03
Update Time : Fri Jul 19 11:14:19 2013
Checksum : 385183dd - correct
Events : 6455
Device Role : Active device 0
Array State : AA ('A' == active, '.' == missing)
有关分区的详细信息
的详细信息sdd1
,输出来自mdadm -E /dev/sdd1
/dev/sdd1:
Magic : a92b4efc
Version : 1.2
Feature Map : 0x0
Array UUID : 73bf29ca:89bff887:79a26531:b9733d7a
Name : Resilience:0 (local to host Resilience)
Creation Time : Thu Jul 18 00:25:05 2013
Raid Level : raid1
Raid Devices : 2
Avail Dev Size : 3906764800 (1862.89 GiB 2000.26 GB)
Array Size : 1953382208 (1862.89 GiB 2000.26 GB)
Used Dev Size : 3906764416 (1862.89 GiB 2000.26 GB)
Data Offset : 262144 sectors
Super Offset : 8 sectors
State : clean
Device UUID : 076acfd8:af184e75:f83ce3ae:8e778ba0
Update Time : Fri Jul 19 11:14:19 2013
Checksum : c1df68a0 - correct
Events : 6455
Device Role : Active device 1
Array State : AA ('A' == active, '.' == missing)
再次添加“新”内部磁盘并重新启动后,我遇到了同样的问题。
mdadm -E /dev/sdd1
报告
mdadm: No md superblock detected on /dev/sdd1.
尽管mdadm -E /dev/sde1
/dev/sde1:
Magic : a92b4efc
Version : 1.2
Feature Map : 0x0
Array UUID : 73bf29ca:89bff887:79a26531:b9733d7a
Name : Resilience:0 (local to host Resilience)
Creation Time : Thu Jul 18 00:25:05 2013
Raid Level : raid1
Raid Devices : 2
Avail Dev Size : 3906764800 (1862.89 GiB 2000.26 GB)
Array Size : 1953382208 (1862.89 GiB 2000.26 GB)
Used Dev Size : 3906764416 (1862.89 GiB 2000.26 GB)
Data Offset : 262144 sectors
Super Offset : 8 sectors
State : clean
Device UUID : 076acfd8:af184e75:f83ce3ae:8e778ba0
Update Time : Fri Jul 19 11:34:47 2013
Checksum : c1df6d6c - correct
Events : 6455
Device Role : Active device 1
Array State : AA ('A' == active, '.' == missing)
和mdadm --detail /dev/md0
mdadm: md device /dev/md0 does not appear to be active.
cat /proc/mdstat
在阅读时
Personalities : [raid6] [raid5] [raid4] [raid1] [raid0] [raid10] [linear] [multipath]
md0 : inactive sde1[1](S)
1953382400 blocks super 1.2
unused devices: <none>
请注意,根据吉尔斯的观察,此时报告的块 (1953382400) 与 报告的块不匹配Array Size : 1953382208
,如上面(或下面)所示。显然,这里出了问题。
的(部分)输出mdadm -Evvvvs
是
/dev/sde1:
Magic : a92b4efc
Version : 1.2
Feature Map : 0x0
Array UUID : 73bf29ca:89bff887:79a26531:b9733d7a
Name : Resilience:0 (local to host Resilience)
Creation Time : Thu Jul 18 00:25:05 2013
Raid Level : raid1
Raid Devices : 2
Avail Dev Size : 3906764800 (1862.89 GiB 2000.26 GB)
Array Size : 1953382208 (1862.89 GiB 2000.26 GB)
Used Dev Size : 3906764416 (1862.89 GiB 2000.26 GB)
Data Offset : 262144 sectors
Super Offset : 8 sectors
State : clean
Device UUID : 076acfd8:af184e75:f83ce3ae:8e778ba0
Update Time : Fri Jul 19 11:34:47 2013
Checksum : c1df6d6c - correct
Events : 6455
Device Role : Active device 1
Array State : AA ('A' == active, '.' == missing)
/dev/sde:
MBR Magic : aa55
Partition[0] : 3907026944 sectors at 2048 (type fd)
/dev/sdc1:
Magic : a92b4efc
Version : 1.2
Feature Map : 0x0
Array UUID : 73bf29ca:89bff887:79a26531:b9733d7a
Name : Resilience:0 (local to host Resilience)
Creation Time : Thu Jul 18 00:25:05 2013
Raid Level : raid1
Raid Devices : 2
Avail Dev Size : 3906764800 (1862.89 GiB 2000.26 GB)
Array Size : 1953382208 (1862.89 GiB 2000.26 GB)
Used Dev Size : 3906764416 (1862.89 GiB 2000.26 GB)
Data Offset : 262144 sectors
Super Offset : 8 sectors
State : clean
Device UUID : 5552ba2d:8d79c88f:c995d052:cef0aa03
Update Time : Fri Jul 19 11:34:47 2013
Checksum : 385188a9 - correct
Events : 6455
Device Role : Active device 0
Array State : AA ('A' == active, '.' == missing)
/dev/sdc:
MBR Magic : aa55
Partition[0] : 3907026944 sectors at 2048 (type fd)
检查fdisk -l
,以前的sdc
和sdd
磁盘s,现在是和根据其余驱动器的大小sdb
(sde
识别m 个磁盘)。看来“它”还在寻找/寻找?sdc1
sdd1
根据评论部分中的建议,我添加了更多详细信息。
按照德罗伯特的评论中的建议,ARRAY 停止并成功重新组装:
# stop it!
mdadm --stop /dev/md0
mdadm: stopped /dev/md0
# re-assemble -- looks good!
mdadm --assemble -v --scan
mdadm: looking for devices for /dev/md/0
mdadm: no RAID superblock on /dev/sdf1
mdadm: no RAID superblock on /dev/sdf
mdadm: no RAID superblock on /dev/sde
mdadm: no RAID superblock on /dev/sdd1
mdadm: no RAID superblock on /dev/sdd
mdadm: no RAID superblock on /dev/sdc
mdadm: no RAID superblock on /dev/sdb
mdadm: no RAID superblock on /dev/sda6
mdadm: no RAID superblock on /dev/sda5
mdadm: no RAID superblock on /dev/sda4
mdadm: no RAID superblock on /dev/sda3
mdadm: no RAID superblock on /dev/sda2
mdadm: no RAID superblock on /dev/sda1
mdadm: no RAID superblock on /dev/sda
mdadm: /dev/sde1 is identified as a member of /dev/md/0, slot 1.
mdadm: /dev/sdc1 is identified as a member of /dev/md/0, slot 0.
mdadm: added /dev/sde1 to /dev/md/0 as 1
mdadm: added /dev/sdc1 to /dev/md/0 as 0
mdadm: /dev/md/0 has been started with 2 drives.
# double-check
mdadm --detail --scan
ARRAY /dev/md/0 metadata=1.2 name=Resilience:0 UUID=73bf29ca:89bff887:79a26531:b9733d7a
新问题,如何在不丢失数据的情况下解决这个问题?根据评论中的讨论和建议,它与启动过程有关吗? 也许有问题的挂载点的权限?
mdadm
未注册为启动服务。添加它并重新启动,但并没有解决问题。关于dmesg
失败的地方还有一些可能很有趣的细节:
[ 25.356947] md: raid6 personality registered for level 6
[ 25.356952] md: raid5 personality registered for level 5
[ 25.356955] md: raid4 personality registered for level 4
[ 25.383630] md: raid1 personality registered for level 1
[ 25.677100] md: raid0 personality registered for level 0
[ 26.134282] md: raid10 personality registered for level 10
[ 26.257855] md: linear personality registered for level -1
[ 26.382152] md: multipath personality registered for level -4
[ 41.986222] md: bind<sde1>
[ 44.274346] XFS (md0): SB buffer read failed
[ 55.028598] ata7: sas eh calling libata cmd error handler
[ 55.028615] ata7.00: cmd ef/05:fe:00:00:00/00:00:00:00:00/40 tag 0
[ 55.046186] ata7: sas eh calling libata cmd error handler
[ 55.046209] ata7.00: cmd ef/c2:00:00:00:00/00:00:00:00:00/40 tag 0
[ 55.278378] ata8: sas eh calling libata cmd error handler
[ 55.278406] ata8.00: cmd ef/05:fe:00:00:00/00:00:00:00:00/40 tag 0
[ 55.349235] ata8: sas eh calling libata cmd error handler
[ 55.349290] ata8.00: cmd ef/c2:00:00:00:00/00:00:00:00:00/40 tag 0
[ 105.854112] XFS (md0): SB buffer read failed
进一步检查有问题的 XFS 分区sde1
xfs_check /dev/sde1
xfs_check: /dev/sde1 is not a valid XFS filesystem (unexpected SB magic number 0x00000000)
xfs_check: WARNING - filesystem uses v1 dirs,limited functionality provided.
xfs_check: read failed: Invalid argument
cache_node_purge: refcount was 1, not zero (node=0x22a64a0)
xfs_check: cannot read root inode (22)
bad superblock magic number 0, giving up
事实证明,有问题的 XFS 分区不健康。
XFS 文件系统虽然并非不可能,但很可能不是问题的根源。根据 Gilles 的评论,属于 RAID 阵列一部分的分区,不是 XFS 文件系统!文件系统从一个偏移量开始,首先有一个 RAID 标头。
问题)
在一开始的时候
是否可以将 RAID 1 阵列“锁定”为仅适用于独立于磁盘设备名称的特定磁盘/分区?
例如,使用阵列的 UUID 是否足以
/etc/fstab
避免磁盘设备名称的更改?
重新查找问题后
- 在 Funtoo 启动过程的哪个阶段尝试组装 RAID 阵列?具体如何?哪里可以修改/调整?
答案1
好的——我不太确定你的盒子出了什么问题,但是快速总结一下这是怎么回事怎么样?应该工作,帮助排除故障。
当您创建具有持久超级块的阵列(相当合理的默认值以及您完成的方式)时,mdadm 会在每个磁盘上存储各种元数据。该元数据中包含数组 UUID、数组名称和槽号。每个磁盘存储相同的 UUID 和名称。每个磁盘的插槽号都不同。 (如果您想查看元数据,请使用mdadm -E
)
在启动时可以通过三种不同的方式组装阵列:
- 内核可以做到。这就是 0xFD 自动检测分区类型的作用。这种方法令人泄气。
- 您的发行版的脚本可以将其作为 的一部分
udev
,使用增量组装,在设备mdadm
出现时将其传递给它们。这是最新的方法。当它正常工作时,它可以处理各种异步探测设备,例如 USB,而不会出现任何问题。 - 您的发行版的脚本
mdadm --assemble --scan
将在所有设备被认为已被识别后调用。例如,USB 需要 Kluges(基本上是睡眠以确保设备节点已创建)。在此模式下,mdadm
检查(默认情况下)/proc/partitions
以查找系统上的所有块设备,并扫描每个块设备以查找超级块。
发行版脚本可以在 initramfs 或更高版本中执行此操作。或者,有时,某些阵列是从 initramfs(获取根文件系统所需的阵列)完成的,而其他阵列则在启动后完成。
无论如何完成,mdadm 都会通过查看 UUID、名称和插槽号来匹配设备。它需要为您的两磁盘阵列找到 #0 和 #1。它实际上并不关心它是哪个设备(默认情况下,您可以在 mdadm.conf 中将其配置为关心)
答案2
是否可以将 RAID 1 阵列“锁定”为仅适用于独立于磁盘设备名称的特定磁盘/分区?
您应该能够使用下面的别名/dev/disk/by-*
来完成此操作。我建议/dev/disk/by-id/*
,因为这些将直接映射到物理磁盘上应该容易看到的信息,但任何一个目录都应该包含在您的场景中有用的符号链接。使用哪一个很大程度上取决于品味。
例如,在我的系统上,/dev/disk/by-id/scsi-SATA_ST31000340NS_9QJ26FT9-part1 映射到 /dev/sdb1。那就是公共汽车,模型,连续剧和分割导致相关分区的编号。如果阵列中的驱动器发生故障,您可以使用mdadm
问题中的命令之类的命令来明确确定哪个物理驱动器是罪魁祸首。
例如,在 /etc/fstab 中使用阵列的 UUID 是否足以避免磁盘设备名称的更改?
我不太熟悉 MD RAID,但这不会只影响对整个阵列的引用吗?如果您担心 /dev/md0 突然显示为 /dev/md1,也许还有其他方法可以提供对数组本身的固定引用?