如何在 Debian 8.0.0 启动时自动启动降级软件 RAID1?

如何在 Debian 8.0.0 启动时自动启动降级软件 RAID1?

如果你从阵列中移除一个组件 HDD,它会进入“(initramfs)”下的“忙框”shell,并显示类似于“无法挂载根设备”的内容,因为 RAID1 阵列变为“非活动”状态。

可以使用以下命令启动它:

(initramfs): mdadm --run /dev/md0
(initramfs): exit

之后,它使用启动的 RAID1(文件系统位于 RAID1 阵列上)正常启动,并且将继续正常启动,直到您移除另一个驱动器(在这种情况下它将执行完全相同的操作)。

谷歌发布了一堆关于 UBUNTU 的帖子,使用“BOOT_DEGRADED=true“但这对于 DEBIAN 不起作用。

还有关于使用“md-mod.start_dirty_degraded=1“作为内核映像的启动参数。我尝试将其传递到 GRUB 菜单选项中,但没有成功。

可能会有可以解释的事情,但我还是个新手,不太明白 :(

有任何想法吗?

答案1

initramfs 执行 /scripts/local-top/mdadm 来处理 raid。该脚本中有以下语句

if $MDADM --assemble --scan --run --auto=yes${extra_args:+ $extra_args};
  then
    verbose && log_success_msg "assembled all arrays."
  else
    log_failure_msg "failed to assemble all arrays."
fi

对于随 Debian Jessie 一起提供的 mdadm 版本,--run 参数在与 --scan 结合使用时似乎会被忽略。根据手册页,它应该激活所有阵列,即使它们已降级。但实际上,任何已降级的阵列都标记为“非活动”。如果根文件系统位于其中一个非活动阵列上,则启动过程将停止。

可以修改该脚本,然后使用命令重建 initramfs update-initramfs -u

  1. 将脚本复制到本地覆盖目录
  2. mdadm --run如果第一次尝试失败,则用一些额外的行来修补脚本,以便在每个阵列上单独运行。
  3. 更新 initramfs。

以下命令将执行前面的步骤。在复制到 /etc/initramfs-tools/scripts/local-top/mdadm 文件之前,请确认您还没有该文件。

cd /etc/initramfs-tools/scripts/local-top
cp /usr/share/initramfs-tools/scripts/local-top/mdadm .
patch --verbose --ignore-whitespace <<'EndOfPatch'
--- mdadm
+++ mdadm
@@ -76,7 +76,15 @@
   if $MDADM --assemble --scan --run --auto=yes${extra_args:+ $extra_args}; then
     verbose && log_success_msg "assembled all arrays."
   else
-    log_failure_msg "failed to assemble all arrays."
+    log_warning_msg "failed to assemble all arrays...attempting individual starts"
+    for dev in $(cat /proc/mdstat | grep md | cut -d ' ' -f 1); do
+      log_begin_msg "attempting mdadm --run $dev"
+      if $MDADM --run $dev; then
+        verbose && log_success_msg "started $dev"
+      else
+        log_failure_msg "failed to start $dev"
+      fi
+    done
   fi
   verbose && log_end_msg

EndOfPatch
update-initramfs -u

通过这个更新的 initramfs,当包含根文件系统的 RAID1 缺少驱动器时,可以无需干预进行启动。

相关内容