Baa*_*arn 4 boot software-raid gentoo mdadm grub2
我在我的 HomeServer 上使用 Gentoo。我的硬盘是使用 mdadm 镜像的 raid1。
我的问题是如何正确引导 /boot 分区?
/dev/md1 consists of /dev/sdc2 & /dev/sdd2 mounted on /boot
Run Code Online (Sandbox Code Playgroud)
在我grub.cfg
的 uuid 中,/dev/md1
但在启动时阵列当然还没有准备好。
最简单的方法是取消突袭 /boot 分区,但这不是我想要做的。
那么,我如何找出raid成员的UUID?ls -l /dev/disk/by-uuid
只显示 .uuid 的/dev/md1
. 当我解开磁盘时,我无法挂载它们以获取它们的 UUIDmount: unknown filesystem type 'linux_raid_member'
那么我怎样才能让 Grub2 引导这些磁盘,它是否能够在它们进入突袭之前确定内容?(它们实际上是 ext2)。
我应该补充一点,我使用 gpt 分区表,因此我/dev/sdc1 and /dev/sdd1
在两个驱动器上都有一个小分区来托管 bios_grub 分区。那些不是被突袭的自动取款机。
正如吉尔斯回答下面的评论中指出的那样,我的问题仍然存在。Grub 找不到设备,告诉我
error: no such device: 9f81a-(device uuid)-5580.
entering rescue mode...
grub rescue>
Run Code Online (Sandbox Code Playgroud)
后来我加了几行
insmod part_msdos
insmod part_gpt
insmod raid
insmod mdraid
Run Code Online (Sandbox Code Playgroud)
到我的 grub.cfg,就在定义 root 的行上方,root='(md0)'
我仍然遇到相同的错误。
我做了更多的研究,我真的猜它是一个与 uuids 相关的错误:
# grub-probe -d --target=fs_uuid /dev/md1
9f81a35d-0813-481f-9ae0-e4fba57c5580
# blkid
/dev/sdc2: UUID="11adb545-0e80-61d1-61f6-565f18e8c3f0" UUID_SUB="88826c5e-d12b-307d-6e54-556d1ebb2458" LABEL="livecd:1" TYPE="linux_raid_member"
/dev/sdd2: UUID="11adb545-0e80-61d1-61f6-565f18e8c3f0" UUID_SUB="15150fb2-5066-edba-d39b-08b63219453c" LABEL="livecd:1" TYPE="linux_raid_member"
/dev/md1: UUID="9f81a35d-0813-481f-9ae0-e4fba57c5580" TYPE="ext2"
(I cut away the other drives here)
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,两个分区都具有相同的 UUID,因此我在 grub.cfg 中编辑了驱动器的 UUID 并grub-install /dev/sdx
再次执行,但我仍然收到“旧”/dev/md1 UUID 的错误。
在Gentoo的维基有资料讨论这蛴螬1和GRUB 2。注意,这种情况在蛴螬1和GRUB 2完全不同:蛴螬1不知道RAID什么,但通过阅读从RAID-1设备可以读取假其中一个磁盘(这需要 0.9 或 1.0 mdraid 超级块格式,而不是 1.1 或 1.2);Grub 2 本身支持 Linux mdraid 卷。
Grub 2 分三个阶段工作(有关更多详细信息,请参见此处):
install-grub
in生成的核心图像,/boot/grub/core.img
能够显示救援提示和加载模块,但没有其他内容。normal
模块)显示由 /boot/grub/grub.cfg
.运行grub-install /dev/sda
以生成核心映像并填充/boot/grub
模块文件。grub-install
还会在指定的设备上安装引导扇区。运行两者grub-install /dev/sdc
,grub-install /dev/sdd
如果您想在两个驱动器上都有一个引导扇区。
如果grub-install
没有正确检测到您的驱动器,请创建以下脚本/usr/local/sbin/grub-probe-verbose
并运行grub-install --grub-probe=/usr/local/sbin/grub-probe-verbose
以查看发生了什么。
#!/bin/sh
exec /usr/sbin/grub-probe "$@" | tee /dev/stderr
Run Code Online (Sandbox Code Playgroud)
从你的成绩单来看bash -x /sbin/grub-install /dev/sdc
,它似乎grub-probe
没有被检测/dev/md1
为 RAID 阵列(/sbin/grub-probe --device-map=/boot/grub/device.map --target=partmap --device /dev/md1
并且/sbin/grub-probe --device-map=/boot/grub/device.map --target=abstraction --device /dev/md1
什么都不返回)。如果问题仅在grub-probe
引导代码中而不是在引导代码中,请尝试覆盖其决定:
grub-install --modules='biosdisk ext2 msdos raid mdraid' /dev/sdc
Run Code Online (Sandbox Code Playgroud)
对 mdraid 1.x 超级块的支持仍然是最近的;它不在 Grub 1.98 中,您至少需要日期为 2010-07-20 的 Bazaar 修订版 2550(该代码几个月前在一个分支上)。Debian 挤压和 Ubuntu 10.10 附带 1.x 超级块支持;我希望 Gentoo 现在有 1.99。
运行grub-mkconfig -o /boot/grub/grub.cfg.grub-mkconfig
以生成暂定的 Grub 配置文件。查看它,如果看起来正确,请将其重命名为/boot/grub/grub.cfg
.
您可能需要调整/boot/grub/device.map
以获得grub-mkconfig
正确的输出。如果此文件grub-mkdevicemap
不存在,它将自动生成,但使用多个磁盘的设置往往会混淆它。我希望它包含类似的东西
(md0) /dev/md1
(hd0) /dev/sdc
(hd1) /dev/sdd
Run Code Online (Sandbox Code Playgroud)
其中md0
是 Grub 卷名,/dev/md1
是 Linux 下的名称。Grub 需要访问/boot/grub
两件事:
(hd0)
是 BIOS 从中读取引导扇区的磁盘(它是包含引导扇区的磁盘),(hd1)
还是其他一些磁盘(您并不总是可以选择)。如果(hd0)
磁盘(或具有 RAID-1 阵列的磁盘)包含/boot/grub
.grub.cfg
从文件系统位置加载模块和Linux 内核,该位置grub-install
通常由确定,/grub
或者/boot/grub
从可以是 RAID 阵列或 Grub 支持的任何其他卷类型的设备加载。如果更改device.map
,则需要grub-install
再次运行。grub-mkconfig
如果您不依赖search
命令执行所有操作,则可能需要再次运行。
归档时间: |
|
查看次数: |
13782 次 |
最近记录: |