Linux grub(Grand Unified Bootloader)教程
如果没有引导加载程序的帮助,将不可能引导/启动Linux或者任何其他操作系统。引导加载程序在使系统进入运行状态方面起着重要作用。事实上,引导加载程序是第一个运行的程序,当计算机启动时。
引导加载程序就是将控制权转移到操作系统内核的人。Linux引导过程需要特别注意,并将在这方面做一个专门的帖子。在这篇文章中,我们将集中讨论GRUB(grandunifiedbootloader),这是许多Linux发行版的默认引导加载程序。
GRUB是erichboleyn所做的故障排除的结果,目的是用一个微内核引导gnuhurd(由GNU设计的操作系统,作为UNIX的免费替代品)。Yoshinori K.Okuji进行了进一步的工作来推进最初的GRUB2,并被称为GRUB2.
GRUB的旧版本(在grub2之前)现在称为GRUBLegacy。
为什么gnugrub是许多Linux发行版的默认引导加载程序?
与以前的引导加载程序相比,Grub有几个另外的优势,还有许多“专有的引导加载程序”。
Grub可以用来加载,几乎所有的操作系统都可以,借助一个叫做chain loading的函数。
Grub不需要操作系统内核在硬盘中的确切物理位置。它只需要硬盘号(比如第一个硬盘,第二个硬盘),分区号,以及内核的文件名。因为GRUB理解内核的格式。
我们可以通过GRUB命令行修改引导选项,比如内核参数及其在引导时的位置。
GRUB命令和图形界面如何协同工作?
Grub有一个很棒的图形界面,用户可以从菜单中选择所需的操作系统。
图形界面的工作方式与命令行界面完全相同。唯一的区别是,预先配置的配置文件包含指定硬盘和内核位置的命令(如果使用命令行界面,则必须手动键入)
学习Grub命令将是一个另外的优势,因为它将解决大多数引导问题等。
Grub Leagacy和Grub-2有什么区别?
以前的幼虫Leagacy和新的Grub-2之间有一些显著的区别。
以前在Grub传统的硬盘分区号中,用于从0、1、2…等开始,但在Grub-2中,它从1、2、3…等开始分区命名约定。
它现在识别出更多类似ext-4的新文件系统
在grub镜像文件中没有更多的stage-1、stage-1.5等,比如grub Legacy
Grub-2已经开始使用可以根据需要加载的模块。
使用GRUB的唯一标识可以确定一个唯一的硬盘分区
配置文件名为dig掘.cfg(不要了菜单.lst& grub.config文件)
与grub遗留配置文件相比,新的grub-2配置文件是高度可配置的。
GRUB-2还支持EFI(可扩展固件接口)
Grub设备命名约定
Grub设备命名约定与操作系统分区命名约定完全不同。在使用grub时要记住这一点。
下表将有助于重新组织grub设备命名约定。
如何在软盘或者分区上安装grub?
当我们使用已经安装的linux发行版时,默认情况下grub包将安装在系统上。
将介绍使用grub legacy的示例。因为任何格式为0.9x的grub版本号现在都是grublegacy(请注意,grublegacy不再处于活动开发阶段)
在这个例子中,我将研究一个RedHatEnterpriseLinux5.
<span style="font-size:16px;">[root@localhost ~]# rpm -qa | grep grub grub-0.97-13.5 [root@localhost ~]#
上面显示的包还将为我们提供一个名为grub install的命令。
<span style="font-size:16px;">[root@localhost ~]# whereis grub-install grub-install: /sbin/grub-install /usr/share/man/man8/grub-install.8.gz [root@localhost ~]# rpm -qf /sbin/grub-install grub-0.97-13.5
从上面的命令结果中可以清楚地看到grub install命令来自grub-0.97-13.5包
我们可以在grub install命令的帮助下,在所需分区上安装grub,如下所示。
<span style="font-size:16px;">[root@localhost ~]# grub-install /dev/sda Installation finished. No error reported. This is the contents of the device map /boot/grub/device.map. Check if this is correct or not. If any of the lines is incorrect, fix it and re-run the script `grub-install'. # this device map was generated by anaconda (hd0) /dev/sda [root@localhost ~]#
在上面的命令中,它将在硬盘/dev/sda的MBR中安装grub。
上面的命令结果告诉我们一个需要理解的重要事实。它告诉我们,有一个设备映射文件,并要求我们检查并确认该文件是否正确。
每当你安装GRUB,在你的任何一个分区上,它都会被安装,镜像被放在该分区的“boot”目录下。
如果你想在默认的“boot”之外的目录下安装grub,你需要用命令行参数指定引导目录到 grub install命令。
假设我们想要在一个外部硬盘上安装grub,并且当前安装在/mydisk下。让我们看看怎么做。
<span style="font-size:16px;"><span class="geshifilter"><code class="text geshifilter-text">[root@localhost ~]# grub-install --root-directory=/mydisk/grub//dev/sdb
从grub命令行启动操作系统
从grub命令行启动操作系统非常简单。在输入引导命令之前,只需指定内核和initrd镜像所在的分区。
在grub菜单选择区按 “c”。我们将看到一个 grub>grub控制台,如下所示。这不是Linux控制台,而是grub控制台,只接受grub特定的命令。
我们可以使用相同的技术引导系统,但grub配置错误或者损坏。
grub中什么是链式加载?
我们可能已经注意到grub能够加载不同的操作系统。例如,我们甚至可以在grub的帮助下加载windows操作系统(事实上,如果我们在windows之后安装Linux,那么安装程序会自动为我们完成所有操作)。
Grub通过链式加载实现了加载多个甚至专有操作系统的能力。
链加载是grub使用的方法,在这种方法中,它将引导操作系统的控制权转移到其本机引导加载程序上。
在windows之后安装Linux时,GRUB stage-1覆盖MBR(在删除windows引导加载程序并将其放入windows C分区的卷引导记录之后)。
如果在grub引导屏幕期间没有按下任何键,则 “hiddenmenu”将保持菜单隐藏(默认情况下,将引导默认操作系统而不显示菜单)