首页 > *nix技术 > GRUB2简介及相关

GRUB2简介及相关

2013年7月27日 发表评论 阅读评论 405 次浏览

根据GRUB官方网站上的介绍,GNU GRUB是一个多操作系统启动程序,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。
GRUB应用很广,但由于之前的GRUB旧版本有各种缺陷而已逐步被重新设计的GRUB2所替代。GRUB2是Grub的第二版,它对GRUB的接口进行了完整的重写。基于PUPA项目的研究,GRUB2按模块化设计而更方便扩展。
下面列出了GRUB2的一些改进特性:
具有图形化界面,支持主题
模块化加载
夸平台的兼容性
支持脚本
自定义的启动项目定义
修改分区命名

通过使用如下命令可以查看当前系统使用的是哪个版本的GRUB:

lenky@lenky-Inspiron-545s:~$ grub-install -v
grub-install (GRUB) 2.00-13ubuntu3

采用GRUB2作为系统启动引导程序后,对系统启动配置项的修改就不再只是通过vi编辑对应配置文件即可,而必须按照GRUB2的规则去做。

GRUB2的相关文件分布在三个位置(主要以Ubuntu 13.04为例,在其它操作系统下,目录是否有变动暂不得而知,后面描述均以Ubuntu 13.04为例):
1,/boot/grub/grub.cfg:这个文件和旧版本GRUB的menu.lst类似,但grub.cfg却不允许(其实只是不建议,你非要改,那也没法)被手动修改,因为它只是配置的结果内容文件,真正的配置在下面的两个目录/文件里,也就是说,对grub.cfg所做的直接修改是不可靠的,它可能不知何时(比如系统内核或GRUB升级等)就被下面两个目录/文件的配置给覆盖而丢失了。
2,/etc/grub.d/:包含GRUB2的脚本,一旦GRUB2的相关命令被执行,就会调用这些脚本而创建新生成的grub.cfg。
3,/etc/default/grub:包含GRUB2菜单的相关设置,GRUB2脚本会读取这些设置来生成对应的grub.cfg。

可以看到,对于GRUB2而言,要修改系统启动配置项,推荐的做法是修改/etc/grub.d/脚本或/etc/default/grub设置,然后执行update-grub/update-grub2更新/boot/grub/grub.cfg。

/boot/grub/grub.cfg和/etc/default/grub是两个文件,而/etc/grub.d/是一个包含多个脚本的目录:

lenky@lenky-Inspiron-545s:~$ ls -F /boot/grub/grub.cfg
/boot/grub/grub.cfg
lenky@lenky-Inspiron-545s:~$ ls -F /etc/default/grub
/etc/default/grub
lenky@lenky-Inspiron-545s:~$ ls -F /etc/grub.d/
00_header*        10_linux*      20_memtest86+*  30_uefi-firmware*  41_custom*
05_debian_theme*  20_linux_xen*  30_os-prober*   40_custom*         README

先来看/etc/grub.d/目录下的各个脚本:
00_header:用于读取/etc/default/grub里的相关设置,比如超时时间、默认启动项等,转换为/boot/grub/grub.cfg里的相关最终启动配置。
05_debian_theme:用于设置GRUB启动时菜单显示的背景、颜色和主题。如果是其他Linux发型版,脚本名称可能有所不同。Ubuntu是Debian的衍生版,所以我这里的脚本名称是05_debian_theme。
10_linux:设置安装Linux的启动菜单项目。
20_linux_xen:另一个安装的Linux。
20_memtest86+:memtest工具的自动菜单项目。
30_os-prober:扫描硬盘上的其他操作系统并把它们加入到自动菜单。
30_uefi-firmware:应该是用于对UEFI的支持。http://en.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface
40_custom/41_custom:提供一种模板给用户来新增启动菜单项。

值得注意的是,各个脚本的名字都以数字作为开头,数字也决定了它们各自的先后次序,数字越小的脚本拥有越高的优先权,即它会更早的被执行,其对应的启动菜单项也就处在更前面。

文件/etc/default/grub的内容比较好理解,其设置都是按照key/value的形式进行组织:

lenky@lenky-Inspiron-545s:/etc/grub.d$ cat /etc/default/grub
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.
# For full documentation of the options in this file, see:
#   info -f grub -n 'Simple configuration'

GRUB_DEFAULT=0
GRUB_HIDDEN_TIMEOUT=0
GRUB_HIDDEN_TIMEOUT_QUIET=true
GRUB_TIMEOUT=10
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX="locale=zh_CN"

# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"

# Uncomment to disable graphical terminal (grub-pc only)
#GRUB_TERMINAL=console

# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480

# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
#GRUB_DISABLE_LINUX_UUID=true

# Uncomment to disable generation of recovery mode menu entries
#GRUB_DISABLE_RECOVERY="true"

# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"
lenky@lenky-Inspiron-545s:/etc/grub.d$

该文件内各种字段的含义在http://www.gnu.org/software/grub/manual/grub.html#Simple-configuration可以找到对应的介绍。下面罗列几个重要字段的含义:
GRUB_DEFAULT=0
设置默认启动菜单项,序号从0开始,即第一个菜单的序号为0。
GRUB_HIDDEN_TIMEOUT=0
显示启动菜单前的一个等待时间。在这个时间内按任意键显示启动菜单,如果没有键按下而超时,那么也将显示启动菜单。看上去,不管按不按键,启动菜单都要显示,所以这个参数完全是多余?
GRUB_HIDDEN_TIMEOUT_QUIET=true
配合GRUB_HIDDEN_TIMEOUT使用,如果设置为flase,那么将有一个变化的剩余时间提示。
GRUB_TIMEOUT=10
启动菜单等待选择/编辑的超时时间。在这个时间内,如果没有键按下,那么启动默认菜单项。设置为0则立即启动默认菜单项。设置为-1则无限等待用户选择。如果设置GRUB_TIMEOUT为0,而GRUB_HIDDEN_TIMEOUT为10,那么就会实现这样一种效果:启动菜单完全不显示,除非用户按下任意键。从这点来看,GRUB_HIDDEN_TIMEOUT并非多余。
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
根据发行版不同而提供额外的版本信息。
GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash”
除非是GRUB_DISABLE_RECOVERY设置为true,否则对于任何一个Linux内核都会对应有两个菜单项,一个为默认菜单项,一个为恢复模式菜单项,而GRUB_CMDLINE_LINUX_DEFAULT仅给默认菜单项添加额外的内核参数。
GRUB_CMDLINE_LINUX=”locale=zh_CN”
添加额外的内核参数。

当执行update-grub/update-grub2命令时,它就会按数字优先级执行/etc/grub.d/目录下的各个脚本,而这些脚本又会读取/etc/default/grub或其他系统信息,创建生成/boot/grub/grub.cfg。

/etc/grub.d/脚本内容比较复杂,但一般的修改只要看其如下类似内容:

cat << EOF
if [ -s \$prefix/grubenv ]; then
  set have_grubenv=true
  load_env
fi
EOF

把里面的内容改了即可。

如果除了默认启动选项指定的操作系统以外,没有其他可选操作系统,那么GRUB2会直接进入默认选项的启动流程,而不会显示启动菜单。此时如果要显示启动菜单,需要提前长按左shift键。

参考:
http://www.dedoimedo.com/computers/grub-2.html
http://www.gnu.org/software/grub/manual/
https://help.ubuntu.com/community/Grub2
http://www.gnu.org/software/grub/index.html

转载请保留地址:http://lenky.info/archives/2013/07/27/2333http://lenky.info/?p=2333


备注:如无特殊说明,文章内容均出自Lenky个人的真实理解而并非存心妄自揣测来故意愚人耳目。由于个人水平有限,虽力求内容正确无误,但仍然难免出错,请勿见怪,如果可以则请留言告之,并欢迎来讨论。另外值得说明的是,Lenky的部分文章以及部分内容参考借鉴了网络上各位网友的热心分享,特别是一些带有完全参考的文章,其后附带的链接内容也许更直接、更丰富,而我只是做了一下归纳&转述,在此也一并表示感谢。关于本站的所有技术文章,欢迎转载,但请遵从CC创作共享协议,而一些私人性质较强的心情随笔,建议不要转载。

法律:根据最新颁布的《信息网络传播权保护条例》,如果您认为本文章的任何内容侵犯了您的权利,请以或书面等方式告知,本站将及时删除相关内容或链接。

分类: *nix技术 标签:
  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.