新的 RAID 阵列不会自动组装,导致启动问题

bar*_*boy 8 raid mdadm

我刚刚问过这个问题,安装新的 RAID1 阵列后我无法启动。我能够到达终端,但是一旦我解决了这个问题,我意识到我的问题与其说是 fstab 引导问题,不如说是 mdadm 自动组装问题。

我的系统上有三个 RAID1 阵列,分别/dev/md1安装在 at//dev/md0安装为swap,这些目前运行没有问题。我没有创建这些数组。我创建了一个新的 RAID1 阵列,/dev/md2我使用本指南将其格式化为 ext4 ,在这样做的过程中,我创建了一个新分区(唯一的)md2p1(该指南还创建了一个类似命名的分区,尽管 fdisk 从未明确要求名称)。

创建这个新阵列后,我可以使用手动挂载

mount -t ext4 /dev/md2p1 /srv/Waveforms
Run Code Online (Sandbox Code Playgroud)

这工作得很好。我能够访问该目录并向其中添加了大约 700 GB 的数据。这样做后,我得到

cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md2 : active raid1 sdc1[0] sdd1[1]
      1953423552 blocks [2/2] [UU]

md1 : active raid1 sda2[0] sdb2[1]
      961136576 blocks [2/2] [UU]

md0 : active raid1 sda1[0] sdb1[1]
      15624128 blocks [2/2] [UU]

unused devices: <none>
Run Code Online (Sandbox Code Playgroud)

,所以计算机清楚地识别阵列。然后我用

sudo mdadm --detail --scan >> /etc/mdadm/mdadm.conf 
Run Code Online (Sandbox Code Playgroud)

并且该文件现在包含

# mdadm.conf
#
# Please refer to mdadm.conf(5) for information about this file.
#

# by default, scan all partitions (/proc/partitions) for MD superblocks.
# alternatively, specify devices to scan, using wildcards if desired.
DEVICE partitions

# auto-create devices with Debian standard permissions
CREATE owner=root group=disk mode=0660 auto=yes

# automatically tag new arrays as belonging to the local system
HOMEHOST <system>

# instruct the monitoring daemon where to send mail alerts
MAILADDR root

# definitions of existing MD arrays
ARRAY /dev/md0 level=raid1 num-devices=2 UUID=afa7ccee:df4dfa79:a84dbc05:35401226
ARRAY /dev/md1 level=raid1 num-devices=2 UUID=a0c526cc:6de93504:c8b94301:85474c49
ARRAY /dev/md2 level=raid1 num-devices=2 UUID=1ac720e1:192b2c38:f6e0357b:f3e0074f

# This file was auto-generated on Thu, 10 Mar 2011 00:57:55 -0700
# by mkconf $Id$
ARRAY /dev/md0 level=raid1 num-devices=2 metadata=0.90 UUID=afa7ccee:df4dfa79:a84dbc05:35401226
ARRAY /dev/md1 level=raid1 num-devices=2 metadata=0.90 UUID=a0c526cc:6de93504:c8b94301:85474c49
ARRAY /dev/md2 level=raid1 num-devices=2 metadata=0.90 UUID=1ac720e1:192b2c38:f6e0357b:f3e0074f
Run Code Online (Sandbox Code Playgroud)

这里要注意两点。原始文件有metadata=00.90,但我修改了它,metadata=0.90因为这解决了元数据无法识别的小问题(快速谷歌搜索将解释这一点)。

要注意的第二个想法是 auto 设置为 yes,这意味着系统应该在启动时自动组装所有阵列。情况一定是这样,因为我能够启动这一事实一定意味着 /dev/md1 已经组装好了。

不管怎样,现在麻烦了。重新启动后,我的机器挂起并告诉我

fsck from util-linux-ng 2.17.2
/dev/md1: clean, 3680768/60071936 files, 208210802/240284144 blocks
Run Code Online (Sandbox Code Playgroud)

我的 fstab 当前读取

# /etc/fstab: static file system information.
#
# Use 'blkid -o value -s UUID' to print the universally unique identifier
# for a device; this may be used with UUID= as a more robust way to name
# devices that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    nodev,noexec,nosuid 0       0
# / was on /dev/md1 during installation
UUID=1d3cb392-f522-485b-8516-a7791fc23c4d /               ext4    errors=remount-ro 0       1
# swap was on /dev/md0 during installation
UUID=6eb8e6f2-3166-4f77-883c-26268d636b0b none            swap    sw              0       0
/dev/md2p1 /srv/Waveforms            ext4    defaults,noauto              0       0
Run Code Online (Sandbox Code Playgroud)

blkid
/dev/sda1: UUID="afa7ccee-df4d-fa79-a84d-bc0535401226" TYPE="linux_raid_member" 
/dev/sda2: UUID="a0c526cc-6de9-3504-c8b9-430185474c49" TYPE="linux_raid_member" 
/dev/sdb1: UUID="afa7ccee-df4d-fa79-a84d-bc0535401226" TYPE="linux_raid_member" 
/dev/sdb2: UUID="a0c526cc-6de9-3504-c8b9-430185474c49" TYPE="linux_raid_member" 
/dev/sdc1: UUID="1ac720e1-192b-2c38-f6e0-357bf3e0074f" TYPE="linux_raid_member" 
/dev/sdd1: UUID="1ac720e1-192b-2c38-f6e0-357bf3e0074f" TYPE="linux_raid_member" 
/dev/md0: UUID="6eb8e6f2-3166-4f77-883c-26268d636b0b" TYPE="swap" 
/dev/md1: UUID="1d3cb392-f522-485b-8516-a7791fc23c4d" TYPE="ext4" 
/dev/md2p1: UUID="867ee91e-527e-435b-b6bc-2f6d89d2d8c6" TYPE="ext4" 
Run Code Online (Sandbox Code Playgroud)

我以前曾用UUID=867ee91e-527e-435b-b6bc-2f6d89d2d8c6代替/dev/md2p1,但这没有给我任何结果。我也尝试过使用此 md2p1 作为默认值的选项,defaults+noatime,errors=remount-ro,但都没有奏效。

我可以通过修改 fstab 来排除我的新 md2p1 行来启动。使用此配置启动后,我得到

cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md0 : active raid1 sda1[0] sdb1[1]
      15624128 blocks [2/2] [UU]

md1 : active raid1 sda2[0] sdb2[1]
      961136576 blocks [2/2] [UU]
Run Code Online (Sandbox Code Playgroud)

所以系统还没有组装md2。然后我可以运行

sudo mdadm --assemble --scan
[sudo] password for zach: 
mdadm: /dev/md2 has been started with 2 drives.
Run Code Online (Sandbox Code Playgroud)

何处

cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md2 : active raid1 sdc1[0] sdd1[1]
      1953423552 blocks [2/2] [UU]

md0 : active raid1 sda1[0] sdb1[1]
      15624128 blocks [2/2] [UU]

md1 : active raid1 sda2[0] sdb2[1]
      961136576 blocks [2/2] [UU]
Run Code Online (Sandbox Code Playgroud)

我现在可以像上面那样手动挂载。所以问题似乎是 RAID1 阵列没有在启动时组装,因此 fstab 无法识别,因此除了在恢复模式下我根本无法启动。

我找到了这篇文章,但我认为它不适用于我,因为答案似乎是将 auto 设置为 yes,然后在启动时自动组装阵列。我的配置已经设置为这样做,所以我不知所措。

那个帖子中有一个似乎适用的答案,但我不明白他的解决方案是什么。这是 Deplicator 的帖子,上面写着

重新启动后,我再也看不到 /dev/md0。再次运行 mdadm --detail --scan (不将结果放入文件中)我会看到

ARRAY /dev/md/ubuntu:0 metadata=1.2 name=ubuntu:0 UUID=a8a570c6:96f61865:05abe131:5c2e2f7e
Run Code Online (Sandbox Code Playgroud)

手动挂载 /dev/md/ubuntu:0 就可以了。最后,这也是我放入 fstab 文件的内容。

fstab 里放了什么?问题似乎是我没有在启动时组装 md2,因此每次 fstab 尝试挂载 md2p1 分区时我都会挂起。这实际上可能与 md2 被分区有关,而其他人则没有,但我不明白为什么会这样。

编辑:以防万一

uname -a
Linux ccldas2 2.6.32-74-server #142-Ubuntu SMP Tue Apr 28 10:12:19 UTC 2015 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

roa*_*ima 11

两个问题浮现在脑海

  1. 您在mdadm.conf. 替换(或注释掉)ARRAY后面三行的块,# definitions of existing MD arrays以便每个数组仅由您最近的扫描声明。

  2. 无法在启动时构建 RAID 阵列的典型情况是,它们未initramfs在启动时更新或未设置为在启动时运行。快速浏览您引用的指南似乎没有提到这些步骤,但我可能是错的。在 Debian 系统上,命令是:

     dpkg-reconfigure mdadm    # Choose "all" disks to start at boot
     update-initramfs -u       # Updates the existing initramfs
    
    Run Code Online (Sandbox Code Playgroud)

  • roaima,我永远欠你的债。我现在可以去睡觉了。我将向我的孩子们歌唱你的智慧。对于接下来的那些人,在我这样做之前,我还更新了 mdadm,这可能有也可能没有影响。我建议先尝试这个,如果它不起作用,然后更新 mdadm,只是因为更新 mdadm 还需要更新一百个其他东西,这会产生更多的问题。不过,说真的。谢谢。你不仅解决了这个问题,还解决了另一个问题。 (3认同)