Ubuntu服务器,gpt分区表,mdadm,grub引导失败


9

基本工作系统详细信息:

我使用Ubuntu 12.04服务器CD安装服务器。

我有4个磁盘。在所有磁盘上,我执行了以下操作,类似于此howto

  • 创建了一个2GB的交换分区
  • 创建了一个256 GB / boot分区
  • 创建了一个64 GB RAID10分区(用于root用户)
  • 创建了一个RAID10分区并占用了其余空间

我将引导格式化为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..

因此,看起来好像失败了,但似乎也放弃了,没有做任何改变。所以我重启了。引导失败。它只是挂在黑屏上,并且光标向下闪烁约4行。如果我按住“ Shift”键启动,则会在光标左侧看到单词“ GRUB”,但没有交互式提示。

此时,我使用boot-repair-disk生成了此报告:http : //paste.ubuntu.com/966531/

注意,在上面的报告中,它说引导加载程序没有指向core.img的正确扇区。(sda是虚拟cd; ​​sdb是引导磁盘; sdc是sdb的镜像,但是引导没有被镜像,只有一个单独的无关分区并格式化了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

此时,我使用了boot-repair-disk来生成此报告:http : //paste.ubuntu.com/966561/

请注意,在以上报告中,有关core.img的问题已消失。它似乎指向正确的扇区。

现在,如果我尝试启动,则会收到一个grub提示。如果我运行“ set”,则会看到找到并设置了根目录。如果运行“ ls /”,我会从raid卷中看到我的根目录,包括vmlinuz内核文件。如果键入“ ls / vmlinuz”,则显示“错误:找不到文件”。如果我使用“ linux”命令尝试加载内核,则会显示相同的错误。如果使用“ ls -l /”,则不会列出vmlinuz文件。

过于冗长的细节,以备不时之需:

我注意到也没有/boot/grub/grub.cfg,所以我跑了

# grub-mkconfig -o /boot/grub/grub.cfg

但是问题仍然存在。

如果我使用“ gptsync”工具,则此行为没有变化。

引导修复盘无法修复系统,因为它希望我使用启用了EFI的BIOS进行引导。我简要地研究了一下,但是我不知道它是如何工作的。我在启动选项中找到了UEFI Shell,但对此一无所知,也看不到如何从那里更改启动方式(例如,从该EFI Shell启动CD)。

我也阅读了此页面,但是Ubuntu没有附带“ grub”命令,所以我不能完全遵循它。我可以简单地安装该命令,但我更想知道Ubuntu安装程序是如何设法安装它的,而不是进行其他设置。它使用了黑名单吗?

这是在引导修复盘引导时parted的输出(此处sdb是第一个硬盘,从磁盘引导时是sda,在第二个粘贴链接中,“ boot”更改为“ 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

这是一个不相关的超级旧虚拟机,用于比较(对于不熟悉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

raid似乎具有启动文件,并且sdb2未格式化。(尽管如此,系统在运行grub-install之前已启动)。从应急CD中,“ mount -t ext3 / dev / sdb2 / boot”失败。但这很有意义,因为grub显式使用分区2(parts命令中将bios_grub设置为2的分区2)。

所以我做了这样的事情:

# 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

然后重新启动,我再次出现黑屏,没有提示。 http://paste.ubuntu.com/966848/

所以在这一点上,我的猜测是,当设置了bios_grub时,grub不会安装到MBR上,也不会安装到ext3上的ext3文件系统上,而是安装在分区本身上,就好像是EFI一样……这显然会造成混乱在那里建立ext3文件系统。从我对EFI的简短阅读中可以得出,听起来像EFI假定第一个分区是引导分区,但是在我的情况下,第一个分区是swap,并且它也应该是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?

因此,我单击“是”,它说修复成功,并创建了另一个粘贴:http : //paste.ubuntu.com/966862/

但是我仍然黑屏,并且光标闪烁。

现在,我的理论是引导被非胖非EFI东西覆盖,这只是grub代码,否则以前在0-63扇区中。幸运的是,我在此页面上遇到了一个非常清晰的声明,这很可能使我对所有这些含义的理解得以完成。然后,在我发现该问题之后,Jeremy发布了一个答案,如果答案是正确的,则确认这是缺少的关键概念。 http://blog.psych0tik.net/2011/08/grub-embedding-blocklists-and-bios_grub-partitions/

问题:

到底是怎么回事?为什么grub无法启动?为什么说“找不到文件”?

为什么grub不想在没有我用parted设置的设置(Ubuntu安装程序没有设置)的情况下安装?我以为安装它所需的就是一个单独的/ boot,它不在LVM或软件RAID中,因为我的根目录在RAID中,而分区表是GPT。

Ubuntu CD安装程序如何在没有此问题且没有bios_grub设置的情况下进行安装?

我也会考虑使用EFI。如果这是一个好主意,并且有标准的设置方法,那么我总是乐于学习新事物。

即使不回答所有问题,最令我满意的答案是一套可以从应急CD运行的命令集,以与安装CD相同的方式修复引导加载程序。如果我可以在引导的系统而不是CD上运行它们,那也将非常好。


您能添加来自parted的打印输出吗?
杰里米(Jeremy)2012年

您可以在993行的2个粘贴链接中看到该链接,但是根据请求,我将其附加到我的问题中。
彼得

Answers:


8

解决方案是使用bios_grub分区,该分区与/ boot分区不同。

默认情况下,bios_grub分区为1MiB,并且必须将其标记为bios_grub。我的是我磁盘上的第一个分区。如果您的分区2实际上是/ boot,如建议的那样,那将是不正确的,您应该创建另一个1MiB分区。

使用GPT和GRUB2,最小文件系统具有三个分区:bios_grub,root,swap。(不能完全确定是否需要交换)

为什么仅运行“ grub-install”后grub无法启动?

未知...您可能会想,如果它明确表示无法嵌入,那么它将无法工作,因此不会对其进行任何修改。

为什么说“找不到文件”?

/ vmlinuz是使用引导分区的符号链接,并且引导分区已损坏。bios_grub代码写在其ext3结构的顶部。这可能意味着未安装/ boot,并且在那里看到的grub文件实际上在根系统上,该系统不包含内核。

为什么不使用我设置为parted的此设置不安装grub

与MBR不同,GPT分区表没有用于引导加载程序的空间。因此,必须创建一个特定的分区来保存启动代码。在运行“ grub-install”之前,请使用以下命令指定此分区:

    parted /dev/sda set 1 bios_grub on

我以为我需要的只是一个单独的/ boot。没有bios_grub设置的Ubuntu CD安装程序如何安装?

这个要求似乎是Ubuntu安装程序所需要的全部,但是它创建了一个非标准的系统,很容易被破坏。

当GRUB说“此GPT分区标签没有BIOS引导分区 ”时,表示bios_grub分区,而不是/ boot。


谢谢。实际上,这与我现在正在研究的非常接近。看到我的“我仍然完全茫然无知”。以上部分。现在,我的理论是引导被非胖非EFI东西覆盖,这只是grub代码,否则以前在0-63扇区中。我正在做一个实验,然后将让您知道它的进展。
彼得

您在使用Ubuntu吗?Ubuntu安装程序是否可以使用bios_grub分区正确安装?
彼得

@Peter我使用Ubuntu,如果您进行引导分区,则安装程序应正确设置。我知道11.10安装程序对我有用。
杰里米

非常感谢你。这就是答案。接下来,我将尝试更复杂的设置(引导中的raid和lvm),然后我将详细编辑您的答案。
彼得
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.