启动流程一览
简单来说,系统启动的经过可以汇整成底下的流程的:
- 加载 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 程序,最后就等待使用者登陆啦;
Boot Loader: Grub
现阶段 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 中。
从上面的说明你可以知道 /boot/grub/ 目录下最重要的就是配置档 (menu.lst) 以及各种文件系统的定义! 我们的 loader 读取了这种文件系统定义数据后,就能够认识文件系统并读取在该文件系统内的核心文件罗。 至於 grub 的配置档档名,其实应该是 menu.lst 的,只是在 Red Hat 里面被定义成为 /boot/grub.conf 而已。[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 配置档:
[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/sda default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title 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 口令的解决之道
如果连 root 的口令都忘记了,怎么办? 其实在 Linux 环境中 root 口令忘记时还是可以救回来的!只要能够进入并且挂载 / , 然后重新配置一下 root 的口令,就救回来啦!这是因为启动流程中,若强制核心进入 runlevel 1 时, 默认是不需要口令即可取得一个 root 的 shell 来救援的。整个动作有点像这样:
CentOS6:
- 重新启动!一定要重新启动!怎么重开都没关系;
- 在启动进入 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 的口令啦!
CentOS7:
- 重新启动!一定要重新启动!怎么重开都没关系;
- 在启动进入 grub 菜单后, (1)在你要进入的菜单上面点 'e' 进入详细配置; (2)将光棒移动到第一个选项并点 'e' 进入编辑画面; (3)然后出现一篇很长的配置信息,直接一路按向下箭头(我们要在底部加东西)找到Linux16,在末尾处加入 init=/bin/sh (到linux16这一行,按下end键就到末尾了,记得加个空格),然后按ctrl+X就可以进入单用户模式了;
- mount -o remount,rw / 挂载根目录为可读可写模式
- passwd 重置一下Root密码,输入密码,再确认密码(不知道为啥,以前是英文提示的,现在搞得一堆符号)
- touch /.autorelabel 创建系统文件.autorelabel
- exec /sbin/init 初始化并启动系统