问题描述
基本工作系统详细信息:
我使用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。