Linux操作系统的启动过程中,GRUB(GNU GRand Unified Bootloader)扮演着极其重要的角色。/boot/grub/目录中包含了GRUB启动所需要的一切配置文件,对于Linux系统管理员来说,熟悉这些文件的内容和作用是非常有必要的。
下面我将对/boot/grub/目录进行详细分析,包括每个文件的作用和示例说明。
具体文件分析
menu.lst / grub.conf
这个文件是GRUB启动时所使用的主配置文件,同时也是最重要的一个文件。
menu.lst
是老版本GRUB的默认配置文件名,一般情况下仅存在于早期的Linux发行版中;grub.conf
是新版本GRUB的默认配置文件名,包括现在常用的GRUB2版。
menu.lst / grub.conf示例:
以下是一个简短的grub.conf
示例:
# grub.conf for CentOS 7
default=0
timeout=5
title CentOS (3.10.0-229.11.1.el7.x86_64)
root (hd0,0)
kernel /vmlinuz-3.10.0-229.11.1.el7.x86_64 ro root=/dev/mapper/centos-root rd.md=0 rd.dm=0
title CentOS (3.10.0-123.4.2.el7.x86_64)
root (hd0,0)
kernel /vmlinuz-3.10.0-123.4.2.el7.x86_64 ro root=/dev/mapper/centos-root
title Windows 7
rootnoverify (hd0,1)
chainloader +1
以上示例文件中:
default=0
表示默认使用第一项;timeout=5
表示在5秒钟内没有人工干预,GRUB将自动引导第一项;title
后面的文字描述就是菜单栏的文本描述,可以自己设置;root
用来指定内核位于的硬盘位置,(hd0,0)
表示第一个硬盘的第一个分区,后续如果想要在分区中查找文件,就可以从这个根目录开始。注意多数Linux机子第一块硬盘是sda,而不是hda;kernel
指定内核文件的路径和启动参数。在此例中,两条拥有不同内核版本的kernel语句都指向了相同的root设备;chainloader
命令用来加载另一个操作系统,需要成功引导到Windows Loader Code。
grub.cfg
这个文件是由GRUB2自动生成的,并读取所有在其他文件夹中的配置文件。
在GRUB启动引导进程中,grub.cfg
文件将作为主要的配置文件而存在,也是GRUB2的重要组成部分。所有可启动的操作系统条目都需要在grub.cfg
文件中手工定义。选择grub.cfg
自动生成其他文件的方式,具有高度灵活性。修改grub.cfg
会对内存设置之类的产生深远的影响。
grub.cfg示例:
以下是一个简短的grub.cfg
示例:
# Automatically generated file by grub2-mkconfig command
#
# DO NOT EDIT THIS FILE
set default="0"
set timeout="5"
insmod ext2
insmod part_msdos
insmod gzio
insmod part_gpt
insmod btrfs
# code for menu entry of CentOS Linux 7 (Core) failsafe mode
menuentry 'CentOS Linux 7 (Core) failsafe mode' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-514.16.1.el7.x86_64-advanced-c16e6bf8-db6f-42fb-813b-9dde0de7fe67' {
load_video
insmod gzio
insmod part_msdos
insmod ext2
set root='hd0,msdos1'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 c16e6bf8-db6f-42fb-813b-9dde0de7fe67
else
search --no-floppy --fs-uuid --set=root c16e6bf8-db6f-42fb-813b-9dde0de7fe67
fi
echo 'Loading Linux 3.10.0-514.16.1.el7.x86_64 ...'
linux /vmlinuz-3.10.0-514.16.1.el7.x86_64 root=/dev/mapper/centos-root ro single
echo 'Loading initial ramdisk ...'
initrd /initramfs-3.10.0-514.16.1.el7.x86_64.img
}
以上示例文件中:
set default
指定默认选项,默认值为“0”,在此例中,如果您没有选择任何操作系统,第一个操作系统会被启动;set timeout
指定依赖应用程序的初始化时间。如果您没有按钮或手工选择任何操作系统,将在超时时间之后启动默认操作系统;insmod
指定要加载的模块。在此例中,有insmod gzio
指令加载GZIP压缩的交换分区,insmod part_msdos
加载msdos分区,等等;menuentry
是定制的GRUB2条目的标准方法。该选项仅显示文本并包含一些信息(例如菜单编号、菜单提示等),但不执行任何操作。以下是检查是否为GRUB2菜单入口的示例语句:if [ "${grub_platform}" == "pc" ]; then
。load_video
这个指令用于为GRUB2安装效果加载视频库;search
指令用于在引导启动时搜索指定设备的句柄;linux
指令用于指定Linux内核的位置和所需的其他参数;initrd
是压缩的InitRAMFS(芯片)(InitRD)文件,包含Linux需要使用的主要文件和设备驱动程序。这个文件是由GRUB2加载进入内存的。
device.map
该文件是一个映射规则表,它将磁盘/设备名称映射到GRUB所用的名称。
虽然这个文件的存在是可选的,但在多硬盘系统中方便多了(例如RAID和USB设备等)。
device.map示例:
以下是一个简短的device.map
示例:
(fd0) /dev/fd0
(hd0) /dev/sda
(hd1) /dev/sdb
以上示例文件中:
(fd0)
是软盘设备;(hd0)
是第一个硬盘设备,对应的设备文件为/dev/sda;(hd1)
则是第二个硬盘设备,对应的设备文件为/dev/sdb。
这些设备名称不需要与现有设备名称完全相同,因为它们将被重新映射到GRUB定义的名称。这对于备份和崩溃恢复非常有用。
grubenv
GRUB2版本启动时会加载这个文件,这个文件是用于持久保存GRUB2环境变量。
GRUB2也称为“可编辑可渐进可恢复的超级UEFI启动管理器”。GRUB2是新的UEFI最佳选择,并使传统BIOS下的启动也变得非常易于管理。
grubenv示例:
以下是一个简短的grubenv
示例:
saved_entry=CentOS Linux (3.10.0-229.el7.x86_64) 7 (Core)
boot_success_record=0
boot_indication_record=0
以上示例文件中:
saved_entry
记录上次引导时选择的操作系统版本;boot_success_record
和boot_indication_record
记录当前的引导状态信息,以及与电源有关的信息。如果系统异常关机,它通常可以检测到这些信息并恢复操作。这是GRUB2最为人所知的特性之一,也是很多Linux管理员忙碌下进行紧急修复工作时必须了解的信息之一。需要注意的是,grubenv需要GRUB2才能使用,不支持旧版本的GRUB。
fonts/目录
GRUB使用的字体放在这个目录中。比较常用的字体有unicode和bitmap两种。
其中,Bitmap文件
是直接定义字符字形的图像文件。在字体加载之前,GRUB2将2个或更多点字合在一起。TrueType
或OpenType字体
以*.ttf
或*.otf
为扩展名存储,这些字体用于屏幕上显示更清晰的文字。
fonts/目录示例:
以下是一个简短的fonts/
目录示例:
10.pf2
lucida_mono_ bold_18.pf2
unicode.pf2
以上示例文件中:
10.pf2
是一个11像素大小的字体;lucida_mono_bold18.pf2
是粗体Lucida字族18点字体;unicode.pf2
是支持Unicode字符集的字体(两倍宽和高的14点字)。
grub.cfg.example和grub.conf.example
这两个文件是示范文件,其目的是为GRUB菜单文件的编写提供便利。
grub.cfg.example和grub.conf.example示例:
以下是一个简短的grub.cfg.example
示例:
# This is a sample config file that contains examples of how to use
# grub2's functionality beyond just the booting of an OS.
# This file is sourced by /etc/grub.d/10_linux, /etc/grub.d/10_lupin
# and /etc/grub.d/40_custom. These files will each "source" the script
# configuration contained herein.
# You can also add your own entries to the Grub menu by using the custom
# file, /etc/grub.d/40_custom. Entries that you add can be placed under
# the following stub comment:
# ### BEGIN /etc/grub.d/40_custom ###
# and follow these guidlines:
# - Entries may be static, such as a kernel image or a system
# utility. The kernel must be uncompressed, and if it is a bzImage,
# It must be extracted from the archive
# - Entries may load an arbitrary file. Load the file as normal.
# - Entries may execute a command when selected.
# - Some entries may require modification above and beyond the
# guidelines. See the grub2 info manual for capture more about this.
# - Entries are numbered from 0, and do not have to be in sequential
# order.
# - Some examples to get you started:
以上示例文件中,说明了如何使用grub.cfg
来增强GRUB2的功能,以及如何创建自定义菜单。
grub.conf.example也是类似的,说明文件基本相同,只是文件名有所不同。
总结
现在您已经了解了Linux /boot/grub/目录的分析攻略,了解了在该目录中存在哪些文件,以及这些文件的作用和示例。对于Linux管理员来说,熟悉这些文件的内容和作用是非常有必要的。
同时,值得注意的是,这个目录中的文件和内容有可能因Linux发行版的差异有所不同。但除非有明确的理由不建议修改任何配置文件。在有需要时,应该详细阅读文件注释,以免错误修改导致系统无法启动。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Linux /boot/grub/目录分析 - Python技术站