GRUB2 启动引导器完全教程文档格式.docx
《GRUB2 启动引导器完全教程文档格式.docx》由会员分享,可在线阅读,更多相关《GRUB2 启动引导器完全教程文档格式.docx(47页珍藏版)》请在冰豆网上搜索。
∙三重启动
8.定制GRUB菜单
∙编辑/etc/default/grub
∙从菜单中去掉内存测试(memtest)
∙如果您不想让GRUB菜单包含memtest项,可以将20_memtest86+这个脚本设置为不可执行,然后更新GRUB。
∙更改菜单行标题
∙更改主题(启动背景图片)
9.GRUB2恢复(recovery)
∙从启动失败中恢复
10.观察小问题
∙内核损坏
∙内核崩溃转储机制
∙命令名称
11.GRUBlegacy对比GRUB2
∙GRUBlegacy
∙GRUB2
∙结论
12.更多阅读(文档和链接)
∙官方:
∙其他有用的GRUB2资源
13.结论
14.更新
警告
警告!
GRUB2还是测试软件。
尽管它已经获得Ubuntu的青睐,本身没有质量问题。
您可以没有问题的使用,虽然可能存在损害,但那离您是非常遥远的,即使真的发生,损害也只是轻微的一点点。
您需要认识到这些。
另外,任何处理危险的任务比如执行系统本身的危险命令,磁盘分区,启动序列,镜像,等等的时候,您应该时刻准备着最坏的情况。
这意味着:
∙对您的数据来考虑您必须有一个可靠的备份过程。
∙您必须拥有从灾难中迅速恢复的知识和工具。
∙这包括可以恢复系统的前一个镜像,修复损毁。
∙配置,恢复启动引导器,还有更多。
∙您必须对您所做的有信心。
现在您知道了这些,让我们高兴并且安全的开始。
那么一定要铭记,GRUB2还是测试版。
尽管同样我们可以想到GoogleMail,它测试了六年或者更多,您必须小心练习。
更重要的是,这篇指南的内容和内容相关可能会随着GRUB2被做成产品而改变,所以请持续关注更新。
GRUB2路标
这是您使用GRUB2之前需要考虑的。
什么时候GRUB2会成为类UNIX操作系统的实际启动引导器?
目前,GRUBlegacy版本工作的很好并且还将持续很多年。
像RedHat和Novell这样的公司为了服务器发行版会提供长期的技术支持,GRUBlegacy还是作为重要参与者存在五到十年。
在桌面领域,采用比率会快一些,但是不要期待短期内会有奇迹发生。
尽管如此,这并不影响探索。
请认识到您很可能会遇到兼容性问题而抛锚,特别是很多保守的发行版对新技术的支持并不是很及时。
到目前为止,GRUB2仅仅被Ubuntu家族使用,Ubuntu家族占了桌面市场的三分之一到一半。
这使得这篇指南变得有意义,因为两个或者三个Linux家庭使用者中就会有一个希望了解GRUB2信息并学习它的使用技术。
让我们现在到真正的技术中去。
GRUB2介绍
在开始之前,我强烈推荐您阅读我的关于GRUB常规版本的指南,这会帮助您更好的理解这篇文章。
GRUB2引入了很多新的更改。
GRUB2有更好的移植性和模块性,支持非ASCII码字符,动态加载模块,真实内存管理,还有更多。
所有这些几乎都和大多数使用者无关。
您需要知道的仅仅是配置文件的改变和GRUB2的操作方法。
新布局
GRUBlegacy版本将文件放置在/boot/grub/目录下,包括在启动过程中读取并显示内容给用户的menu.lst文件。
GRUB2将文件主要放在三个地方:
/boot/grub/grub.cfg
--这是替代menu.lst的主要配置文件。
不像menu.lst那样,grub.cfg不能手动更改!
我强烈建议不要尝试干预这个文件,无论是使用chattr命令或者其他。
由他去就行。
/etc/grub.d/
--这个新文件夹包含GRUB脚本。
这些文件是创建grub.cfg文件的基础。
当相关的GRUB命令执行以后,这些脚本以某个特定的顺序被读取并且创建grub.cfg文件。
/etc/default/grub
--这个文件包含GRUB脚本读取并且写入grub.cfg文件的GRUB菜单。
它是GRUB的定制部分,类似于老的menu.lst文件,实际启动项目除外。
这意味着,如果您想改变GRUB菜单,您将必须编辑已经存在的脚本或者创建新的脚本,然后更新菜单。
相比老的GRUB,这更类似于LILO,LILO允许在运行中编辑菜单。
Grub.cfg文件实例
文件位于:
/boot/grub/:
Grub.cfg文件看起来是这样的:
它实际上并不有趣,因为它仅仅是个脚本。
多数人可能不想读它的内容或者不能完全理解它们。
但是这个文件在任何您更新了GRUB菜单的时候还是值得浏览一下,以确保正确的条目像您预期的一样被加了进来。
但是仅仅在您熟悉脚本的情况下!
/etc/grub.d/目录示例
这是刚刚安装的系统中/etc/grub.d/文件夹下的所有文件,以Kubuntu为例:
我们来看一下这些脚本:
00_header是从/etc/default/grub中加载GRUB设置的脚本,包括超时、默认启动项和其他。
我们会稍侯了解更多。
05_debian_theme定义背景、颜色和主题。
这个脚本的名字很明确将会改掉当别的版本采用GRUB的时候。
10_linux为已经安装的发行版加载菜单项。
20_memtest86+加载memtest(内存测试)功能
30_os-prober这个脚本将会扫描硬盘上的其他操作系统并且添加到启动菜单。
40_custom是一个您可以用来创建新加的条目到菜单的模板。
您是不是已经认识到了脚本名字中数字的使用?
不错,这有点像不同的runlevel的Start/Kill脚本的顺序。
数字定义了优先级。
这意味着10_linux会比20_memtest86+先执行所以在启动菜单项中的位置更加靠前一点。
这些脚本也不太有趣。
像grub.cfg文件一样,他们也不希望被编辑,除了40_custom。
您必操作这些脚本的时候须非常小心。
我们稍侯看看它们的样子并且学习一下如何使用它们。
/etc/default/grub示例
/etc/default/目录下
这个目录包含很多其他文件所以不要以为仅仅被GRUB使用。
grub文件是一个被00_header脚本解析的文本文件。
您可以在这里更改如果您想改动的话。
我们稍侯在定制部分细谈。
现在我们知道了文件是什么样的,让我们看看怎么使用。
基本用法
是将我们的理论知识转化为实际行动的时候了。
GRUB2如何工作?
GRUB2这样工作:
/etc/default/grub包含定制化;
/etc/grub.d/脚本包含GRUB菜单信息和操作系统启动脚本。
当运行update-grub命令时,它读取grub文件的内容、执行grub.d中的脚本来创建grub.cfg文件。
就是这样。
想要更改grub.cfg文件,您需要编辑grub文件或者grub.d下面的脚本。
脚本是被执行的,这意味这他们拥有执行权限,如果您取消了执行权限,他们将不会执行。
这意味着您可以在grub.d下放多个文件,您想放多少就放多少,像update-grub能读的shell脚本那样长。
如果您想使用他们,就激活可执行权限(chmod+x),反之亦然,去掉可执行权限(chmod–x)。
让我们来看一下这些脚本:
拿00_header和05_debian_theme作为示例:
40_custom更有意义,但是它并没有告诉我们怎么定制脚本。
不要担心,我们会稍侯学习所有东西。
添加新的GRUB脚本
添加一项新的启动选项,您必须遵循一些基本语法:
创建一个新文件并且以数字和下划线作为文件名的前一部分。
如果您想把启动项放在其他选项的上边,使用一个稍小的数字,如果您想放在其他的后边,使用一个稍大的数字。
例如:
11_something将被放在操作系统默认条目的后边,反之08_something将被放置在10_linux条目的上方。
下一步是写实际内容,下面是例子:
#!
/bin/sh-e
echo"
Somestring"
cat<
<
EOF
menuentry"
Something"
{
setroot=(hdX,Y)
--bootparameters--
}
EOF
让我们仔细看一下这个文件:
/bin/sh–e第一行是shell脚本的声明,必须放在第一行。
输出字符串“Somestring”,这样在执行update-grub的时候您将看到这个字符串,如果您不想看到命令的输出,可以重定向到标准错误或者/dev/null:
>
&
2
例如:
echo"
AddingopenSUSE11.2"
Cat<
EOF定义实际启动条目的开始
menuentry“Something”是菜单的名字。
Linux
setroot=(hdX,Y)–设置根设备。
危险!
GRUB2使用分区标记从一开始而不是像GRUBlegacy版本那样从0开始!
这是非常非常重要的并且是必须记住的!
换句话说,标记设备是还是从0开始,但是分区从一开始。
比如,sda1在GRUB2中表示为(hd0,1),但是之前的版本表示为(hd0,0)!
--bootparameters--
每个操作系统都不同,在Linux中,您使用可能类似于:
linux/boot/vmlinuz
initrd/boot/initrd.img
但是在Windows中,您可能使用:
Chainloader(hdX,Y)+1
所以,一个完整的脚本应该是这样子:
AddingmycustomLinuxtoGRUB2"
MycustomLinux"
setroot=(hd0,5)
或者为了启动Windows,像这样:
OrforWindows,somethinglike:
AddingWindows8toGRUB2menu"
Windows8"
setroot=(hd0,1)
chainloader(hd0,1)+1
EOF结束GRUB条目。
现在我们拥有了一个文件,使之可执行:
chmod+xXX_new_os_script
GRUB2命令:
还有一件我想在这里强调的事情是包含在cat<
EOF部分的数据,正如我们刚刚看到的,cat命令在脚本中以EOF开始定义了GRUB代码,这些代码不会被shell执行,而是直接添加到GRUB菜单列表。
也就是说,cat<
EOF和EOF之间的任何东西都是GRUB命令。
我们在脚本中已经使用了多个不同的命令。
有些您可能已经在GRUBlegacy版本中见过,有些则是新的和陌生的。
不要担心,有一个完全的里表,包括跟GRUBlegacy的对比,一些命令被替换也有一些新加的命令,可以查看GRUB2命令列表
更新GRUB
新脚本已经就位,但是GRUB菜单(grub.cfg)并没有被更新。
我们需要执行update-grub命令来让一切发生。
update-grub
这里有一个来自双重启动的配置例子,稍侯我们会更加仔细的检查。
我已经添加了两个Kubuntu条目和一个Ubuntu条目来启动UbuntuGRUB菜单。
我做这些是为了摆脱默认的10_linux,10_linux很丑陋并且在名称中使用公共内核的名字,外加相同的调用Ubuntu和Kubuntu。
但是让我们慢下来。
我们第一个任务是添加新的脚本。
我们确定它能够正常启动以后,我们会删除副本。
重新启动以后,我们会得到这样的画面–对于图片的不美观我很抱歉。
一旦我们使用新脚本启动成功,我们可以去掉10_linux的执行权限。
通过改变脚本名称中的数字改变脚本启动顺序
您也可以更改数字,比如,我更改Kubuntu条目到08和09,这样他们就优先启动,在默认条目之前。
替换默认条目
这里有些事情可能您想试试,像我们上边提到的。
为了确认您的新脚本可以正确的启动,您可以查看
grub.cfg中可以工作的条目来确认您使用了正确的linux和initrd行。
这里是现成的例子:
相应的,我创建了新脚本:
操作系统探测器
操作系统探测器同样对您有帮助。
它会找到您硬盘中其他的启动条目并且添加到菜单中。
您可以使用这些信息来创建自己的脚本。
再看一次grub.cfg文件的os-prober部份的更多数据:
重装GRUB
GRUB2在您已经启动了系统以后也可以重新安装。
您不需要启动其他环境(如光盘启动)。
只需要对设备或者分区执行install-grub命令即可。
grub-install<
target>
这里的<
可以是/dev/hda,/dev/sdb,/dev/sdc4等等。
重要的一点是您应该注意一下命令的输出。
如果您执行命令的时候有其他的硬盘连接在电脑上,GRUB2会把他们添加到映射列表。
这应该不会造成什么伤害,但是如果条目不正确(输出信息中包含grub-installreportsincorrectdevices),那么先拿掉它们。
这是命令输出的例子:
您需要打开/boot/grub/device.map文件,删除错误的条目,像我们这里指向/dev/sdb的这条。
然后从新执行gru-install命令。
简短的总结
就是这些了,您现在拥有了开始工作的所有工具。
为了更加清楚一点,我对GRUB2的介绍和基本用法部分做了一个简短的总结,我们来看一下:
GRUB2主要有三个部份:
1./etc/default/grub
--这个文件包含了GRUB2的菜单。
2./etc/grub.d/
--这个目录包含了生成GRUB2菜单的脚本。
3./boot/grub/grub.cfg
--GRUB2的配置文件,勿直接编辑。
update-grub命令读取/etc/grub.d目录中的可执行脚本,并且按照数字顺序执行来生成grub.cfg文件,这期间00_header会读取/etc/default/grub文件中的配置。
启动条目来自多个地方,默认的来自安装GRUB的发行版,还有在硬盘上探测到的其他操作系统,外加用户添加shell脚本增加的定制条目。
添加或者删除某个条目,您可以通过更改脚本的权限实现,并不需要删除它们。
GRUB2可以在任何时候重新安装,包括通过GRUB2启动的系统中。
有问题么?
很好,正如您看到的,这非常简单。
现在,让我们看一下现实的情况。
之后,我们会自定义GRUB2并且看一下如何从各种错误和配置错误中恢复。
现实多重启动情况
在这一部分,我们讨论一下几种比较常见的多重启动案例,包括GRUB和GRUB2合成,Windows和Linux并列,chainloading和其他。
其中的一些试验是分别在不同的物理系统中进行的,所以一些启动菜单的截屏是实拍图片,所以一部分可能看起来有点古怪并不像您想象的那么动人,但这仅仅是为了保证您使用GRUB2进行其他管理任务也同样简单,只需要多一点耐心和谨慎。
双重启动:
这可能是双重启动最简单的配置了,连个操作系统都是用GRUB2,所以他们可以容易的互动。
两个操作系统分别是Ubuntu9.10和Kubuntu9.10,都是用Ext4格式。
Ubuntu先安装,同时将GRUB2安装到了/dev/sda的MBR,然后安装Kubuntu,重写了MBR中的GRUB。
然而,操作系统探测器成功的发现了Ubuntu并且添加了Ubuntu的启动项。
如果您读过我的Kubuntu教程,您会发现Kubuntu启动项也是标为Ubuntu的,这可能会和机器上的Ubuntu混淆。
这一部分,我们将:
∙学习如何编辑已有的条目使之更加漂亮。
∙添加新的启动项并且为已有的排序。
这会给我们一些线索,关于GRUB2如何工作和怎么更改它。
之后,我们看一下从legacyGRUB启动引导GRUB2,反之亦然。
再之后我们加入Windows的引导。
我们已经看了一点测试用例,有默认的条目,但是并不好看,我们想替换掉它们。
所以参考grub.cfg文件,检查10_linux使用的语法,就像我们前面做的,拷贝相应的部分到我们的新脚本,08_9_10_kubuntu和08_9_10_kubuntu_recovery.
,我们添加可执行权限(chmod+x)并更新GRUB(update_grub),非常简单。
重启并确认每个都可以正常工作以后,我们拿掉条目已经被替换了的10_linux。
工作完成,简单至极!
这是一个有趣的案例。
我们假设您有两个操作系统,像Ubuntu,使用GRUB2,并且从Ext4启动,还有一个老一点的发行版,比如openSUSE11.2,也使用Ext4,但是使用GRUBlegacy。
我们将:
∙利用openSUSE的GRUB启动Ubuntu
∙使用Ubuntu的GRUB启动openSUSE
∙编辑两个系统的条目使之正常工作。
让我们开始吧。
决策:
哪一个是默认的?
这是您需要决定的,我们两个启动引导器,您需要选择一个作为默认的。
如果您问我,现在为止,您应该使用GRUBlegacy作为您的默认启动引导器,因为它有足够好的产品质量并且广为人知,确定支持引导。
使用GRUB2将置您于少数派之列。
好了,如果您将使用GRUBlegacy来启动,您应该:
∙
在安装发行版的时候将GRUB安装到MBR,在我们的例子中是安装openSUSE的时候,在安装的时候注意一点细节。
∙将GRUB2安装到使用它的发行版所用的主分区,这个例子中的Ubuntu,同样,请注意细节。
否则,如果您计划使用GRUB2作为默认,您需要使用另一个思路。
如果您不太确认,再检查一下分区表。
在我们的例子中,Ubuntu先安装并且将root目录安装到了/dev/sda6将home目录安装到了/dev/sda7.然后安装openSUSE到/dev/sda1,home没有单独分区。
因为我们希望使用GRUBlegacy引导,所以:
∙Ubuntu启动引导器需要安装到/dev/sda6
∙openSUSE启动引导器需要安装到MBR(/dev/sda)
现在都完成了,我们启动一下看看会发生什么。
安装openSUSE以后,您会注意到GRUB菜单只包含openSUSE条目。
原因是GRUBlegacy并不知道如何直接获取GRUB2布局所以不能找到添加条目到菜单,您需要手工的做这些。
启动到openSUSE并使用文本编辑器打开menu.lst文件,记得先备份一下!
我们现在确实不知道GRUBlegacy怎么使用GRUB2的菜单项,所以我们假设它跟Windows是一样的,我们将chainload另外一个系统,将控制权交给它的启动引导器。
这样可以么?
我不知道,试一试吧!
我们正在用GRUB经验来适应新的情况。
如果您不明白图片中是什么也不要紧,您只需要明白,我们添加了最后面的这3行:
titleUbuntu9.10KarmicKoala
root(hd0,5)
chainloader(hd0,5)+1
启动时候,您将看到菜单(再次为丑陋致歉)
如果您尝试启动Ubuntu9.10KarmicKoala这一项,您会遇到这样一个恶心的错误(Error13):
这类错误通常在Linux用户尝试启动Windows和Mac分区的时候会遇到。
对Windows来说,解决办法是重新映射分区、隐藏分区或者激活它们,一般都可以解决。
而Mac引导,跟这个问题相似。
来自openSUSE的GRUBlegacy不能获取Ubuntu分区和GRUB2结构,我们需要一个不同的方式解决问题。
更多信息,查看GRUB错误信息。
从openSUSE启动Ubuntu的正确方法
我们需要做的是,重新回到openSUSE打开nenu.lst文件,改成这样:
(为不能看到图片的读者考虑)我们添加了下面这些到menu.lst文件:
kernel/boot/grub/core.img
savedefault
boot
您可能想知道我们做了什么,答案是,core.img文件是一个微型的内核镜像,这个镜像允许您启动适当的驱动器而且正确地识别和初始化真正的内核。
您可以把它看作传统initrd.img文件的集合。
重启以后您会看到GRUB2菜单,选择一个启动。
一旦进入了Ubuntu,如果您愿意可以做一点小动作,就是,回到update-grub脚本。
它可以把安装的openSUSE添加到菜单中。
这样您就有递归的GRUB菜单了。
这不是必须的,但是非常有趣而且可以练习知识和控制的能力。
另一个有趣的案例是Mandriva2010和Ubuntu9.10双启动。
安装Mandriva的时候,您在第一次启动之前就可以选择手动更改GRUB启动引导器。
事实上,很多发行版都允许您在一定程度上配置启动菜单。
只要知道需要什么,您就可以通过安装时候配置菜单节省不少时间。
下面是在Mandr