一、grub2新特性 1、grub2和grub有很多不同的地方: a)图形接口 b)使用了模块机制,通过动态加载需要的模块来扩展功能 c)支持脚本语言,例如条件判断,循环、变量和函数 d)支持rescue模式,可用于系统无法引导的情况 e)国际化语言。包括支持非ASCII的字符集和类似gettext的消息分类,字体,图形控制台等等 f)有一个灵活的命令行接口。如果没有配置文件存在,GRUB会自动进入命令模式 g)针对文件系统、文件、设备、驱动、终端、命令、分区表、os loder的模块化、层次化、基于对象的框架 h)支持多种文件系统格式 i)可访问已经安装的设备上的数据 j)支持自动解压 2、设备的命名 grub2同样以fd表示软盘,hd表示硬盘(包含IDE和SCSI硬盘)。设备是从0开始编号,分区则是从1开始,主分区从1-4,逻辑分区从5开始,而grub分区编号是从0开始的。下面给出几个例子: (fd0):表示整个软盘 (hd0,1):表示BIOS中的第一个硬盘的第1个分区 (hd0,5)/boot/vmlinuz:表示BIOS中的第一个硬盘的第一个逻辑分区下的boot目录下的vmlinuz文件 二、grub2安装与启动 1、安装ubuntu9.10时,grub默认安装在第一硬盘(hd0)的mbr,其实就是把引导文件boot.img写入硬盘的mbr,当然,用户也可以选择不写入硬盘mbr而是写入linux分区的引导扇区。启动时根据mbr所提供信息找到启动分区后,加载分区内的grub核心文件core.img和配置文件grub.cfg,进入选择菜单画面,在菜单画面,按上下箭号选择需要系统菜单项,按Enter进入选项。 按e进入己选择菜单的编辑状态,在编辑状态下,由上下左右箭号来移动光标,enter键换行,ctrl+x以编辑的内容启动,ctrl+c进命令行状态,按Esc退出,回到菜单项。 在需要使用额外的内核参数启动时,比如要加上acpi=off时,把光标移动到linux这一行最后,在splash后加上一空格再输入acpi=off,然后按ctrl+x启动。 按c进入命令行状态,按Tab键可查看所有可用的命令。 在命令行状态,可以根据需要加载或移除相应模块,也可用来启动在菜单没有显现的的系统。 比如,在第一硬盘的第一分区上装有windows xp系统,但在菜单上没显示出来,我们可以命令行状态下输入命令启动: grub>setroot=(hd0,1) grub>chainloader +1 grub>boot 又比如启动第二硬盘第一逻辑分区上的ubuntu系统: grub>setroot=(hd1,5) grub>linux/boot/vmlinuz-xxx-xxx root=/dev/sdb5 grub>initrd/boot/initrd.img-xxx-xxx grub>boot 其中内核vmlinuz和initrd.img的版本号可用按Tab键自动查看。 2、下面介绍下在grub2中一些常用的命令 1)help 查看命令用法,如 helpsearch:查看search命令详细用法 2)set 设置变量值,如 set default=0 set timeout=5 set root=(hd0,3)等等 需要调用变量AA的值时,使用${AA},如setroot=(hd1,1),则${root}=(hd1,1) 3)default 定义默认引导的操作系统。0表示第一个操作系统,1表示第2个,依此类推 4)timeout 定义在时间内用户没有按下键盘上的某个按键,自动引导default指定的操作系统。 5)root 指定用于启动系统的分区。 6)insmod和rmmod 加载或移除某模块,如 insmod jpeg insmod png insmod ntfs rmmod png 等 7)drivemap drivemap兼容grub的map,主要用于只能从第一硬盘(hd0)引导启动的系统如 win2000 xp2003,比如要添加第二硬盘第一分区上的xp系统: menuentry "Windows XP" { set root=(hd1,1) drivemap -s (hd0) ${root} chainloader +1 } 8)ls 列出当前的所有设备。如(hd0),(hd0,1),(hd0,5),(hd1),(hd1,1),(hd1,2)等 ls -l 详细列出当前的所有设备。对于分区,会显示其label及uuid。 ls / 列出当前设为root的分区下的文件 ls (hd1,1)/ 列出(hd1,1)分区根目录的文件 9)search search -f /ntldr 列出根目录里包含ntldr文件的分区,返回为分区号 search -l LINUX 搜索label是LINUX的分区。 search --set -f /ntldr 搜索根目录包含ntldr文件的分区并设为root,注意如果多个分区含有ntldr文件, set失去作用。 10)loopback loopback命令可用于建立回放设备,如 loopback lo0(hd1,1)/abc.iso 可以使用lo0设备来访问abc.iso里的内容,比如说,可以从abc.iso里的软盘映像中启动 loopback lo0(hd1,1)/aa.iso linux (lo0)/memdisk initrd (lo0)/abc.img 要删除某一回放设备,可以使用-d参数: loopback -d lo0 11)pager 分页显示。 set pager=1 显示满一页时暂停,按space继续 set pager=0 取消分页显示 12)linux 用linux命令取代grub中的kernel命令 13)chainloader 调用另一个启动器,如 chainloader (hd0,1)+1 调用第一硬盘第一分区引导扇区内的启动器,可以是windows或linux的启动器 三、grub2配置文件详解 grub2改用grub.cfg为配置文件,配置文件包含以下基本内容:(红色为解释部分) ### BEGIN /etc/grub.d/00_header ### load_env #加载变量,如果在grubenv保存变量,则启动时装载 set default="0" #设置默认引导项,默认值为0 insmod ext2 #插入文件系统支持的模块,除了用作启动的分区外,其他分区格式可在menuentry底下再添加 set root=(hd0,8) #指定系统root分区,也就是 /分区 search --no-floppy --fs-uuid --set2d61e5f9-1d2a-4167-a6f1-b991ba00878b #指定uuid=2d61e5f9-1d2a-4167-a6f1-b991ba00878b的分区为root分区,如果前面的分区号(hd0,8)的#uuid与这里的uuid一致,这两句作用一样,如果不一致,则指定uuid的起作用。 if loadfont /usr/share/grub/unicode.pf2 ; then #设置终端字体,unicode.pf2支持中文字符显示 set gfxmode=640x480 #设置显示分辨率,默认为640x480,可用800x600,1024x768,建议跟你想设定的图片大小一致 insmod gfxterm #插入终端模块gfxterm,支持中文字符显示和支持24位图像 insmod vbe #插入vbe模块,GRUB2引入模块化机制,要使用它,需要在这里加入 if terminal_output gfxterm ; then true ; else # For backward compatibility with versions of terminal.mod thatdon't # understand terminal_output terminal gfxterm #设定grub2终端为gfxterm fi fi set timeout=10 #设定默认启动前等待时间,默认为10秒 ### END /etc/grub.d/00_header ### ### BEGIN /etc/grub.d/05_debian_theme ###setmenu_color_normal=white/black #设定菜单字体及背景颜色 set menu_color_highlight=black/blue #设定选择项字体及背景颜色 #如果使用默认,背景将完全被蓝色挡住了,需要修改blue为black,背景图片才能显示 ### END /etc/grub.d/05_debian_theme ### ### BEGIN /etc/grub.d/10_linux ### #10_linux为系统自动添加的当前root分区linux引导项 #每个菜单项要包括menuentry双引号""和大括号{ }才完整,否则不显示菜单 menuentry "Ubuntu, Linux 2.6.31-10-generic" { set quiet=1 insmod ext2 set root=(hd0,8) search --no-floppy --fs-uuid --set2d61e5f9-1d2a-4167-a6f1-b991ba00878b #这句与setroot=(hd0,8)效果一样,可删除其一,二者不一致以这句为准 linux /boot/vmlinuz-2.6.31-10-genericroot=UUID=2d61e5f9-1d2a-4167-a6f1-b991ba00878b ro quietsplash #不喜欢看到一长串的,roo=UUID=***可用root=/dev/sda8(/分区的分区号)代替 initrd /boot/initrd.img-2.6.31-10-generic } … ### END /etc/grub.d/10_linux ### #20_memtest86+为系统自动添加的内存测试菜单项 ### BEGIN /etc/grub.d/20_memtest86+ ###menuentry "Memory test(memtest86+)" {linux16 /boot/memtest86+.bin}menuentry "Memory test(memtest86+, serial console 115200)" {linux16 /boot/memtest86+.binconsole=ttyS0,115200n8}### END /etc/grub.d/20_memtest86+ ### #30_os-prober或30_others为系统自动查找并添加其他系统菜单项,按windows,linux,macos顺序 #查找并添加,支持windows7识别 ### BEGIN /etc/grub.d/30_os-prober ### ### END /etc/grub.d/30_os-prober ### ### BEGIN /etc/grub.d/30_otheros ### # This entry automatically added by the Debian installer for anon-linux OS # on /dev/sda1 menuentry "Microsoft Windows XP Professional" { set root=(hd0,1) search --no-floppy --fs-uuid --set e852-230b drivemap -s (hd0) $root #对以ntldr引导的系统如win2000,xp,win2003,因其引导机制只能从第一硬盘启动,系统会自动添加#映射命令,对vista和win7就没有这句命令 chainloader +1}### END /etc/grub.d/30_otheros ### #40_custom为自定义的启动项,如启动cdlinux ### BEGIN /etc/grub.d/40_custom ### menuentry "CDLinux"{ set root=(hd0,8) linux /CDlinux/bzImage root=/dev/ram0 vga=791CDL_LANG=zh_CN.UTF-8 initrd /CDlinux/initrd } ### END /etc/grub.d/40_custom ### 定制个性化的配置文件,可以加入背景图片,使用中文字符,让启动画面独具特色,而不是单调的黑、白、蓝三色。下面是一张经美化启动画面: 四、脚本修改 该怎样定制个性化的配置文件呢? 系统安装完成后,用户就会发现/boot/grub/grub.cfg文件只有root权限可读,如果要直接修改grub.cfg文件,要先修改其权限。好不容易把grub.cfg修改好了,系统内核或grub升级时,会自动执行update-grub,grub.cfg文件就会被打回原形,如何保证修改后的配置文件能一直保留下来呢? 其实不用修改grub.cfg,只要把个性化配置写入/etc/default/目录下的grub和/etc/gurb.d目录下的脚本文件,以后不管升级内核或者是升级grub所执行的update-grub,都会按要求创建个性化的grub.cfg。 1、首先看下/etc/default/grub,先从应用程序-附件里打开终端,输入 sudo gedit/etc/default/grub 用户密码
看看打开的文件可作什么修改: # If you change this file, run 'update-grub' afterwards toupdate # /boot/grub/grub.cfg. GRUB_DEFAULT=0->设置默认启动项,按menuentry顺序。比如要默认从第四个菜单项启动,数字改为3,若改为saved,则默认为上次启动项。 GRUB_HIDDEN_TIMEOUT=0 GRUB_HIDDEN_TIMEOUT_QUIET=true->隐藏菜单,grub2不再使用,不管 GRUB_TIMEOUT="3"->设置进入默认启动项的等候时间,默认值10秒,按自己需要修改 GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null ||echo Debian` GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"->添加内核启动参数,这个为默认 GRUB_CMDLINE_LINUX="noresume" ->手动添加内核启动参数,比如acpi=off noapic等可在这里添加 # 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 supportsvia VBE # you can see them in real GRUB with the command `vbeinfo' #GRUB_GFXMODE=640x480设定图形介面分辨率,如不使用默认,把前面#去掉,把分辨率改为800x600或1024x768 # Uncomment if you don't want GRUB to pass "root=UUID=xxx"parameter to Linux #GRUB_DISABLE_LINUX_UUID=true->设置grub命令是否使用UUID,去掉#,使用root=/dev/sdax而不用root=UUDI=xxx # Uncomment to disable generation of recovery mode menuentrys #GRUB_DISABLE_LINUX_RECOVERY="true"->设定是否创建修复模式菜单项 2、再看下/etc/grub.d目录下的脚本文件: