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
.我缺少哪一块拼图?
我遇到了以下问题。有两个md
设备具有 RAID1(md0
和md1
),一个设备具有 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
sda1
和sdb1
都是“BIOS 引导分区”
GRUB2 对我提供的内容感到满意,并将、、和/boot/grub/devicemap
添加到要在 GRUB2 中预加载的模块中。part_gpt
raid
mdraid09
ext2
由于我的根卷仍在救援环境中,因此我只需安装所有内容,然后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
on md0
(使用元数据 0.9)以及name
onmd1
和md2
.我还验证了它可以使用mdadm --detail ...
.除此之外,我调整了/etc/default/grub
,跑步update-grub
,也grub-install --no-floppy /dev/sda
和grub-install --no-floppy /dev/sdb
。
然而,此后,在启动时,我总是会进入initramfs
救援外壳,因为无法安装根文件系统。经过检查,原因/proc/mdstat
似乎是相应的md
设备甚至没有组装和运行。更不用说其他两个(元数据版本 1.2)驱动器接收的设备号在 125..127 范围内。
笔记:GRUB2 从引导盘出现。所以至少它已经正确嵌入了。问题在于从初始根rootfs
文件系统到正确根文件系统的转换。
答案1
基本启动过程
蛴螬
- Grub 从 MBR 读取其磁盘、md、文件系统等代码。
- Grub 找到它的 /boot 分区,并从中读取其自身的其余部分。包括配置以及配置指定需要加载的任何模块。
- 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
纳米
我之所以使用它,
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
并重新启动。