基本启动过程

基本启动过程

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

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

我需要做的是能够md在启动时自动组装设备mdadm.conf,或者在组装时尊重super-minor0.9 数组的值和name(显然<hostname>:<super-minor>)1.2 数组的值,并且在没有mdadm.conf.我缺少哪一块拼图?


我遇到了以下问题。有两个md设备具有 RAID1(md0md1),一个设备具有 RAID6(md2 )。我指的是他们想要的设备名称。md0元数据版本为 0.9,另外两个版本为 1.2。md0映射到/和其他两个与不相关启动

启动驱动器采用 GPT 分区。sda1其上有一个胶水“BIOS Boot Partition”( )。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添加到要在 GRUB2 中预加载的模块中。part_gptraidmdraid09ext2

由于我的根卷仍在救援环境中,因此我只需安装所有内容,然后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-minoron md0(使用元数据 0.9)以及nameonmd1md2.我还验证了它可以使用mdadm --detail ....除此之外,我调整了/etc/default/grub,跑步update-grub,也grub-install --no-floppy /dev/sdagrub-install --no-floppy /dev/sdb

然而,此后,在启动时,我总是会进入initramfs救援外壳,因为无法安装根文件系统。经过检查,原因/proc/mdstat似乎是相应的md设备甚至没有组装和运行。更不用说其他两个(元数据版本 1.2)驱动器接收的设备号在 125..127 范围内。

笔记:GRUB2 从引导盘出现。所以至少它已经正确嵌入了。问题在于从初始根rootfs文件系统到正确根文件系统的转换。

答案1

基本启动过程

蛴螬

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

当 Grub 无法实际读取文件系统时,有一种后备模式 - 要么是因为没有足够的空间来将所有代码嵌入到引导记录中,要么是因为它不知道文件系统或其下的层。在这种情况下,GRUB 嵌入扇区列表,并从中读取代码。这是很多不太稳健,最好避免。它甚至可以像那样执行内核和 initramfs(不确定)。

核心

然后内核接管控制权,并执行许多基本的硬件初始化。这个阶段相当快。接下来,内核将 initramfs 解压到 tmpfs,并/init在该 tmpfs 上查找。然后它就会执行(在正常意义上,内核此时正在完全运行)/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。

什么坏了

我不完全确定哪里出了问题(我承认是部分问题,因为我比 Ubuntu 更熟悉它在 Debian 上的工作原理,尽管它很相似),但我有一些建议:

  • initramfs 有自己的mdadm.conf.您可能只需要运行update-initramfs -u即可修复它。
  • 查看启动消息。可能有错误。去掉“quiet”和“splash”,也许可以在内核行中添加“verbose”以实际看到它们。
  • 根据使用的存储,您可能需要设置 rootdelay 参数。
  • 当您转储到 shell 提示符时,您没有很多命令,但有 mdadm。尝试找出问题所在。如果解决问题,则可以继续启动。

答案2

好吧,我发现我只少了一件。修补后图像initrd尚未更新mdadm.conf

那么我做了什么?

我启动进入 Ubuntu Server 安装 CD 的救援系统。选择从安装程序环境执行 shell 并不是使用根文件系统。然后(前面带有 的注释#):

cat /proc/mdstat
# It showed me md125, md126 and md127
# Stop those:
mdadm -S /dev/md125
mdadm -S /dev/md126
mdadm -S /dev/md127
# Assemble the root volume (meta-data version 0.9)
mdadm -Av --update=super-minor --run /dev/md0 /dev/sda3 /dev/sdb3
# Assemble the other two arrays, updating the names (meta-data version 1.2)
mdadm -Av --update=name --run /dev/md1 /dev/sda2 /dev/sdb2
mdadm -Av --update=name --run /dev/md2 /dev/sdc /dev/sdd /dev/sde /dev/sdf /dev/sdg /dev/sdh
# Check the outcome:
cat /proc/mdstat
# See preferred minor and names:
mdadm --detail /dev/md0
mdadm --detail /dev/md1
mdadm --detail /dev/md2
# All is fine, so proceed ...
# Create directory for the chroot:
mkdir /target
# Mount root volume on it
mount /dev/md0 /target
mount -o bind /dev /target/dev
mount -o bind /proc /target/proc
mount -o bind /sys /target/sys
mount -o bind /dev/pts /target/dev/pts
# Now chroot into it:
chroot /target /bin/bash
# Fix up the GRUB device map to match what 'mdadm --detail' gives as UUID:
nano /boot/grub/devicemap

纳米

我之所以使用它,nanovim因为字面意义上的哑终端让我头疼。您可以使用Ctrl+x退出(会提示保存,Ctrl+k剪切当前行,Ctrl+u粘贴剪切行,Ctrl+o保存缓冲区。

这听起来很复杂,但也可以用bash一行代码来完成(尽管很长):

for i in /dev/disk/by-id/md-uuid-*; do DEV=$(readlink $i); echo "(${DEV##*/}) $i"; done|sort|tee /boot/grub/devicemap

这使用了当前的设备的名称md及其 UUID,并创建一个devicemap供 GRUB2 仔细阅读的文件。因此,假设上述操作正确完成,您应该已经拥有正确的设备名称。

进一步:

# Edit the grub config
nano /etc/default/grub

确保它包含:

GRUB_PRELOAD_MODULES="part_gpt raid mdraid09 ext2"

如果您已将//boot分区配置为元数据版本 1.2,请使用mdraid1x代替mdraid09.

更远:

# Update the initrd images
update-initramfs -c -k all

上面的步骤是缺失的环节。这显然确保了mdadm.conf启动时生效。

# Install GRUB2 on the two drives eligible for booting, just to be sure
grub-install --no-floppy /dev/sda
grub-install --no-floppy /dev/sdb
# Make the latest config take effect
update-grub

之后离开chroot并重新启动。

相关内容