The Wayback Machine - https://web.archive.org/web/20221028220509/https://baike.sogou.com/kexue/d10008.htm

GNU GRUB

编辑

GNU GRUB(是GNUGRand Unified Bootloader的缩写,通常称为GRUB)是来自GNU项目的引导加载程序包。GRUB是自由软件基金会多引导规范的参考实例,它为用户提供了引导安装在计算机上的多个操作系统之一或选择特定操作系统分区上可用的特定内核配置。

GNU GRUB是由一个名为Grand Unified Bootloader(Grand Unified Theory的一个版本)的包中开发出来的。它主要用于Unix类的系统。GUN操作系统正如大多数Linux发行版和从Solaris 10 1/06开始发行的x86系统上的Solaris操作系统一样,均是采用GNU GRUB作为其引导加载程序的。

1 操作编辑

MBR分区硬盘上的GRUB2;阶段1(.boot.img)可以选择性地写入其中一个分区引导扇区

GPT分区硬盘上的GRUB2,通过BIOS固件或者UEFI兼容模式启动

1.1 引导

计算机开机时,BIOS系统会找到已配置的主引导设备(通常是计算机的硬盘),并从主引导记录(MBR)加载和执行初始引导程序。MBR是硬盘偏移量为零的第一个扇区(扇区计数从零开始)。在很长的一段时间内,一个扇区的大小一直是512字节,但自2009年以来,就出现了被称作高级格式磁盘的扇区大小为4096字节的硬盘。截至2013年10月,通过使用512e仿真,仍可在512字节扇区中访问此类硬盘。[1]

传统MBR分区表最多支持四个分区并占用64个字节。加上可选的磁盘名 (4个字节)和磁盘时间戳(6个字节),引导加载程序的机器代码可以使用434到446个字节。尽管对于非常简单的引导加载程序来说这幺小的空间就已足够[2],但它的大小还不足以支持复杂和多文件系统的引导加载程序、菜单驱动的引导选择等。因此,占用较大空间的引导加载程序被分割成多个部分,其中最小的部分适合此环境并驻留在MBR中,而较大的部分将被存储在其他位置(例如,存储在MBR和第一分区之间的空扇区中),并由引导加载程序的MBR代码调用。

大多数情况下,操作系统的内核映像驻留在恰当的文件系统上,但是文件系统的概念对于BIOS来说是未知的。因此,在BIOS系统中,引导加载程序的职责是访问这些文件的内容,因此可以将其加载到RAM中并执行。

一种可能的方法来引导加载程序加载内核映像是直接访问硬盘扇区,而不涉及底层文件系统。通常,需要一个额外的以映射或映射文件的形式的间接级别,该文件是包含内核映像占用的物理扇区列表的辅助文件。由于安装新的内核映像、文件系统碎片整理等原因,每次内核映像更改其在磁盘上的物理位置时,都需要更新这些映射。此外,如果映射需要改变其物理位置,它们的位置需要在引导加载程序的MBR代码中更新,以便扇区间接机制将继续工作。这种模式不仅繁琐,而且为防止系统更新过程中出现问题,还需要对系统进行手动修复。[3]

另一种方法是让引导加载程序知道底层文件系统,以便使用它们的实际文件路径来配置和访问内核映像。这需要引导加载程序包含每个受支持文件系统的驱动程序,以便引导加载程序自身能够理解和访问内核映像。这种方法消除了硬盘扇区的硬编码位置需求和map文件,并且在内核映像被添加或移动后不需要对MBR进行更新。引导加载程序的配置存储在常规文件中,也可以通过文件系统感知的方式访问,以便在实际引导任何内核映像之前获得引导配置。因此,大大降低了各种系统更新期间出错的可能性。然而,这种引导加载程序增加了内部复杂性,甚至占用了更大的空间。[3]

GNU GRUB使用通过理解底层文件系统的方法。引导加载程序本身被分成多个阶段,允许其本身适应的MBR引导方案。

GRUB的两个主要版本是通用的: GRUB版本1,称为GRUB legacy,仅在较旧版的Linux发行版中流行,现在依然支持和使用其中一些其他版本,例如CentOS 5。GRUB 2是从头开始编写的,旨在取代它的前身,现在被大多数Linux发行版所使用。

1.2 版本1 (GRUBLegacy)

GRUB v1的菜单目录(作为Ubuntu8.04安装程序的一部分运行)

主引导记录(MBR)通常包含GRUB阶段1,或者可以包含标准的MBR实现,该实现从活动分区的引导扇区链接中加载GRUB阶段1。给定的引导扇区尺寸很小 (512字节),第1阶段只能通过从磁盘开始附近的固定位置(在其第一个1024个柱面内)加载几个磁盘扇区来加载GRUB的下一阶段。

阶段1可以直接加载阶段2,但通常设置为加载阶段1.5,阶段1.5位于紧接MBR之后、第一个分区之前的硬盘前30 KiB。如果该空间不可用(异常分区表、特殊磁盘驱动程序、GPT或LVM磁盘),1.5级的安装将失败。阶段1.5映像包含文件系统驱动程序,使其能够从文件系统中的任何已知位置直接加载阶段2(例如从/boot/grub)。第2阶段将加载缺省配置文件和任何其他需要的模块。

1.3 版本2 (GRUB 2)

GRUB 2 - MBR与GPT分区的比较和可视化的引导顺序(在使用BIOS固件的系统上)。

使用BIOS固件启动系统

  • 第一阶段:引导。boot.img被写入主引导记录的前440字节(扇区0中的MBR),或者也可选择写入分区的引导扇区(PBR / VBR)。它通过一个64位的LBA地址来对diskboot.img进行寻址,因此它可以从MBR的2千兆位限制之上加载。实际扇区号由grub-install编写。
  • 第二阶段:diskboot.img是core.img的第一个扇区 (在Grub Legacy中称为1.5阶段),其唯一目的是加载core.img的其余部分由LBA扇区号标识,也由grub-install编写。
  • 在MBR分区磁盘上:core.img存储在MBR和第一个分区之间的空扇区中(如果该扇区可用)。最近的操作系统建议此处有1 MiB的间隙用于对齐(2047*512字节或255 * 4KiB扇区)。这一间隙过去是62个扇区(32个KiB),提醒我们Bios在1998年之前使用的C/H/S寻址的扇区数量限制,因此core.img被设计为小于32个KiB。
  • 在GPT分区磁盘上:分区不限于4个,因此core.img被以它自己的大小写入(1 MiB),无文件系统的BIOS引导分区。
  • 第三阶段:core.img进入32位保护模式,对自己进行解压缩(grub的内核和要到达的文件系统模块/引导/grub),然后从grub-install配置的分区加载/boot/grub/<platform>/normal.mod。如果分区索引发生了变化,Grub将无法找到normal.mod,并向用户显示Grub救援提示,用户“可以”在该提示中找到并加载normal.mod或linux内核。
  • /boot/grub目录可以位于任何分区上(grub可以读取许多文件系统,包括Ntfs)。取决于它是如何安装的,它要么在发行版的根分区中,要么在单独的/boot 分区中。
  • 第四阶段:normal.mod(相当于Grub Legacy中的第二阶段)解析/boot/grub/grub.cfg,可选地加载模块(例如图形用户界面)并显示菜单。

使用UEFI固件启动系统

  • 自大约2012以来在主板上很常见。
  • /efi/<distro>/grubx64.efi作为文件安装在EFI系统分区中,并由固件直接引导,而不需要0扇区的boot.img进行引导。
  • /boot/grub/也可以安装在EFI系统分区上。

启动后

Grub提供了一个菜单,用户可以从grub安装的操作系统中进行选择。Grub可以配置为在用户定义的超时后自动加载指定的操作系统。如果超时设置为零秒,在计算机启动时按住⇧Shift键可以访问启动菜单。[4]

在操作系统选择菜单中,GRUB接受几个命令:

  • 通过按e这个按键,可以在操作系统启动前编辑所选菜单项的内核参数。在GRUB中这样做的原因(即不在已经启动的系统中编辑参数)可能是紧急情况:系统无法启动。使用内核参数行,可以为内核指定一个要禁用(黑名单)的模块。如果特定内核模块损坏,采用这一方法从而阻止启动。例如,要将内核模块nvidia-current列入黑名单,可以在内核参数的末尾添加modprobe .blacklist=nvidia-current。
  • 通过按c这个按键,用户进入GRUB命令行。GRUB命令行不是一个普通的Linux命令执行方法,比如bash,它只接受特定于GRUB的命令,这些命令由不同的Linux发行版记录。[5]

一旦选择了引导选项,GRUB就会将所选内核加载到内存中,并将控制权交给内核。或者,GRUB可以使用链加载将引导过程的控制权传递给另一个引导加载程序。这是用于加载不支持多引导规范或GRUB不直接支持的操作系统的方法。

2 历史编辑

GRUB最初是由埃里希·博林作为引导自由软件基金会开发的操作系统GNU/Hurd工作的一部分开发的。[6]1999年,戈登·马齐吉特(Gordon Matzigkeit)和吉诺里·奥吉(Yoshinori K. Okuji)将GRUB制作成GNU项目的官方软件包,并向公众开放开发过程。[6]截至2014年,大多数Linux发行版都采用了GNU GRUB 2,以及索尼的PlayStation 4等其他系统。[7]

2.1 发展

GRUB版本1(也称为“GRUB Legacy”)不再处于开发阶段,正在被逐步淘汰。[8]GNU GRUB开发人员已经将他们的焦点转移到GRUB 2上[9],这是一个完整的重写,目标包括使GNU GRUB更干净、更健壮、更轻便和更强大。GRUB 2以PUPA的名字开始。PUPA得到日本信息技术促进机构的支持。PUPA在2002年左右被集成到GRUB 2开发中,当时GRUB版本0.9x被重命名为GRUB Legacy。

GRUB 2项目的一些目标包括支持非x86平台、国际化和本地化、非ASCII字符、动态模块、内存管理、脚本迷你语言、将特定于平台(x86)的代码迁移到特定于平台的模块以及面向对象的框架。GNU GRUB版于2012年6月26日正式发布。[10][11]

三个最广泛使用的Linux发行版使用GRUB 2作为它们的主流引导加载程序。[12][13][14] Ubuntu在2009年10月的9.10版本中采用它作为默认的引导加载程序。Fedora紧随其后,于2011年11月发布了Fedora 16。[15]OpenSUSE在2012年9月发布的12.2版本中采用GRUB 2作为默认的引导加载程序。在Solaris 11.1发行版中,Solaris还在x86平台上采用了GRUB 2。[16]

2015年末,发现并迅速修复了按下退格键28次可以绕过登录密码的漏洞。[17][18]

2.2 变体

GNU GRUB是免费的开源软件,因此已经创建了几个变体。一些值得注意的变体,还没有合并到GRUB主线中:

  • OpenSolaris包括一个经过修改的GRUB Legacy,它支持BSD磁盘标签、自动64位内核选择和从ZFS引导(具有压缩和多引导环境)。[19][20]
  • 谷歌代码2008年夏季有一个项目支持GRUBLegacy从ext4格式分区引导。[21]
  • 音节项目制作了GRUB的一个修改版本,以从其AtheOS文件系统中加载系统。[22]
  • Trusted GRUB通过使用可信平台模块实现系统完整性和引导过程安全性的验证扩展了GRUB。[23]
  • 英特尔BIOS实现测试套件(BITS)为测试BIOS,特别是英特尔处理器的初始化、硬件和技术提供了一个GRUB环境。BITS支持通过Python编写脚本,并包含Python APIs来访问硬件平台的各种底层功能,包括ACPI、CPU和芯片组寄存器、PCI和PCI Express。[24]
  • GRUB4DOS是一个现在已经不存在的GRUB legacy分支,它通过将除GRLDR配置之外的所有内容放在一个映像文件中来改善在DOS和Microsoft Windows 上的安装体验。它可以由windows引导管理器加载。[25][26]

3 公用事业编辑

3.1 GRUB配置工具

StartUp-Manager, 一个用于配置GRUB的程序

各种发行版使用的设置工具通常包括设置GRUB的模块。例如,SUSE Linux和OpenSUSE发行版上的YaST2和Fedora/RHEL发行版上的Anaconda。启动管理器和GRUB定制器是基于Debian的发行版的图形配置编辑器。

GRUB 2有KDE控制模块。[27][28]

GRLDR ICE是一个用于修改GRUB4DOS的grldr文件的默认配置的微小工具。[29]

3.2 引导修复实用程序

Super Grub2磁盘/帮助您引导到大多数操作系统,即使您无法通过正常方式引导到它。它是在

GRUB 定制器
Grub2的bash式脚本中构建的。一个20MB的ISO图像,可以从USB或CD启动。 

引导修复是一个简单的图形工具,用于从GRUB和 Microsoft Windows 引导加载程序的频繁引导相关问题中恢复。该应用程序在GNU GPL许可下可用。引导修复可以修复多个Linux发行版上的GRUB,包括但不限于Debian、Ubuntu、Mint、Fedora、openSUSE和Arch Linux。

3.3 Windows安装程序

Grub2Win是一个Windows开源软件包。它允许GNU Grub从一个窗口目录启动。安装程序将GNU Grub版安装到NTFS分区。然后使用一个Windows GUI应用程序定制Grub引导菜单、主题、UEFI引导顺序、脚本等。UEFI和legacy系统都支持所有GNU Grub脚本和命令。Grub2Win可以为Windows的multiboot、Ubuntu、openSuse、Fedora和许多其他Linux发行版配置Grub。它可以在SourceForge的GNUGPL许可证下免费获得。

替代启动管理器Grub的优势在于广泛的支持平台、文件系统、操作系统,这使得它成为发行版和嵌入式系统的默认选择。

但是,也有针对终端用户的引导管理器提供更友好的用户体验、图形操作系统选择器和更简单的配置:

  • rEFInd - Macintosh风格的图形引导管理器,仅适用于基于UEFI的计算机(不支持BIOS)。
  • CloverEFI-Macinatosh风格的图形引导管理器适用于基于BIOS和UEFI的计算机。用TianoCore项目中, 经过大量修改的模拟UEFI仿真UEFI。即使在基本输入输出系统上,也需要一个Fat格式的分区。作为一个好处,它在分区引导扇区中有一个基本的文件系统驱动程序,避免了Grub第二、第三阶段的脆性和臭名昭著的Grub救援提示。用户界面看起来与rEFInd相似:两者都继承自废弃的引导管理器rEFIt。

非图形替代,配置更简单:

  • 系统引导灯,仅带有UEFI基于文本的操作系统选择器菜单的引导管理器。

3.4 操作方法和故障排除

发布维基有许多常见问题和自定义设置的解决方案,可能对您有所帮助:

  • ArchLinux /GRUB
  • Ubuntu /Grub2 (另请参见底部的链接)
  • Fedora /GRUB_2
  • Gentoo /GRUB2
  • Grub2 theme tutorial

3.5 文件

  • Grub manual -最详细的文档,包括所有命令
  • Official website
  • Grub wiki archived in 2010

3.6 介绍性文章

  • Boot with GRUB,2001年4月的一篇文章 Linux杂志

3.7 技术细节

  • Booting Linux on x86 using Grub2 -深度文章
  • 统一可扩展固件接口 (UEFI固件,自2012年起通用)
  • GUID分区表 (GPT) -处理大于2的硬盘 TiB 和4个以上的分区
  • 主引导记录 与...一起使用 BIOS固件 (大约在2012年之前的主板)
  • BIOS Boot Specification Version 1.01 (January 11, 1996) -很难找到

参考文献

  • [1]

    ^Smith, Ryan (December 18, 2009). "Western Digital's Advanced Format: The 4K Sector Transition Begins". AnandTech. Retrieved October 10, 2013..

  • [2]

    ^"mbldr (Master Boot LoaDeR)". mbldr.SourceForge.net. 2009. Retrieved October 10, 2013..

  • [3]

    ^"Booting and Boot Managers". SuSE. Retrieved 2013-10-10..

  • [4]

    ^Hoffman, Chris (September 22, 2014). "How to Configure the GRUB2 Boot Loader's Settings". HowToGeek.com..

  • [5]

    ^"GNU GRUB documentation"..

  • [6]

    ^GRUB Manual – 1.2 Grub History. Gnu.org (2012-06-23). Retrieved on 2012-12-01..

  • [7]

    ^"PS4 runs Orbis OS, a modified version of FreeBSD that's similar to Linux". extremetech.com. 2013-06-24. Retrieved 2013-10-23..

  • [8]

    ^GNU GRUB – GRUB Legacy. Gnu.org. Retrieved on 2012-12-01..

  • [9]

    ^"GNU GRUB – GRUB 2". Archived from the original on June 7, 2008. Retrieved April 18, 2014.CS1 maint: BOT: original-url status unknown (link)..

  • [10]

    ^Serbinenko, Vladimir (June 28, 2012). "GRUB 2.00 released". grub-devel (Mailing list). Retrieved December 1, 2012..

  • [11]

    ^Larabel, Michael. "GRUB 2.00 Boot-Loader Officially Released". Phoronix.com. Retrieved 28 June 2012..

  • [12]

    ^Haddon, Tom (January 26, 2012). "An Introduction to Ubuntu". WebJunction. Archived from the original on October 28, 2012. Retrieved September 21, 2012..

  • [13]

    ^Janssen, Cory. "What is Red Hat Enterprise Linux (RHEL)?". Technopedia. Retrieved 21 September 2012..

  • [14]

    ^Varghese, Sam (2012-09-20). "SUSE chief lists progress since privatisation". Retrieved 21 September 2012..

  • [15]

    ^GRUB 2. FedoraProject. Retrieved on 2012-12-01..

  • [16]

    ^Solaris 11.1. Oracle Retrieved 2015-03-19..

  • [17]

    ^Khandelwal, Swati (December 16, 2015). "You can Hack into a Linux Computer just by pressing 'Backspace' 28 times". thehackernews.com..

  • [18]

    ^Marco and, Hector; Ripoll, Ismael (December 2015). "Back to 28: Grub2 Authentication 0-Day"..

  • [19]

    ^x86: Modifying Boot Behavior by Editing the GRUB Menu at Boot Time Archived 7月 19, 2011 at the Wayback Machine, Modifying Solaris Boot Behavior on x86 Based Systems (Task Map) – System Administration Guide: Basic Administration.

  • [20]

    ^x86: Supported GRUB Implementations Archived 10月 21, 2009 at the Wayback Machine, (System Administration Guide: Basic Administration) – Sun Microsystems.

  • [21]

    ^>Peng, Tao. "Grub4ext4". Retrieved June 13, 2017..

  • [22]

    ^2.3 Why does Syllable have its own version of GRUB? Archived 1月 7, 2011 at the Wayback Machine, Syllable Documentation.

  • [23]

    ^"TrustedGRUB project". Sourceforge.net. Retrieved November 18, 2014..

  • [24]

    ^BIOS Implementation Test Suite, Official BITS website.

  • [25]

    ^"grub4dos". Google Site. Retrieved 7 April 2019..

  • [26]

    ^"GRUB for DOS Introduction". grub4dos.sourceforge.net. 2007. Archived from the original on 2 June 2008. Retrieved 7 April 2019..

  • [27]

    ^GRUB2 Bootloader Editor. Kde-apps.org (2012-06-18). Retrieved on 2012-12-01..

  • [28]

    ^"Grub2 KCM". KDE-Apps.org. Retrieved 2011-01-27..

  • [29]

    ^"Grub4dos tutorial". Narod.ru..

阅读 1179
版本记录
  • 暂无