当前位置: 首页>>技术教程>>正文


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

, , , ,

问题描述

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

我的mdadm.conf正常,我在应急CD环境中检查了一下。运行mdadm -A --scan时,它将根据需要查找并分配设备名称。 mdadm.conf包含AUTO -all以从组装数组中取出所有自动机。

我需要做的是能够在启动时按照mdadm.conf中的说明auto-assemble md设备,或者在组装时能够兑现0.9数组的super-minor值和1.2数组的name(显然是<hostname>:<super-minor>),并做正确的事情没有mdadm.conf。我想念什么拼图?


我有以下问题。有两个具有RAID1的md设备(md0md1),一个具有RAID6的设备(md2)。我通过所需的设备名称来指代它们。 md0的meta-data版本为0.9,其他两个版本为1.2。 md0映射到/,另外两个与引导无关。

引导驱动器已进行GPT分区。上面有一个胶水“ BIOS引导分区”(sda1)。 grub-install --no-floppy /dev/sda报告成功。

  • md0 == sda3 + sdb3

  • md1 == sda2 + sdb2

  • md2 == sdc + sdd + sde + sdf + sdg + sdh

  • sda1sdb1分别是“ BIOS引导分区”

GRUB2对我给它的/boot/grub/devicemap感到满意,并向模块中添加了part_gptraidmdraid09ext2以便预加载到GRUB2中。

由于我的根卷仍在救援环境中,因此我只需安装所有内容,然后将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

从那里我将md0(使用meta-data 0.9)上的super-minor重置,并将md1md2上的name重置。我还验证了它可以使用mdadm --detail ...来工作。除了我调整了/etc/default/grub之外,还运行update-grub以及grub-install --no-floppy /dev/sdagrub-install --no-floppy /dev/sdb

在那之后,引导时,我总是掉入initramfs救援 shell ,但是,因为无法挂载根文件系统。检查/proc/mdstat后,原因似乎是各个md设备甚至都没有组装和运行。更不用说其他两个(meta-data 1.2版)驱动器在125..127范围内的某个位置接收到设备号。

注意:GRUB2从引导盘启动。因此,至少它已正确嵌入。问题是从最初的rootfs过渡到正确的根文件系统。

最佳思路

基本启动过程

Grub

  1. Grub从MBR读取其磁盘,md,文件系统等代码。

  2. Grub找到它的/boot分区,并从中读取其余部分。包括配置和配置指定的任何模块都需要加载。

  3. Grub遵循配置中的指令,该指令通常告诉它将内核和initramfs加载到内存中并执行内核。

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

Kernel

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

Initramfs

您可以通过执行mkdir /tmp/foo; cd /tmp/foo; zcat /boot/initrd.img-3.8-trunk-amd64 | cpio -idmv之类的操作来手动提取initramfs。

initramfs负责加载所有驱动程序,启动udev和查找根文件系统。这是您失败的步骤-找不到根文件系统,因此无法正常运行。

initramfs完成后,它将安装根文件系统,并将控制权移交给/sbin /init。

系统启动

至此,您的init接管了—我认为Ubuntu目前正在使用新贵。

怎么了

我不完全确定发生了什么问题(我承认,部分原因是因为与Ubuntu相比,我更了解它在Debian上的工作原理,尽管类似),但是我有几点建议:

  • initramfs具有自己的mdadm.conf副本。您可能只需要运行update-initramfs -u即可对其进行修复。

  • 查看启动消息。可能有错误。摆脱掉’quiet’和’splash’,或者将’verbose’添加到您的内核行以实际查看它们。

  • 根据使用的存储,您可能需要设置rootdelay参数。

  • 当您转储到shell提示符时,您没有很多命令,但确实有mdadm。尝试找出问题所在。如果您解决了该问题,则引导可以继续。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/11638.html,未经允许,请勿转载。