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


8

md在Ubuntu中启动时如何组装设备?是/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。我想念什么拼图?


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

引导驱动器已分区。上面有一个胶水“ 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

从那里,我重置super-minoron md0(带有元数据0.9)以及nameon md1md2。我还验证了可以使用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
/dev/mdX出于这个原因,请勿使用。使用/dev/md/NAME代替。那将永远不会改变。
Patrick

@帕特里克:我不明白你要说的。问题不是名字本身。那或多或少是装饰性的。问题根卷无法组装,因此无法启动,因此无法启动。我正在使用UUID来告诉GRUB2哪个设备,并且正在使用UUID /etc/fstab。设置不依赖于名称,我仍然希望它们是这种方式;)
0xC0000022L

我应该澄清一下。仅建议将其作为您评论的一种解决方案Not to mention that the other two (meta-data version 1.2) drives receive a device number somewhere in the 125..127 range。我对ubuntu如何组装RAID卷来回答更大的问题还不了解。
帕特里克

Answers:


17

基本启动过程

rub

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

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

核心

然后,内核进行控制,并执行许多基本的硬件初始化。这个阶段相当快。接下来,内核将initramfs解压缩为tmpfs,并/init在该tmpfs上查找a 。然后执行(正常情况下,内核此时已满运行)/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目前正在使用新贵。

怎么了

我不完全确定发生了什么问题(我承认,部分原因是因为我比Debian更熟悉Debian在Ubuntu上的工作方式,尽管其相似之处),但是我有两个建议:

  • initramfs有其自己的副本mdadm.conf。您可能只需要运行update-initramfs -u即可修复它。
  • 查看启动消息。可能有错误。摆脱“安静”和“飞溅”,并在内核行中添加“详细”以实际查看它们。
  • 根据使用的存储,您可能需要设置rootdelay参数。
  • 当您转储到shell提示符时,没有很多命令,但是确实有mdadm。尝试找出问题所在。如果您解决了该问题,则可以继续启动。

2
你的第一个建议是正确的。当我编写自己的答案时,您的答案就出现了。感谢您抽出宝贵的时间回答。非常感激。我认为您的问题提供了更多的见解。+1加接受。
0xC0000022L13年

2

好吧,我发现我只想念一件。initrd修改后,图片尚未更新mdadm.conf

那我该怎么办?

我启动了Ubuntu Server安装CD的救援系统。选择从安装程序环境中执行外壳程序,而不要使用根文件系统。然后(以开头的注释#):

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

纳米

nano之所以使用,vim是因为因为笨拙的终端而使我头痛。您可以使用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并重新启动。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.