Boot Loader: Grub简单来说,系统启动的经过可以汇整成底下的流程的:
- 加载 BIOS 的硬件资讯与进行自我测试,并依据配置取得第一个可启动的装置;
- 读取并运行第一个启动装置内 MBR 的 boot Loader (亦即是 grub, spfdisk 等程序);
- 依据 boot loader 的配置加载 Kernel ,Kernel 会开始侦测硬件与加载驱动程序;
- 在硬件驱动成功后,Kernel 会主动呼叫 init 程序,而 init 会取得 run-level 资讯;
- init 运行 /etc/rc.d/rc.sysinit 文件来准备软件运行的作业环境 (如网络、时区等);
- init 运行 run-level 的各个服务之启动 (script 方式);
- init 运行 /etc/rc.d/rc.local 文件;
- init 运行终端机模拟程序 mingetty 来启动 login 程序,最后就等待使用者登陆啦;
详见 鸟哥的 linux 私房菜 -- 基础学习篇目录 启动流程、模块管理与 loader
忘记 root 口令的解决之道现阶段 Linux 里头最主流的 boot loader就是grub。
boot loader 的两个 stage在 BIOS 读完资讯后,接下来就是会到第一个启动装置的 MBR 去读取 boot loader 了。这个 boot loader 可以具有菜单功能、直接加载核心文件以及控制权移交的功能等, 系统必须要有 loader 才有办法加载该操作系统的核心就是了。但是我们都知道, MBR 是整个硬盘的第一个 sector 内的一个区块,充其量整个大小也才 446 bytes 而已。 我们的 loader 功能这么强,光是程序码与配置数据不可能只占不到 446 bytes 的容量吧?那如何安装?
为了解决这个问题,所以 Linux 将 boot loader 的程序码运行与配置值加载分成两个阶段 (stage) 来运行:
- Stage 1:运行 boot loader 主程序: 第一阶段为运行 boot loader 的主程序,这个主程序必须要被安装在启动区,亦即是 MBR 或者是 boot sector 。但如前所述,因为 MBR 实在太小了,所以,MBR 或 boot sector 通常仅安装 boot loader 的最小主程序, 并没有安装 loader 的相关配置档;
- Stage 2:主程序加载配置档: 第二阶段为透过 boot loader 加载所有配置档与相关的环境参数文件 (包括文件系统定义与主要配置档 menu.lst), 一般来说,配置档都在 /boot 底下。
那么这些配置档是放在哪里啊?这些与 grub 有关的文件都放置到 /boot/grub 中。
[root@www ~]# ls -l /boot/grub-rw-r--r-- device.map <==grub 的装置对应档(底下会谈到)-rw-r--r-- e2fs_stage1_5 <==ext2/ext3 文件系统之定义档-rw-r--r-- fat_stage1_5 <==FAT 文件系统之定义档-rw-r--r-- ffs_stage1_5 <==FFS 文件系统之定义档-rw------- grub.conf <==grub 在 Red Hat 的配置档-rw-r--r-- iso9660_stage1_5 <==光驱文件系统定义档-rw-r--r-- jfs_stage1_5 <==jfs 文件系统定义档lrwxrwxrwx menu.lst -> ./grub.conf <==其实 menu.lst 才是配置档!-rw-r--r-- minix_stage1_5 <==minix 文件系统定义档-rw-r--r-- reiserfs_stage1_5 <==reiserfs 文件系统定义档-rw-r--r-- splash.xpm.gz <==启动时在 grub 底下的背景图示-rw-r--r-- stage1 <==stage 1 的相关说明-rw-r--r-- stage2 <==stage 2 的相关说明-rw-r--r-- ufs2_stage1_5 <==UFS 的文件系统定义档-rw-r--r-- vstafs_stage1_5 <==vstafs 文件系统定义档-rw-r--r-- xfs_stage1_5 <==xfs 文件系统定义档从上面的说明你可以知道 /boot/grub/ 目录下最重要的就是配置档 (menu.lst) 以及各种文件系统的定义! 我们的 loader 读取了这种文件系统定义数据后,就能够认识文件系统并读取在该文件系统内的核心文件罗。 至於 grub 的配置档档名,其实应该是 menu.lst 的,只是在 Red Hat 里面被定义成为 /boot/grub.conf 而已。
- /boot/grub/menu.lst 配置档:
[root@localhost ~]# cat /boot/grub/menu.lst # grub.conf generated by anaconda## Note that you do not have to rerun grub after making changes to this file# NOTICE: You have a /boot partition. This means that# all kernel and initrd paths are relative to /boot/, eg.# root (hd0,0)# kernel /vmlinuz-version ro root=/dev/mapper/VolGroup-lv_root# initrd /initrd-[generic-]version.img#boot=/dev/sdadefault=0timeout=5splashimage=(hd0,0)/grub/splash.xpm.gzhiddenmenutitle CentOS (2.6.32-279.el6.i686) root (hd0,0) kernel /vmlinuz-2.6.32-279.el6.i686 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS..........(省略) initrd /initramfs-2.6.32-279.el6.i686.img在 title 以前的四行,都是属於 grub 的整体配置,包括默认的等待时间与默认的启动项目, 还有显示的画面特性等等。至於 title 后面才是指定启动的核心文件或者是 boot loader 控制权。 在整体配置方面的项目主要常见的有:
- default=0 这个必须要与 title 作为对照,在配置档里面有几个 title ,启动的时候就会有几个菜单可以选择。 由於 grub 启始号码为 0 号,因此 default=0 代表使用『第一个 title 项目』来启动的意思。 default 的意思是,如果在读秒时间结束前都没有动到键盘, grub 默认使用此 title 项目 (在此为 0 号) 来启动。
- timeout=5 启动时会进行读秒,如果在 5 秒钟内没有按下任何按键,就会使用上面提到的 default 后面接的那个 title 项目来启动的意思。如果你觉得 5 秒太短,那可以将这个数值调大 (例如 30 秒) 即可。此外,如果 timeout=0 代表直接使用 default 值进行启动而不读秒,timeout=-1 则代表直接进入菜单不读秒了!
- splashimage=(hd0,0)/grub/splash.xpm.gz 有没有发现你的 CentOS 在启动的时候背景不是黑白而是有色彩变化的呢?那就是这个文件提供的背景图示啦(注3)!不过这个文件的实际路径写法怎么会是这样啊?很简单啊~上述的意思是:在 (hd0,0) 这个分割槽内的最顶层目录中,底下的 grub/splash.xpm.gz 那个文件的意思。 由於鸟哥将 /boot 这个目录独立成为 /dev/hda1 ,因此这边就会写成『在 /dev/hda1 里面的 grub/splash.xpm.gz 』的意思啦!想一想,如果你的 /boot 目录并没有独立成为一个分割槽, 这里会写成如何?
- hiddenmenu 这个说的是,启动时是否要显示菜单?目前 CentOS 默认是不要显示菜单, 如果您想要显示菜单,那就将这个配置值注解掉!
整体配置的地方大概是这样,而底下那个 title 则是显示启动的配置项目。
- root :代表的是『核心文件放置的那个 partition 而不是根目录』喔!不要搞错了! /boot 一般都是独立为 /dev/hda1 , 所以磁碟代号就会成为 (hd0,0) 罗。
- kernel :至於 kernel 后面接的则是核心的档名,而在档名后面接的则是核心的参数。 由於启动过程中需要挂载根目录,因此 kernel 后面接的那个root=/dev/mapper/VolGroup-lv_root 指的是『Linux 的根目录在哪个 partition 』的意思。
- initrd :就是 initrd 制作出 RAM Disk 的文件档名啦!
如果连 root 的口令都忘记了,怎么办? 其实在 Linux 环境中 root 口令忘记时还是可以救回来的!只要能够进入并且挂载 / , 然后重新配置一下 root 的口令,就救回来啦!这是因为启动流程中,若强制核心进入 runlevel 1 时, 默认是不需要口令即可取得一个 root 的 shell 来救援的。整个动作有点像这样:
- 重新启动!一定要重新启动!怎么重开都没关系;
- 在启动进入 grub 菜单后, (1)在你要进入的菜单上面点 'e' 进入详细配置; (2)将光棒移动到 kernel 上方并点 'e' 进入编辑画面; (3)然后出现如下画面来处理:
grub edit> kernel /vmlinuz-2.6.32-279.el6.i686 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS..........(省略)single重点就是添加那个特殊字体single啦!按下 [enter] 再按下 b 就能够启动进入单人维护模式了。
- 进入单人维护模式后,系统会以 root 的权限直接给你一个 shell ,此时你就能够运行『 passwd 』这个命令来重建 root 的口令啦!
新闻热点
疑难解答