GRUB2简介及相关
根据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/2333 或 http://lenky.info/?p=2333
备注:如无特殊说明,文章内容均出自Lenky个人的真实理解而并非存心妄自揣测来故意愚人耳目。由于个人水平有限,虽力求内容正确无误,但仍然难免出错,请勿见怪,如果可以则请留言告之,并欢迎来讨论。另外值得说明的是,Lenky的部分文章以及部分内容参考借鉴了网络上各位网友的热心分享,特别是一些带有完全参考的文章,其后附带的链接内容也许更直接、更丰富,而我只是做了一下归纳&转述,在此也一并表示感谢。关于本站的所有技术文章,欢迎转载,但请遵从CC创作共享协议,而一些私人性质较强的心情随笔,建议不要转载。
法律:根据最新颁布的《信息网络传播权保护条例》,如果您认为本文章的任何内容侵犯了您的权利,请以或书面等方式告知,本站将及时删除相关内容或链接。