根据GRUB官方网站上的介绍,GNU GRUB是一个多操作系统启动程序,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。
GRUB应用很广,但由于之前的GRUB旧版本有各种缺陷而已逐步被重新设计的GRUB2所替代。GRUB2是Grub的第二版,它对GRUB的接口进行了完整的重写。基于PUPA项目的研究,GRUB2按模块化设计而更方便扩展。
下面列出了GRUB2的一些改进特性:
具有图形化界面,支持主题
模块化加载
夸平台的兼容性
支持脚本
自定义的启动项目定义
修改分区命名
通过使用如下命令可以查看当前系统使用的是哪个版本的GRUB:
[table]
[tr][td]1
2
[/td][td]lenky@lenky-Inspiron-545s:~$ grub-install -v
grub-install (GRUB) 2.00-13ubuntu3
[/td][/tr]
[/table]
采用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/是一个包含多个脚本的目录:
[table]
[tr][td]1
2
3
4
5
6
7
[/td][td]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
[/td][/tr]
[/table]
先来看/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的形式进行组织:
[table]
[tr][td]1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
[/td][td]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$
[/td][/tr]
[/table]
该文件内各种字段的含义在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/脚本内容比较复杂,但一般的修改只要看其如下类似内容:
[table]
[tr][td]1
2
3
4
5
6
[/td][td]cat << EOF
if [ -s $prefix/grubenv ]; then
set have_grubenv=true
load_env
fi
EOF
[/td][/tr]
[/table]
把里面的内容改了即可。
如果除了默认启动选项指定的操作系统以外,没有其他可选操作系统,那么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