基本工作系统详细信息:
我使用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上运行它们,那也将非常好。