Ubuntu:md设备如何在启动时组装?

Modified on: Fri, 13 Jul 2018 07:27:00 +0800

如何在Ubuntu启动时组装md设备? /etc/mdadm/mdadm.conf真的是这里的相关因素吗?

我的mdadm.conf是健全的,我在救援CD环境中检查过。运行mdadm -A --scan时,它会根据需要查找并分配设备名称。 mdadm.conf包含AUTO -all,以消除组装数组时的所有自动现象。

我需要做的是能够在启动时自动组装md中的mdadm.conf设备,或者在组装时尊重super-minor值为0.9数组和name(显然是<hostname>:<super-minor>)的1.2数组和没有mdadm.conf做正确的事情。我错过了什么拼图?


我有以下问题。有两个带有RAID1(mdmd0)的md1设备和一个带有RAID6(md2)的设备。我指的是所需的设备名称。 md0的元数据版本为0.9,另外两个版本为1.2。 md0映射到/,其他两个与启动无关。

启动驱动器是GPT分区的。它上面有一个胶水“BIOS Boot Partition”(sda1)。 grub-install --no-floppy /dev/sda报告成功。

  • md0 == sda3 + sdb3
  • md1 == sda2 + sdb2
  • md2 == sdc + sdd + sde + sdf + sdg + sdh
  • sda1sdb1分别是“BIOS Boot Partition”

GRUB2对我给它的/boot/grub/devicemap感到满意,我添加了part_gptraidmdraid09

由于我仍然在救援环境中拥有我的根卷,我只需安装所有内容,然后chroot编辑到其中:

mkdir /target
mount /dev/md0 /target
mount -o bind /dev /target/dev
mount -o bind /dev/pts /target/dev/pts
mount -o bind /sys /target/sys
mount -o bind /proc /target/proc
chroot /target /bin/bash

从那里我重置super-minor上的md0(带有元数据0.9)和name / code>和md1。我还验证了它使用md2
除了我调整mdadm --detail ...之外,运行/etc/default/grub以及update-grubgrub-install --no-floppy /dev/sda

之后,在启动时,我总是被放入grub-install --no-floppy /dev/sdb rescue shell中,因为无法挂载根文件系统。在检查initramfs之后,原因似乎是各个/proc/mdstat设备甚至没有被组装和运行。更不用说其他两个(元数据版本1.2)驱动器在125..127范围内的某处接收设备编号。

注意: GRUB2来自启动盘。所以至少它已被正确嵌入。问题是从最初的md过渡到正确的根文件系统。

最佳答案

基本启动过程

  1. Grub从MBR中读取其磁盘,md,文件系统等代码。
  2. Grub找到它的/ boot分区,并从中读取其余部分。包括配置,以及配置指定的任何模块都需要加载。
  3. Grub遵循配置中的指令,通常告诉它将内核和initramfs加载到内存中,然后执行内核。
  4. 醇>

    有一种回退模式,因为当Grub实际上无法读取文件系统时 - 或者因为没有足够的空间将所有代码嵌入到启动记录中,或者因为它不知道文件系统或层下的文件系统它。在这种情况下,GRUB嵌入一个扇区列表,并从中读取代码。这很多不那么健壮,最好避免。它甚至可以像这样做内核和initramfs(不确定)。

    内核

    然后内核获得控制权,并执行许多基本硬件初始化。这个阶段相当快。接下来,内核将initramfs解包为tmpfs,并在该tmpfs上查找/init。然后执行(在正常意义上,内核正在运行此时运行)/init。顺便说一句,这是一个普通的旧shell脚本。

    initramfs的

    您可以通过执行类似mkdir /tmp/foo; cd /tmp/foo; zcat /boot/initrd.img-3.8-trunk-amd64 | cpio -idmv

    initramfs负责加载所有驱动程序,启动udev,并查找根文件系统。这是你失败的一步 - 它无法找到根文件系统,所以它就会失败。

    一旦initramfs完成,它就会挂载根文件系统,并将控制交给/ sbin / init。

    系统启动

    此时,你的init接管了 - 我认为Ubuntu目前正在使用upstart。

    什么是破碎

    我不完全确定什么是坏的(部分,我承认,因为我对它在Debian上的工作方式比Ubuntu更熟悉,虽然它类似),但我有几个建议:

  • initramfs有自己的mdadm.conf副本。您可能只需要运行update-initramfs -u来修复它。
  • 查看启动消息。可能有错误。摆脱'安静'和'泼溅',并可能在你的内核行添加'verbose'来实际看到它们。
  • 根据使用的存储空间,您可能需要设置rootdelay参数。
  • 当你被转储到shell提示符时,你没有很多命令,但你确实有mdadm。试着弄清楚出了什么问题。如果您解决了问题,可以继续启动。
作者:derobert

相关问答

添加新评论