一、Grub简介
系统启动引导管理器(bootloader),就是系统启动时在执行POST加电自检功能的BIOS程序之后、操作系统内核运行之前这中间所运行的一段程序,一旦把内核挂载,系统引导管理器的任务就算完成退出,系统引导的其它部份,比如系统的初始化及启动过程则完全由内核来控制完成。所以,它的主要作用是加载内核,并将整个系统的控制权移交给内核。常见的bootloader有Windows的ntloader、Linux的lilo、grub及grub2等。其中,在CentOS 5/6系列上使用的是grub,而在CentOS 7开始则使用grub;lilo则常见于手机,因此lilo是使用者最多的一种bootloader。
二、Grub配置
(1)stage
Linux将Boot Loader的程序运行与配置项加载分成三个阶段(stage)来进行:
stage1:运行Boot Loader主程序,就是从一个本地磁盘加载 stage 2 或者 stage1_5,这个程序必须要被安装在启动区,即MBR中。stage1 是用于引导 Grub 的一个必须的映象文件。因为 MBR 空间有限,只有512字节,所以 stage1 也是512字节。因此在MBR当中仅安装Boot Loader的最小主程序,即 stage1,并没有安装 Boot Loader 的相关配置文件。因为大小的限制,stage1 对 stage2 或者 stage1_5 的位置进行编码。
stage1_5:在MBR随后的扇区存放,主要用于与 stage2 的分区的文件系统进行交互,让stage1中的 Boot Loader 能够识别stage2所在分区的上的文件系统,通过借助于stage1.5阶段所提供的文件系统驱动,stage1就可以通过加载其中某一种文件系统驱动来识别stage2所在分区的文件系统了。
stage2:(1) 向用户提供菜单,并提供交互式接口。例如,在启动时可进入菜单,通过键入e键进入编辑模式,可以编辑菜单,此时会读取配置文件;也可以通过键入c键可以进入命令行模式,即进入交互式接口,可以自己手动指定要启动的内核而不读取grub配置文件;
(2) 加载用户选择的内核或操作系统。在选择时允许用户传递参数给内核,也可以隐藏菜单的具体内容;
(3) 为菜单提供保护机制。可以为编辑菜单提供认证,用户需要通过认证方可编辑指定菜单;也可以为内核或操作系统提供认证,用户需要通过认证方可启动指定的内核或操作系统。
device.map:定义 grub 装在了哪里 e2fs_stage1_5:ext4文件系统的定义 fat_stage1_5:fat文件系统的定义 ffs_stage1_5:ffs文件系统的定义 grub.conf:grub的配置文件 iso9660_stage1_5:光驱文件系统的定义 jfs_stage1_5:jfs文件系统的定义 menu.lst -> ./grub.conf minix_stage1_5:minix文件系统的定义 reiserfs_stage1_5:reiserfs文件系统的定义 splash.xpm.gz:启动时在 grub 底下的背景图示 stage1:tage 1的相关说明 stage2:tage 2的相关说明 ufs2_stage1_5:ufs2文件系统的定义 vstafs_stage1_5:vstafs文件系统的定义 xfs_stage1_5:xfs文件系统的定义
由以上得知在 /boot/grub 目录下最重要的是grub的配置文件及各种文件系统的定义,当 Boot Loader 读取了这些文件系统所定义的数据后,就能够识别文件系统并读取该文件系统上的内核文件了。
(2)grub的配置文件
配置文件:/boot/grub/grub.conf<--/etc/grub.conf,grub.conf是grub的主配置文件,通过这个配置文件,grub才能找到kernel,系统才能正常启动。
default=0 表示默认的启动条目,假如同时装有多个操作系统,0 表示定义的第一个title系统,1 表示定义的第二个title系统,依次类推。 timeout=5 表示可供选择的等待时间,如果超过5秒,则使用默认的启动条目default定义的。 splashimage=(hd0,0)/grub/splash.xpm.gz 定义启动时的gurb背景图片信息,一般为压缩文件。 hiddenmenu 启动时是否要显示菜单,默认情况下是不显示菜单信息,如果想要显示菜单,可以将该配置注释即可; title 定义各个操作系统的名称或系统内核 root 表示内核文件存放的位置,这里指定的是分区位置,而非根目录 (hd0,0) 识别硬盘设备 hd#: 磁盘编号,用数字表示;从0开始编号 #: 分区编号,用数字表示; 从0开始编号 (hd0,0) 第一块硬盘,第一个分区 kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=e0d35066-8d37-42f2-bdb9-e4416aec281a rhgb quiet 内核的名称以及一些启动时的核心参数。由于启动过程中需要挂载根目录,因此就需要指定根目录所在的分区。rhgb表示色彩显示,quiet表示静默模式加载内核。 initrd /initramfs-2.6.32-696.el6.x86_64.img 虚拟文件系统,指明用于辅助内核完成系统启动的ramdisk文件路径再次在内存缓存
注意: kernel与initrd这两个设置项中,指定的路径都是绝对路径。因为这两个文件都存放在/boot目录。而且/boot所在的分区已经在root (hd[0-n],[0-n])中指定,所以就无需再指明kernel与initrd在哪个分区了。如果boot分区为独立分区,那么前面的/boot省略掉。如果boot分区为非独立分区,那么必须加上/boot。
三、实验
在Linux系统中,出于安全的考虑,只有一个root用户,因此若遗忘root用户的登录密码,就可以借助grub进入单用户模式进行修改密码。
实验1:修改root密码
(1)重启系统,在读秒没完成之前,按任意键进入grub菜单。出现grub菜单时,按↑,↓进行引导,并定位到要进入的操作系统选项,如图进行操作。
(2)按“↓”进行引导,定位到第二个选项,按“e”进入编辑模式。
(3)输入1之后回车返回grub模式,按b进入单用户模式。
(4)进入shell环境,输入passwd,重新更改root密码,输入完成后,使用reboot命令重启系统。
(5)输入用户名和新密码,启动系统。
实验2: 删除/boot下的所有文件,并恢复
(1)删除/boot下的所有文件,并重启系统
(2)在进度条没完成之前,右手按鼠标左键,同时左手按ESC键,进入Boot Menu,使用↓进行引导,定位到3. CD-ROM Drive 选项,回车。
(3)使用↓进行引导,定位到选项resuce(救援模式),回车
(4)依次“yes”“yes”“no”“yes”“continue”“OK”......,直至进入shell编辑模式,回车。
(5)切换根目录,安装grub.
chroot /mnt/sysimage grub-install /dev/sda
(6)挂载光盘,复制vmlinux到/boot目录下,创建initrd系统。
mount /dev/cdrom /media cp /media/isolinux/vmlinux /boot mkinitrd /boot/initrd-$(uname -r).img $(uname -r)
(7)进入/boot/grub/目录下,使用vim命令编辑grub.conf文件,内容如下:
注:脚本里的UUID指的是/boot目录下的UUID,别搞错了。
(8)输入两次exit命令,退出shell编辑模式,重启系统,回车。
实验3:给grub加密
grub也有自己的保护机制,只有通过认证才能修改grub.conf信息。可以通过一些方式来对grub.conf进行保护:
1、在第一个title之上添加 password --md5 ************ 主要用于保护编辑功能; 2、在某个title内添加 password --md5 ************ 主要用于保护内核; 生成密码的命令:grub-md5-crypt
(1)输入grub-md5-crypt命令,生成明文密码
(2)在grub.conf里添加密码
(3)重启系统,在读秒没完成之前,按任意键进入grub菜单,在下方有下一步提示。
(4)根据提示,输入p之后提示输入密码
(5)输入密码完成认证就出现正常编辑grub的配置界面。
grub的界面支持命令行接口,在grub界面可以按照提示输入e、b、c等命令继续相应的编辑,在对应的title中输入c可以进入命令行模式,在命令行中可以输入一些信息:
help:获得帮助 find:文件查找,通常用于定位文件,方法find (hd#,#)/ root kernel initrd boot
实验四:手动在grub命令行接口启动系统
grub> root (hd0,0) 进入root第一个磁盘,第一个分区 grub> kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=/dev/sda2 挂载内核和root根目录 grub> initrd /initramfs-2.6.32-696.el6.x86_64.img 挂载虚拟文件系统 grub> boot 启动系统
在grub界面输入“c”命令进入grub编辑界面,依次输入以上命令就可以手动在grub命令行接口启动系统。