当前位置: 首页>>技术教程>>正文


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

, , , ,

问题描述

基本工作系统详细信息:

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

我有4个磁盘。在所有磁盘上,我执行了以下操作,类似于this 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”工具,则此行为没有变化。

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

我也读过this page,但是Ubuntu没有附带”grub”命令,所以我不能完全遵循它。我可以简单地安装该命令,但我更想知道Ubuntu安装程序是如何设法安装它的,而不是进行其他设置。它使用阻止列表了吗?

这是在boot-repair-disk上引导时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(parted命令中将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中的修复时,它会询问其他问题。上次错误隐藏在窗口下,我不得不将另一个拖到远处才能看到它。这次主窗口消失了,新窗口显示:

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上运行它们,那也将特别好。

最佳回答

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

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

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

为什么仅运行”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。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/10158.html,未经允许,请勿转载。