问题描述
如何在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
设备(md0
和md1
),一个具有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
-
sda1
和sdb1
分别是“ BIOS引导分区”
GRUB2对我给它的/boot/grub/devicemap
感到满意,并向模块中添加了part_gpt
,raid
,mdraid09
和ext2
以便预加载到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
重置,并将md1
和md2
上的name
重置。我还验证了它可以使用mdadm --detail ...
来工作。除了我调整了/etc/default/grub
之外,还运行update-grub
以及grub-install --no-floppy /dev/sda
和grub-install --no-floppy /dev/sdb
。
在那之后,引导时,我总是掉入initramfs
救援 shell ,但是,因为无法挂载根文件系统。检查/proc/mdstat
后,原因似乎是各个md
设备甚至都没有组装和运行。更不用说其他两个(meta-data 1.2版)驱动器在125..127范围内的某个位置接收到设备号。
注意:GRUB2从引导盘启动。因此,至少它已正确嵌入。问题是从最初的rootfs
过渡到正确的根文件系统。
最佳思路
基本启动过程
Grub
-
Grub从MBR读取其磁盘,md,文件系统等代码。
-
Grub找到它的/boot分区,并从中读取其余部分。包括配置和配置指定的任何模块都需要加载。
-
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。尝试找出问题所在。如果您解决了该问题,则引导可以继续。