Pet*_*ter 9 raid ubuntu mdadm grub2 gpt
基本工作系统详细信息:
我使用 Ubuntu 12.04 服务器 CD 安装服务器。
我有 4 个磁盘。在所有磁盘上,我执行了以下操作,类似于此操作方法:
我将引导格式化为 ext3。我在根分区和大分区上设置了 RAID10。我将根目录格式化为 ext4。我在大卷上创建了一个逻辑卷,并将其格式化为 ext4。
生成的系统运行良好,启动正常。
问题详情:
然后我决定记录一个失败的过程。作为第一步,我决定重新安装 grub。
# grub-install /dev/sda
warn: This GPT partition label has no BIOS Boot Partition; embedding won't be possible!.
error: Embedding is not possible. GRUB can only be installed in this setup by using blocklists. However, blocklists are UNRELIABLE and their use is discouraged..
# grub-install /dev/sdb
warn: This GPT partition label has no BIOS Boot Partition; embedding won't be possible!.
error: Embedding is not possible. GRUB can only be installed in this setup by using blocklists. However, blocklists are UNRELIABLE and their use is discouraged..
Run Code Online (Sandbox Code Playgroud)
所以看起来它失败了,但也似乎放弃了并且没有做出改变。所以我重新启动了。引导失败。它只是挂在黑屏上,光标在向下大约 4 行处闪烁。如果我按住“Shift”启动,我会在光标左侧看到“GRUB”这个词,但没有交互提示。
此时,我用boot-repair-disk生成了这个报告:http : //paste.ubuntu.com/966531/
请注意,在上面的报告中,它说引导加载程序没有指向 core.img 的正确扇区。(sda是虚拟cd;sdb是启动盘;sdc是sdb的镜像,但是boot没有镜像,只是一个独立的不相关的分区存在并且格式化为ext3;sdd和sde有启动空间但是没有格式化)
然后我从Ubuntu服务器CD启动,启动救援系统,并发出以下命令,没有错误完成(其中sda是虚拟CD,b,c,d,e是a,b,c的磁盘,d 在之前的 grub 命令中):
# parted /dev/sdb set 2 bios_grub on
# parted /dev/sdc set 2 bios_grub on
# grub-install /dev/sdb
# grub-install /dev/sdc
Run Code Online (Sandbox Code Playgroud)
此时,我使用boot-repair-disk生成了这个报告:http : //paste.ubuntu.com/966561/
注意,在上面的报告中,core.img 的问题已经没有了。它似乎指向正确的部门。
现在,如果我尝试启动,我会收到一个 grub 提示。如果我运行“set”,我会看到找到并设置了 root。如果我运行“ls /”,我会从raid 卷中看到我的根目录,包括vmlinuz 内核文件。如果我输入“ls /vmlinuz”,它会显示“错误:找不到文件”。如果我使用“linux”命令尝试加载内核,它会说同样的错误。如果我使用“ls -l /”,则不会列出 vmlinuz 文件。
过于冗长的细节,如果你想遵循:
我注意到也没有 /boot/grub/grub.cfg,所以我跑了
# grub-mkconfig -o /boot/grub/grub.cfg
Run Code Online (Sandbox Code Playgroud)
但问题依然存在。
如果我使用“gptsync”工具,则此行为没有变化。
引导修复盘不会修复系统,因为它希望我使用启用 EFI 的 bios 引导。我简要地研究了这个,但我不知道它是如何工作的。我在引导选项中找到了 UEFI shell,但我对此一无所知,也看不到如何从那里更改启动(例如,从该 EFI shell 引导 CD)。
我也读过这个页面,但是 Ubuntu 没有附带“grub”命令,所以我不能完全遵循它。我可以简单地安装该命令,但我更想知道 Ubuntu 安装程序如何设法安装它,而不是进行不同的设置。它使用了阻止列表吗?
这是在引导修复磁盘上引导时 parted 的输出(此处 sdb 是第一个硬盘,从磁盘引导时是 sda,第二个粘贴链接中的“引导”更改为“bios_grub”):
Model: ATA Hitachi HUA72303 (scsi)
Disk /dev/sdb: 3001GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
1 17.4kB 2000MB 2000MB linux-swap(v1) swap1
2 2000MB 2256MB 256MB ext3 boot1 boot (this says bios_grub in 2nd link)
3 2256MB 66.3GB 64.0GB root1 raid
4 66.3GB 3001GB 2934GB data1 raid
Run Code Online (Sandbox Code Playgroud)
这是一个不相关的超旧虚拟机用于比较(对于任何不熟悉boot-repair-disk 的人):http : //paste.ubuntu.com/966799/
这是问题系统的最新粘贴,在运行上述 grub-mkconfig 之后,还将“bios_grub”设置回“boot”。 http://paste.ubuntu.com/966808/
比较两者,这看起来很有趣:
sdb2: __________________________________________________________________________
File system:
Boot sector type: Grub2's core.img
Boot sector info:
Mounting failed: mount: unknown filesystem type ''
md/bcserver8:0: ________________________________________________________________
File system: ext4
Boot sector type: -
Boot sector info:
Operating System: Ubuntu 12.04 LTS
Boot files: /boot/grub/grub.cfg /etc/fstab /boot/grub/core.img
Run Code Online (Sandbox Code Playgroud)
看起来raid有启动文件,sdb2没有格式化。(尽管如此,系统在运行 grub-install 之前已启动)。从救援 CD 中,“mount -t ext3 /dev/sdb2 /boot”失败。但这会混淆事情是有道理的,因为 grub 明确使用分区 2(parted 命令中的 2 将 bios_grub 设置为 on)。
所以我做了这样的事情:
# mkfs.ext3 -L boot1 /dev/sdb2
# mv boot boot_on_root
# mkdir boot
# mount /dev/sdb2 boot
# rsync -avHP boot_on_root/ boot/
# parted /dev/sdb set 2 bios_grub on
# parted /dev/sdc set 2 bios_grub on
# grub-install /dev/sdb
# grub-install /dev/sdc
Run Code Online (Sandbox Code Playgroud)
然后重新启动,我又黑屏了,没有提示。 http://paste.ubuntu.com/966848/
所以在这一点上,我的猜测是,当设置 bios_grub 时,grub 没有安装到 MBR,也没有安装到 ext3 上的 ext3 文件系统,而是安装在分区本身上,就好像它是 EFI 一样......这显然会混乱在那里安装 ext3 文件系统。Aand 从我对 EFI 的简短阅读中,听起来 EFI 假设第一个分区是引导,但在我的情况下,第一个分区是交换分区,而且它应该是 FAT 而不是不可安装的东西......所以因为这很少/没有感觉,我仍然完全迷失了,没有任何线索。[编辑:现在我有一个线索......跳过一点更新]
现在,当我在boot-repair-disk 中单击 repair 时,它会询问其他问题。上次错误隐藏在窗口下,我不得不将另一个拖走才能看到它。这次主窗口没了,新窗口说:
GPT detected. You may want to retry after creating a
BIOS-Boot partition (>1Mo, flag). Do you want to continue?
Run Code Online (Sandbox Code Playgroud)
所以我点击是,它说它修复成功,并创建了另一个粘贴:http : //paste.ubuntu.com/966862/
但是我仍然有一个带有闪烁光标的黑屏。
现在我的理论是引导被一个非胖非 EFI 的东西覆盖了,这只是 grub 代码,否则之前会在扇区 0-63 中。幸运的是,我在此页面上遇到了一个非常明确的声明,这可能使我对这一切意味着什么有了完整的理解。然后在我发现之后,Jeremy 发布了一个答案,如果为真,则确认这是缺少的关键概念。 http://blog.psych0tik.net/2011/08/grub-embedding-blocklists-and-bios_grub-partitions/
问题:
到底是怎么回事?为什么 grub 启动失败?为什么显示“找不到文件”?
如果没有我用 parted 设置的这个设置(不是由 Ubuntu 安装程序设置的),为什么 grub 不想安装?我认为我需要安装它是一个单独的 /boot,它不在 LVM 或软件 RAID 中,因为我的根在 RAID 中,分区表是 GPT。
Ubuntu CD 安装程序如何在没有这个问题的情况下安装它,并且没有 bios_grub 设置?
我也会考虑使用 EFI。如果这是一个好主意,并且有一种标准的设置方法,那么我总是乐于学习新事物。
即使没有回答我所有的问题,也能让我高兴的最快答案是一组命令,我可以从救援 CD 运行这些命令,以与安装 CD 相同的方式修复引导加载程序。如果我可以用启动的系统而不是 CD 来运行它们,那也会特别好。
小智 8
解决方案是使用 bios_grub 分区,该分区与 /boot 分区不同。
默认情况下,bios_grub 分区为 1MiB,并且必须标记为 bios_grub。我的是我磁盘上的第一个分区。如果您的分区 2 实际上是 parted 建议的 /boot,那将是不正确的,您应该创建另一个 1MiB 分区。
对于 GPT 和 GRUB2,最小文件系统具有三个分区:bios_grub、root、swap。(不完全确定需要交换)
为什么在简单地运行“grub-install”后grub无法启动?
未知...如果它明确说明它无法嵌入因此无法工作,您会认为它不会修改任何内容。
为什么显示“找不到文件”?
/vmlinuz 是使用引导分区的符号链接,引导分区已损坏。bios_grub 代码是在其 ext3 结构之上编写的。这可能意味着 /boot 没有挂载,那里看到的 grub 文件实际上是在不包含内核的根系统上。
为什么 grub 不想在没有这个设置的情况下安装我用 parted 设置的
与 MBR 不同,GPT 分区表没有用于引导加载程序的空间。所以必须创建一个特定的分区来保存引导代码。在运行“grub-install”之前,使用以下命令指定此分区:
parted /dev/sda set 1 bios_grub on
Run Code Online (Sandbox Code Playgroud)
我以为我需要的只是一个单独的 /boot。Ubuntu CD 安装程序如何在没有 bios_grub 设置的情况下安装它?
这个要求似乎是 Ubuntu 安装程序所需的全部,但它创建了一个很容易被破坏的非标准系统。
当 GRUB 说“这个 GPT 分区标签没有BIOS 引导分区”时,这意味着 bios_grub 分区,而不是 /boot。
归档时间: |
|
查看次数: |
16242 次 |
最近记录: |