Linux 引导流程解析
本文主要记录下linux的引导流程(实例采用centOS 5.5)。
内容主要如下:引导流程、解析下GRUB的作用。
一、引导流程
1.1主要的流程图如下:
1.2每一步的作用
1)第一步firmware固件自检,主要是进行CMOS/BIOS对硬件进行POST加电自检,在物理层次上对硬件进行检测是否正常。
2)读取硬盘中MBR的BootLoader(自启动程序,Linux下常用的自启动程序是GRUB)。这一步主要的功能是载入内核。
3)载入的内核Kernel主要功能是:1、驱动硬件(Kernel中含有大量驱动程序),2、启动init进程。
4)init进程,主要是读取/etc/inittab文件,执行缺省运行级别,从而继续引导。(需要注意的是它的PID恒为1,0为内核调度器Kernel scheduler)。
5)/etc/inittab 定义了初始化的操作。
内容如下:
命令主要格式是:id : runlevels : action : process
[解析]
id :标识符,一般为两位字或数字
run-levels :指定运行级别,可以指定多个
action :指定运行状态
process :指定要运行的脚本或命令
其中,
1、run-levels运行级别有7个,0—6分别如下:
0 —— halt 关机
1 —— Single user mode 单用户模式
2 —— Multiuser,withoutNFS 多用户模式但不带网络(text模式)
3 —— Full multiuser mode 完整功能的多用户模式(text模式)
4 —— unused 预留
5 —— X11 图形化多用户模式
6 —— reboot 重启
主要命令:查看当前运行级别 #runlevel、 切换运行级别 #init[0 |1 |2 |3 |4 |5 |6]
2、而acion中也有几个比较重要的取值:
① initdefault:指定系统缺省启动的运行级别(通常用于修复,比如我们要进入单用户模式,则可以将其设置为1)
( 由截图中可以知道缺省的run-level是:3)
② sysinit:系统启动执行process中指定的命令(每次都会执行)
(由截图知,无论是哪个运行级别,都会执行/etc/rc.d/rc.sysinit)
③ wait:执行process中指定的命令,并等其结束后再运行其他命令
④ once:执行process中指定的命令,不等待其结束
⑤ ctrlaltdel:按下Ctrl + Alt + Del时执行process指定的命令
6)initdefault
如第五步所说到的,主要是读取/etc/inittab中的信息,判断缺省的运行级别是什么。
7)/etc/rc.d/rc.sysinit
启动这个脚本。完成系统服务程序的启动,如系统环境变量的设置、设置系统时钟、加载字体、检查加载文件系统、生成系统启动信息日志文件等。(由于是基础服务,如截图所示,默认是将其run-level设置为空::即任何级别,action设置为sysinit。即该脚本在任何运行级别下都要启动,以完成基础服务的启动)【可以自定义自己希望启动的脚本,然后加到这个脚本的最后面,便会在启动时被加载】
8)基础服务启动后,会执行/etc/rc.d/rc这个脚本
加载完基础服务后,就要根据不同的运行级别去启动相对应的下的目录,(如3是命令行模式,5是图形模式,他们需要启动的服务不同),但系统如何去加载呢?这就是rc这个脚本的作用了,它的工作原理是先去判断系统的默认运行级别即第6步中的东西,然后再执行相应的rcN.d目录下的服务启动脚本 如图
9)执行/etc/rc.d/rcN.d目录下的服务启动脚本
看下该目录下有什么东西:
[解析]
S —— start表示要启动的脚本
K —— kill 表示要关闭的脚本
数字表示启动顺序,数值小的优先
1.3自定义服务启动或关闭
1)关键目录 /etc/rc.d/init.d/ 下,找到相关的服务再对其进行关闭或启动(所以运行级别的脚本都是来自这个目录的软链接)。
通过服务脚本名 start |stop等操作去启动或关闭服务
2)自定义服务并启动
实际上,无论是哪个运行级别,他们要启动的脚本都位于/etc/rc.d/init.d这个目录中,而启动的时候相对应的/etc/rc.d/rcN.d目录中的脚本只是一个软链接,指向的还是init.d这个目录中的脚本
如图:rc3.d目录中的内容,可以看到都是软链接(概念类似引用)
了解了上面的原理后,我们就可以定义我们自己的服务脚本,并让系统在引导的时候加载我们的脚本。
方式有以下几种:
1、增加软链接 #ln -s
例子:
先写好一个脚本,再用 ln –s 脚本名 /etc/rc.d/rcN.d/Sxx脚本名
这样系统就会在引导运行级别N时就会加载这个脚本
如:ln –s /etc/rc.d/init.d/xx.script /etc/rc.d/rc3.d/S100xx.script
这样系统就会在运行级别3时加载我们的xx.script这个服务。(注意脚本放在init.d目录中,并且软链接的名字要用S开头)
2、使用 chkconfig
3、使用 ntsysv (图形界面选择)
用ntsysv –-level N进入对于相应运行级别服务的启动设置
通过空格选择启动或否(*表示启动),上下方向键选择
1.4小结
大概的引导流程就是以上的几步了。
最后说下如何查看引导日志,主要有两种方式
1、# dmesg
记录了内核kernel驱动硬件的信息
如查询下硬盘eth0的信息:
2、查看 /var/log/messages的日志信息
记录了服务的启动信息
如查看ntpd的启动情况
二、GRUB解析及应用
了解了基本的引导流程,我们再来着重看下流程中最重要的自启动程序BootLoader,Linux常用的是GRUB。
2.1GRUB的配置与运用
GRUB的配置文件默认位置 /boot/grub/grub.conf (即GRUB它的实际位置在/boot下)
他有个软链接是 在/etc/grub.conf
先看下grub.conf
[解析]
default 定义缺省启动系统(多系统的时候会用到)
timeout 定义缺省等待时间
splashimage 定义GRUB界面图片
hiddenmenu 隐藏菜单
title 定义菜单项名称
root 设置GRUB的根设备
kernerl 定义内核文件所在位置 ro —只读
initrd 定义加载镜像文件
其中root中 (hd0,0) hd为硬盘类型 0为第一块硬盘 ,0为第一个分区
这个实际上是指定了 /boot所在的硬盘分区
可以看下/boot目录
2.2列子
2.2.1进入单用户模式
适合场合:忘记root密码、修复系统
方法:
1、在启动倒数的时候按ESC进入GRUB操作界面
e ——编辑当前的启动菜单项
b ——启动当前的菜单项
d ——删除当前行
c ——进入GRUB的命令行模式
Esc ——返回GRUB启动菜单界面,取消对当前所做的修改
2、按e进入,再选kernerl按e去编辑kernerl项
3、在最后加" 1"(空格 1),即运行级别1的单用户模式
4、按回车确定,再按B重启,便可以进入当用户模式
在单用户模式下,可以对root密码进行重置(命令 #passwd root)
同时可以做其他需要修复的操作。
三、总结
主要是掌握好系统的引导流程,明白在启动的时候系统的每一步在干什么,这样当系统出现问题了,我们就可以判断出是在哪一步出现了问题。这样才能在寻找解决方案的时候有的放矢,缩小范围。