GRUB手册(1)

1.       GRUB的简介

1.1. 概览

概而言之,当计算机启动时,启动载入器是第一个运行的程序。它负责载入并把控制传递给操作系统内核(例如Linux或GNU Mach)。内核依次初始化操作系统剩下的部分(即,GNU系统)。

GNU GRUB是一个非常强大的启动载入器,它可以载入相当多的自由操作系统,以及通过链式载入(链式载入的机制,通过载入另一个启动载入器,来载入不支持的操作系统。它主要用于加载DOS或Windows)载入专有操作系统。GRUB被设计来处理个人计算机启动的复杂性;程序及本手册紧密地与计算机平台联系,虽然在将来会涉及到其它平台的移植。

GRUB的一个重要特性是灵活;GRUB理解文件系统及内核的可执行格式,因此你可以以你喜欢的方式载入任意操作系统,不需要记录内核在硬盘上的位置。这样你可以仅指出文件名,以及内核所在的启动分区,来载入内核。

当使用GRUB启动时,你可以使用命令行接口(参考12.1节【命令行接口】,29页),或菜单接口(参考12.2节【菜单接口】,30页)。使用命令行接口时,需要手工键入驱动器及内核文件名。在菜单接口中,你只需使用箭头选择一个OS。该菜单基于你先前准备的一个配置文件(参考第5章【配置】,11页)。而在该菜单中,你可以切换到命令行模式,反之亦然。你甚至可以在使用菜单前编辑它。

在下面的章节中,你将学习到如何向GRUB指定一个驱动器,一个分区,及一个文件名(参考第2章【命名规则】,5页),如何在你的驱动器上安装GRUB(参考第3章【安装】,5页),及如何一步步地启动你的OS(参考第4章【启动】,9页)。

1.2. GRUB的历史

GRUB源至1995年,当时ErichBoley尝试引导使用Utah大学的Mach 微内核(现在以GNUMach而闻名)的GNU Hurd。Erich与BrianFord设计了多重启动规范(Multiboot Specification)(参见TheMultiboot Specification 中的“Motivation”一节),因为他们决定不要增加已经很多的,互不相容的PC启动方案。

Erich开始修改FreeBSD的启动载入器,使之可以理解多重启动。他很快意识到从头写自己的启动载入器,比继续修改FreeBSD的启动载入器要简单得多,因而诞生了GRUB。

Erich向GRUB加入许多特性,但其它优先考虑的事使得他不能跟上GRUB快速增加的用户群的要求。在1999年,Gordon Matzigkeit与Yoshinori K.Okuji采纳GRUB作为正式的一个GNU程序包,并使得最新的源代码可以通过匿名CVS得到,来开放对其的开发。进一步细节参考附录A【获取并构建GRUB】,55页。

接下来几年里,GRUB被扩展来满足许多的需要,但很快事情变得清晰起来,其设计不能跟上对其所提出的扩展要求,并且已经到了这一点上——不打破现有的特性,进行进一步的修改非常困难。2002年前后,Yoshinori K. Okuji开始PUPA(GNU GRUB初步通用编程架构 - Preliminary Universal ProgrammingArchitecture for GNU GRUB)的工作,致力于重写GRUB的核心,使它更清晰,更安全,更强壮,以及强大。PUPA最终被重命名为GRUB 2,而GRUB的最初版本被命名为GRUB Legacy。GRUB Legacy依然有少量的维护,不过最后的版本(0.97)在2005年完成,而在这份文档的制作时刻(译:指英文版,日期是2011年5月11日),看起来不太可能会有新的版本。

在2007年前后,GNU/Linux发行版开始在有限范围内使用GRUB 2,而到2009年底,多个主要发行版默认都安装GRUB 2。

1.3. 与上一版的差别

GRUB 2是GRUB的一个重写版本(参考1.2节【历史】,1页),虽然它与前一个版本,现在的GRUB Legacy,共享许多特征。GRUB Legacy的使用者可能需要一些指引来熟悉这个新版本。

l       配置文件具有一个新的名字(‘grub.cfg’而不是‘menu.lst’或‘grub.conf’),新词法(参考第5章【配置】,11页),以及许多新命令(参考14章【命令】,35页)。配置不能被直接拷贝,虽然绝大多数GRUB Legacy使用者不应该对这个词法感到惊奇。

l       ‘grub.cfg’通常地由grub-mkconfig自动产生(参考5.1节【简单配置】,11页)。这使得处理内核版本的升级更加容易。

l        在GRUB设备名中的分区号现在从1开始,而不是0(参考第2章【命名规则】,5页)。

l       配置文件以更接近一个完全脚本语言的语言来完成:可以使用变量,条件及循环。

l       在重启过程使用GRUB中的save_env及load_env命令,及grub-editenv实用程序,可使用少量永久储存。这不是在所有的配置中都可用的(参考13.2节【环境块】,35页)。

l       GRUB 2有更可靠的方式来找出它自己的文件,以及在多盘系统上的目标内核,还有命令(参考14.3.40节【search】,44页)来找出使用文件系统标签或全局唯一标识符(UUID)的设备。

l        除了GRUB Legacy支持的PC BOIS系统,GRUB2还可用于其它系统:PC EFI,PC coreboot,PowerPC,SPARC,及MIPSLemote Yeeloong都被支持。

l        支持更多文件系统,包括但不限于ext4,HFS+,及andNTFS。

l        GRUB 2可以直接从LVM及RAID设备读入文件。

l        有一个图形化终端及一个图形化菜单系统。

l        GRUB 2接口,包括菜单项名字,可以被翻译。

l        构成GRUB的映像文件(参考第10章【映像文件】,26页)被重组了,不再有Stage 1,Stage 1.5及Stage2。

l        GRUB 2把许多工具做成动态加载的模块,使得核心映像更小,并允许以更灵活的方式构建核心映像。

1.4. GRUB特性

对GRUB的主要要求是,符合多重启动规范,这在多重启动规范的“Motivation”一节中描述。

其它目标,以大致的重要性排列,有:

l        对于终端用户,基本功能应该简单明了。

l        向内核专家及设计者提供丰富的功能。

l        向后兼容启动FreeBSD,NetBSD,OpenBSD,以及Linux。通过一个链式载入功能支持专有内核(比如DOS,Windows NT,及OS/2)。

除了特殊的兼容模式(链式载入及Linux的piggyback格式),正如多重启动规范所示,所有内核将以几乎相同的方式启动。当前仅支持在1M或以上地址载入内核。任何该边界以下的载入尝试,将直接导致失败,并产生一个报告这个问题的错误消息。

除了上述的要求,GRUB具有如下的特性(注意多重启动规范不要求GRUB所支持的所有特性):

识别多种可执行格式

支持多种a.out变体,包括ELF。符号表亦被载入。

支持非多重启动内核

支持多种缺少多重启动能力的32位自由内核(主要是FreeBSD,NetBSD,OpenBSD,以及Linux)。亦支持其它启动载入器的链式载入。

加载多个模块

完全支持载入多个模块的多重启动特性。

载入配置文件

支持一个使用预置启动命令的可读的文本配置文件。你也可以动态地载入另一个配置文件,以及在一个GRUB映像文件中嵌入一个预置的配置文件。这些命令(参考第14章【命令】,35页)是命令行所支持的一个超集。第5章【配置】,11页,给出了配置文件的一个例子。

提供一个菜单接口

可使用一个列出预置的启动命令的,具有可编程超时的菜单接口。 对启动项的数目没有硬性的限制,当前的实现可以容纳数以百计的项。

具有一个灵活的命令行接口

一个相当灵活的命令行接口,可从菜单访问,可编辑任意预设的命令,或从头编写一个启动命令集。如果配置文件没有出现,GRUB退至命令行。这些命令(参考第14章【命令】,35页)是配置文件所支持的一个子集。命令编辑非常类似于Bash命令行(参考Bash特性中“命令行编辑”一节),可使用TAB补全的命令、设备、分区,及在一个依赖于上下文目录中的文件。

支持多种文件系统

支持多种文件系统,包括一个有用的显式块列表记法。当前支持的文件系统有Amiga快速文件系统(AFFS),AtheOS fs,BeFS,cpio,Linux ext2/ext3/ext4,DOSFAT12 / FAT16 / FAT32,HFS,HFS+,ISO9660,JFS,Minix fs,nilfs2,NTFS,ReiserFS,Amiga智能文件系统(SFS),tar,UDF,BSDUFS/UFS2,及XFS。更多信息参见第11章【文件系统】,28页。

支持自动解压缩

可以解压缩由gzip或xz(仅支持CRC32数据完整性检查(xz的缺省是CRC64,因此应该使用-check=crc32选项),支持LZMA BCJ过滤器)压缩的文件。这个功能对于用户是透明且自动可用的(即所有功能工作于指定文件的非压缩内容上)。这大大减少了文件大小及载入时间,尤其对于软盘(有某些病态的情形,载入组织得非常糟的ELF内核要花更长的时间,不过实际上这不会发生)。可以想见,某些内核模块应该以压缩状态载入,因此应该指定一个不同的模块载入命令来避免解压缩该模块。

访问任意已安装设备的数据

支持从任意或所有由BIOS组织的软盘或硬盘读数据,这不依赖于root设备的设置。

独立于驱动几何数据的解释

不像许多其它的启动载入器,GRUB使得所指定驱动的几何数据的解释无关要旨。一个已安装并以一种解释运行的驱动,可以被转换为另一种解释,而不会对GRUB的配置产生任何不良影响。

检测所有已安装的ram

GRUB通常可以找出在一台PC兼容机器上所有已安装的ram。它使用一个先进的BIOS查询技术来查找所有的内存区域。如多重启动规范所描述的(参考多重启动规范的“动机”一节 ),不是所有的内核都使用这个信息,不过GRUB为使用的内核提供这个信息。

支持逻辑块地址模式

在传统的硬盘调用中(称为CHS模式),几何数据的解释存在一个问题,即,BIOS不能访问超过1024个柱面,因而可访问的空间被限制为最少508 MB,最多8GB。GRUB不能统一地处理这个问题,因为没有一个标准的接口可用于所有的机器。不过,某些新式的机器具有新的接口,即,逻辑块地址(LBA)模式。GRUB自动地检测LBA模式是否可用,如果可用就使用之。在LBA模式中,GRUB可用访问整个硬盘。

支持网络启动

GRUB主要是一个基于硬盘的启动载入器,不过也同样具有网络支持。你可以通过使用TFTP协议,从网络载入OS映像。

支持远程客户端

为了支持没有控制台的计算机,GRUB提供了远程客户端支持,因此你可以从一台远程主机控制GRUB。目前仅支持串行客户端。

1.5. 启动载入器的角色

以下引用自GordonMatzigkeit,一个GRUB狂热爱好者:

某些人当谈及他们的电脑时,倾向于确认操作系统及内核,因此他们可能会说他们使用“GNU/Linux”或“GNU/Hurd”。其他人看起来认为内核是系统最重要的部分,因此,他们倾向于称呼他们的GNU操作系统为“Linux系统”。

我,个人地,相信这是一个极为不公正的判断,因为启动载入器才是所有中最重要的软件。我习惯把上面的系统称为“LILO”或“GRUB”系统。

很不幸,没有人能明白我在说什么;现在我只使用“GNU”这个词作为GRUB的一个别名。

因此,如果你曾经听到人们讨论他们所宣称的“GNU”系统,记住他们实际上是在向最好的启动载入器GRUB致敬!

2.       命名规则

GRUB中使用的驱动器记法,与你之前在你的操作系统中看到的有一点不同,你需要了解它,使得你可以指定一个驱动器或分区。

考虑下面的例子及解释:

(fd0)

首先,GRUB要求驱动器名必须封装在‘(’及‘)’之间。‘fd’部分表示这是一个软盘。数字‘0’是驱动器号,它从0开始计数。这个表达式表示GRUB将使用整个软盘。

(hd0,msdos2)

在这里,‘hd’表示这是一个硬盘驱动器。第一个整数‘0’表示驱动器号,即,第一个硬盘,字符串‘msdos’显示分区规划,而第二个整数‘2’表示分区号(或按BSD术语,pc的片号码(slicenumber))。分区号从1开始计数,而不是从0开始(前一个版本GRUB的做法)。这个表达式表示第一个硬盘驱动器的第二个分区。在这个情形下,GRUB使用该硬盘的一个分区,而不是整个硬盘。

(hd0,msdos5)

这表示第一个硬盘驱动器的第一个扩展分区。注意扩展分区的分区号从‘5’开始计数,而不管在你硬盘上实际主分区的数目。

(hd1,msdos1,bsd1)

这表示BSD第二个硬盘的第一个P片号码的‘a’分区。

显然,要使用GRUB真正访问硬盘或分区,你需要在一个命令中具体说明驱动器,就像‘set root=(fd0)’或‘parttool (hd0,msdos3) hidden-’。为了帮助你找出哪个号码指定你所需要的分区,GRUB命令行(参考12.1节【命令行接口】,29页)选项具有参数完成功能。这意味着,比如,你只需要键入

set root=(

接着键入一个TAB,GRUB将显示驱动器,分区,或文件名的列表。因此确定目标分区的名字相当简单,就算只略懂这个词法。

注意到GRUB不区分IDE与SCSI – 它只是简单地从0开始计算驱动器号,而不考虑其类型。通常地,IDE驱动器号小于SCSI驱动器号,虽然如果你在你的BIOS中交换IDE及SCSI驱动器的启动顺序,会改变这个事实。

现在问题是,如何指定一个文件?再次的,考虑一个例子:

(hd0,msdos1)/vmlinuz

这指定名为‘vmlinuz’,在第一个硬盘驱动器的第一个分区的文件。注意到参数完成也能用于文件名。

应该承认这很简单。现在阅读下一章,看如何真正地在你的驱动器上安装GRUB。

3.       安装

为了把GRUB安装为你的启动载入器,首先你需要在你的类unix操作系统下安装GRUB系统及实用程序(参考附录A【获取及构建GRUB】,55页)。你可以从源代码tarball或针对你的OS的软件包,来做到这一点。

在完成之后,你需要使用程序grub-install在一个类unixOS的一个驱动器(软驱或硬盘)上安装启动载入器(参考第19章【调用grub-install】,53页)。

GRUB带有启动映像,这些映像通常放在目录‘/usr/lib/grub/<cpu>-<platform>’下面(对于基于BIOS的系统,为‘/usr/lib/grub/i386-pc’)。此后,GRUB映像最初被放入的目录(通常是‘/usr/lib/grub/<cpu>-<platform>’)将被称为映像目录,而启动载入器需要在其中查找它们的目录(通常是‘/boot’)将被称为启动目录。

3.1. 使用grub-install安装GRUB

至于在PCBIOS平台上,GRUB应该被安装在何处的信息,参考3.4节【BIOS安装】,8页。

为了在一个类UNIXOS(例如gnu)下安装GRUB,以超级用户(root)调用grub-install(参考第19章【调用grub-install】,53页)。

其用法大致说来非常简单。你仅需要向这个程序指定一个参数,也就是,何处安装这个启动载入器。这个参数必须是一个启动文件(如‘/dev/hda’)。例如,在Linux下,以下将把GRUB安装如第一个IDE硬盘的MBR:

# grub-install /dev/hda

类似的,在GNU/Hurd下,这有相同的效果:

# grub-install /dev/hd0

但是上面的例子假设GRUB应该把映像放入‘/boot’目录。如果你希望GRUB把映像放入‘/boot’以外的目录,你需要指定选项‘--boot-directory’。典型的用法是你创建了带有一个文件系统的GRUB启动软驱。这里是一个例子:

# mke2fs /dev/fd0

# mount -t ext2 /dev/fd0 /mnt

# mkdir /mnt/boot

# grub-install --boot-directory=/mnt/boot /dev/fd0

# umount /mnt

某些BIOS有一个bug,把USB驱动的第一个分区视为一个软驱,而不是一个硬盘(它们称其为“USB-FDD”启动)。在这种情形下,你需要这样来安装:

# losetup /dev/loop0 /dev/sdb1

# mount /dev/loop0 /mnt/usb

# grub-install --boot-directory=/mnt/usb/bugbios --force--allow-floppy /dev/loop0

这个安装不会与标准安装冲突,只要它们在不同的目录中。

注意到grub-install实际上只是一个shell脚本,而真正的工作由grub-mkimage及grub-setup完成。因此,你可以不使用grub-install,直接运行这些命令来安装GRUB。不过,不要这样做,除非你非常熟悉GRUB的内部构造。在一个运行中的OS上安装一个启动载入器可能非常危险。

3.2. 制作一个GRUB可启动的CD-ROM

GRUB支持ElTorito规范(用于使用BIOS功能的可启动CD的规范)的非模拟模式。这意味着你可以从GRUB使用整个CD-ROM,并且你不需要制作一个软驱或硬盘映像文件,这个文件会导致兼容问题。

至于从一个CD-ROM启动,GRUB使用一个称为‘cdboot.img’的特殊映像,它与‘core.img’连结。用于这个目的的‘core.img’应该至少构建有‘iso9660’及‘biosdisk’模块。你的可启动CD-ROM通常也需要包括一个配置文件‘grub.cfg’以及某些其它的GRUB模块。

为了制作一个简单通用的GRUB救援CD,你可以使用grub-mkrescue程序(参考第22章【调用grub-mkrescue】,54页):

$ grub-mkrescue -o grub.iso

你将经常需要在你的映像文件中包括其它文件。为了这样做,首先为可启动映像构建一个顶层目录,比如‘iso’:

$ mkdir iso

为GRUB构建一个目录:

$ mkdir -p iso/boot/grub

如果需要,在‘iso/boot/grub’下制作配置文件‘grub.cfg’(参考第5章【配置】,11页),并拷贝用于这个光盘的所有文件、目录到目录‘iso/’。

最后,制作映像文件:

$ grub-mkrescue -o grub.iso iso

这产生一个名为‘grub.iso’的文件,然后它可以被烧入一个CD(DVD)中,或写入一个USB存储设备。

在进入配置文件‘grub.cfg’时,将正确建立根设备,因而你可以在CD上引用文件名,而不需要使用一个显式的设备名。这使得制作可在光盘及USB上工作的救援映像更加容易。

3.3. BIOS设备与OS设备之间的映射

grub-mkdevicemap程序可以用于构建设备映射。如果设备映射文件不存在,它通常为例如grub-install的工具所运行。首选文件名为‘/boot/grub/device.map’。

如果存在设备映射文件,GRUB实用程序(grub-probe,grub-setup等)读入它来把BIOS设备映射到OS设备。这个文件包含像这样的行:

device file

device是以GRUB词法所指定的一个设备(参考11.1节【设备词法】,28页),而file是一个OS文件,它通常是一个设备文件。

以往,使用设备映射文件是因为GRUB设备名要使用在配置文件中,并且它们从BIOS设备号导出。BIOS设备与OS设备之间的映射不总是能正确地猜出:例如,如果在BIOS中交换了IDE与SCSI的启动次序,GRUB将得到错误的次序。

不幸的是,OS设备名甚至不是一成不变的。Linux内核的新版本可能每次启动以不同的次序搜索设备,而且前缀(‘/dev/hd*’与‘/dev/sd*’) 依赖于所使用的设备子系统,可能会改变。结果,设备映射文件,在某些系统上,要求频繁地修改。

现在,GRUB通过在产生‘grub.cfg’时使用UUID或文件系统标记,避免了这个问题,并且我们建议在你制作的定制菜单项中也这样做。如果设备映射文件不存在,那么GRUB实用程序将采用一个随时更新的临时设备映射文件。这通常足够好,特别在常见的单硬盘系统上。

不过,设备映射文件也还没完全过时,仍然有一些情形要求它的存在。如果grub-mkdevicemap产生了一个错误,这时,如有必要,你可以编辑这个文件。你可以在文件中加入任意需要的注释,因为GRUB实用程序假定第一个字符是‘#’的行是注释。

3.4. BIOS安装

MBR

通常用在PCBIOS平台上的分区表格式被称为主启动记录(MBR)格式;这个格式允许最多四个主分区及一个额外扩展分区。使用这个分区表格式,有两种方式安装GRUB:它可以被嵌入到MBR与第一个分区之间的区域(有多种名字称呼,比如“boot track”,“MBR gap”,或“embedding area”,通常至少31 KiB),或者core映像可以被安装在一个文件系统中,而构成它的块列表可以被保存在该分区的第一个扇区。

每种方式都有自己的问题。没有完全安全的方法来保留嵌入区域内的空间,某些专有软件已知会使用它,使得用户难以绕过许可证限制;而且系统有时不在第一个分区之前留出足够的空间。另一方面,安装到一个文件系统意味着GRUB容易受到文件系统功能所伤害,比如尾整理,移动其数据块,甚至过分的fsck,因此这个方式相当脆弱;并且这个方式仅当‘/boot’文件系统在启动BIOS的硬盘上时,才可以使用,这样GRUB才不需要猜测BIOS设备号。

GRUB开发团队通常建议在第一个分区嵌入GRUB,除非你有特殊的要求。你必须确保第一个分区至少离硬盘开始位置31 KiB(63个扇区);在现代硬盘上,分区对齐在更大的边界会带来性能上的好处,因此第一个分区可能离硬盘开始位置1 MiB以外。

GPT

某些更新式的系统使用GUID分区表(GPT)格式。这个格式被规定为可扩展固件接口(EFI)的一部分,不过如果系统软件支持,它也可以用在BIOS平台上;例如,GRUB及GNU/Linux可被用在这个配置中。通过这个格式,可以为GRUB保留被称为BIOS启动分区的一整个分区。然后GRUB可以嵌入到这个分区,而不会有被其它软件改写的风险,也不需要包含在可能会移动它数据块的文件系统中。

当在一个GPT系统上构建一个BIOS启动分区时,你应该确保它至少有31 KiB大小(GPT格式化硬盘通常不会那么小,因而我们建议你构建得大一些,比如1 Mib,以允许足够的增长空间)。你还必须确保它有正确的分区类型。使用GNU Parted,你可以使用类似下面的命令设置它:

# parted /dev/disk set partition-number bios_grub on

如果你正在使用gdisk,把分区类型设置为‘0xEF02’。使用要求直接设置GUID的分区程序,它应该是‘21686148-6449-6e6f-744e656564454649’。

注意:小心你选择的分区!当GRUB在安装期间找到一个BIOS启动分区,它将自动地覆盖其中部分。确保该分区不包含其它数据。

4.       启动

GRUB可以一致的方式载入多重启动兼容的内核,但对于某些自由操作系统,你需要使用某些OS特别的魔数。

4.1. 如何启动操作系统

GRUB具有两种不同的启动方法。一个是直接载入一个操作系统,而另一个是链式载入另一个启动载入器,它然后将真正载入一个操作系统。概括而言,前者是更期望的,因为你不需要安装或维护其它启动载入器,并且GRUB足够灵活,能从任意硬盘、分区载入一个操作系统。不过,后者有时也是需要的,因为GRUB不是天然地支持所有现存的操作系统。

4.1.1. 如何使用GRUB直接启动一个OS

多重启动(参考多重启动规范中的“动机”一节)是GRUB支持的原有格式。出于方便的缘故,还有对Linux,FreeBSD,NetBSD及OpenBSD的支持。如果你希望启动其它操作系统,你将要链式载入它们(参考4.1.2节【链式载入】,9页)。

FIXME:这一节未完成。

  1. 运行命令行启动(参考14.3.4节【boot】,38页)。

不过,DOS及Windows有某些缺陷,因此你可能不得不使用更复杂的指令。更多内容参考4.2.3节【DOS/Windows】,11页。

4.1.2. 链式载入一个OS

不支持多重启动,并且在GRUB中没有特殊支持的操作系统(存在对Linux,FreeBSD,NetBSD及OpenBSD的特殊支持)必须被链式载入,这涉及载入另一个启动载入器,然后在实模式中跳转至它。

链式载入器命令(参考14.3.6节【chainloader】,38页)用于这个目的。通常也需要载入某些GRUB模块来设定合适的根设备。综合起来,我们得到像这样结论,对于在第一个硬盘的第一个分区上的一个Windows系统:

menuentry"Windows" {

insmod chain

insmod ntfs

set root=(hd0,1)

chainloader +1

}

在具有多个硬盘的系统上,可能要求一个额外的变通方案。参考4.2.3节【DOS/Windows】,11页。

链式载入仅在PCBIOS及EFI平台上支持。

4.2. OS特定问题的一些告诫

在这里,我们描述关于几个操作系统的一些告诫。

4.2.1. GNU/Hurd

因为GNU/Hurd是多重启动兼容的,很容易启动它;对此这里没有什么特殊。但不要忘记你必须向内核指定一个根分区。

1.       设置GRUB的根设备为与GNU/Hurd的相同。命令search --file --set/boot/gnumach.gz或类似的命令可能可帮助你(参考14.3.40节【search】,44页)。

2.       像这样载入内核及模块:

grub> multiboot /boot/gnumach.gz root=device:hd0s1

grub> module /hurd/ext2fs.static ext2fs --readonly \

--multiboot-command-line=’${kernel-command-line}’ \

--host-priv-port=’${host-port}’ \

--device-master-port=’${device-port}’ \

--exec-server-task=’${exec-task}’ -T typed ‘${root}’ \

‘$(task-create)’ ‘$(task-resume)’

grub> module /lib/ld.so.1 exec /hurd/exec ‘$(exec-task=task-create)’

3.       最后,运行启动命令(参考14.3.4节【boot】,38页)。

4.2.2. GNU/Linux

从GRUB启动GNU/Linux相对简单,因为它有点类似于启动一个多重启动兼容OS。

1.       设置 GRUB的根设备为与GNU/Linux的相同。命令search --file --set /vmlinuz或类似的命令可能可帮助你(参考14.3.40节【search】,44页)。

2.       使用命令linux载入内核(参考14.3.24节【linux】,41页):

grub> linux /vmlinuz root=/dev/sda1

如果你需要指定某些内核参数,只要把它们附加到命令上。例如,把‘acpi’设置到‘off’,要这样做:

grub> linux /vmlinuz root=/dev/sda1 acpi=off

至于可用选项的完整信息,参考Linux源代码树中的文档。

在linux命令里,GRUB使用32位协议。在这个协议中某些BIOS服务,象APM或EDD不可用。在这种情况下,你需要使用linux16:

grub> linux16 /vmlinuz root=/dev/sda1 acpi=off

3.       如果你使用一个initrd,在linux后执行命令initrd(参考14.3.20节【initrd】,41页):

grub> initrd /initrd

如果你使用linux16,你需要使用initrd16:

grub> initrd16 /initrd

4.       最后,运行命令boot(参考14.3.4节【boot】,38页)。

注意:如果你使用一个initrd,并向内核指定‘mem=’选项,使得它使用少于真实大小的内存,你将也要向GRUB指定相同的内存大小。为了使GRUB知道这个大小,在载入内核之前,运行命令uppermem。更多内容参考14.3.45节【uppermem】,48页。

4.2.3. DOS/Windows

GRUB不能直接启动DOS或Windows,因此你必须链式载入它们(参考4.1.2节【链式载入】,7页)。不过,它们的启动载入器有某些关键性的缺陷,因此仅链式载入它们可能不能工作。为了对付这个问题,GRUB为你提供了两个协助函数。

如果你已经在第一个硬盘以外安装了DOS(或Windows),你必须使用硬盘交换技术,因为OS只能从第一个硬启动。GRUB所使用的变通方案是命令drivemap(参考14.3.12节【drivemap】,39页),象这样:

drivemap -s (hd0) (hd1)

这在你的第一个及第二个硬盘间执行一个虚拟交换。

注意:仅当DOS(或Windows)使用BIOS来访问交换硬盘时,这才起作用。如果OS为硬盘使用一个特殊的驱动器,这可能不能工作。

如果你在硬盘上安装了多个DOS或Windows,会引起另一个问题,因为如果有多个用于DOS/Windows的主分区,会引起混淆。毫无疑问你应该避免这样做,不过如果你想这样做,有一个解决方案。使用分区隐藏/解隐藏技术。

如果GRUB隐藏了一个DOS(或Windows)分区(参考14.3.32节【parttool】,43页),DOS(或Windows)将忽略这个分区。如果GRUB解隐藏一个DOS(或Windows)分区,DOS(或Windows)将检测到这个分区。这样,如果你已经在第一个硬盘的第一、第二分区上安装了DOS(或Windows),并且希望从第一个分区上启动,像下面那样做:

parttool (hd0,1) hidden-

parttool (hd0,2) hidden+

set root=(hd0,1)

chainloader +1

parttool ${root} boot+

boot

 


  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值