我在我的 HomeServer 上使用 Gentoo。我的 HDD 是通过 mdadm 镜像的 raid1。
我的问题是如何正确引导/boot分区?
/dev/md1 consists of /dev/sdc2 & /dev/sdd2 mounted on /boot
在我的系统中,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引导这些磁盘,它能够在它们进入raid之前确定内容吗? (它们实际上是 ext2)。
我也许应该补充一点,我使用 gpt 分区表,因此我/dev/sdc1 and /dev/sdd1
在两个驱动器上都有一个小分区来托管 bios_grub 分区。那些不是突袭的自动取款机。
正如吉尔斯的回答下面的评论所指出的,我的问题仍然存在。 Grub 找不到该设备,告诉我
error: no such device: 9f81a-(device uuid)-5580.
entering rescue mode...
grub rescue>
之后我添加了几行
insmod part_msdos
insmod part_gpt
insmod raid
insmod mdraid
到我的 grub.cfg,就在定义 root 的行上方,root='(md0)'
我仍然遇到相同的错误。
我做了一些更多的研究,我真的猜想这是一个与 uuid 相关的错误:
# 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)
正如您所看到的,两个分区具有相同的 UUID,因此我在 grub.cfg 中编辑了驱动器的 UUID 并grub-install /dev/sdx
再次执行了操作,但我仍然收到“旧”/dev/md1 UUID 的错误。
答案1
这Gentoo 维基有讨论 Grub 1 和 Grub 2 的信息。请注意,Grub 1 和 Grub 2 中的情况完全不同:Grub 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
从您的记录来看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
对 mdraid 1.x 超级块的支持仍然是最近才出现的;它不在 Grub 1.98 中,你至少需要集市修订 2550 日期 2010-07-20(该代码位于分支几个月前)。 Debian squeeze 和 Ubuntu 10.10 附带 1.x 超级块支持;我预计 Gentoo 现在已经是 1.99 了。
生成 grub.cfg
运行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
其中md0
是 Grub 卷名,/dev/md1
是 Linux 下的名称。 Grub 需要访问/boot/grub
两件事:
- Grub 的引导扇区在 BIOS 支持的磁盘上的固定位置读取核心映像(它没有太多选择)。对于 PC BIOS,
(hd0)
是 BIOS 从中读取引导扇区的磁盘(它是包含引导扇区的磁盘),并且(hd1)
是其他磁盘(您并不总是可以选择)。如果(hd0)
磁盘(或带有 RAID-1 阵列的磁盘)包含/boot/grub
. - 核心映像从由 确定的文件系统位置(通常是RAID 阵列或 Grub 支持的任何其他卷类型)加载模块
grub.cfg
和 Linux 内核。grub-install
/grub
/boot/grub
如果改变device.map
,则需要grub-install
重新运行。grub-mkconfig
如果您不依赖该命令来完成所有操作,则可能需要再次运行search
。
答案2
要回答有关 UUID 的问题:使用blkid
答案3
直播~#mdadm --create /dev/md1 --level=1 --raid-devices=2 --metadata=0.90 /dev/sdc2 /dev/sdd2
直播~#幼虫
幼虫>根 (hd0,1)
Filesystem type is ext2fs, partition type 0xfd
幼虫>设置(hd0)
Checking if "/boot/grub/stage1" exists... yes
Checking if "/boot/grub/stage2" exists... yes Checking if
"/boot/grub/e2fs_stage1_5" exists... yes Running "embed
/boot/grub/e2fs_stage1_5 (hd0)"... 16 sectors are embedded. succeeded
Running "install /boot/grub/stage1 (hd0) (hd0)1+16 p
(hd0,0)/boot/grub/stage2 /boot/ grub/menu.lst"... succeeded Done.