Linux 引导流程解析

本文主要记录下linux的引导流程(实例采用centOS 5.5)。

内容主要如下:引导流程、解析下GRUB的作用。

 

一、引导流程

 

1.1主要的流程图如下:

 

image

 

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 定义了初始化的操作。 

内容如下:

image

命令主要格式是: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)

image

( 由截图中可以知道缺省的run-level是:3)

② sysinit:系统启动执行process中指定的命令(每次都会执行)

image

(由截图知,无论是哪个运行级别,都会执行/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目录下的服务启动脚本 如图

image

 

9)执行/etc/rc.d/rcN.d目录下的服务启动脚本

看下该目录下有什么东西:

image

[解析]

S —— start表示要启动的脚本

K —— kill 表示要关闭的脚本

数字表示启动顺序,数值小的优先

 

1.3自定义服务启动或关闭

1)关键目录 /etc/rc.d/init.d/ 下,找到相关的服务再对其进行关闭或启动(所以运行级别的脚本都是来自这个目录的软链接)。

image

通过服务脚本名 start |stop等操作去启动或关闭服务

image

2)自定义服务并启动

实际上,无论是哪个运行级别,他们要启动的脚本都位于/etc/rc.d/init.d这个目录中,而启动的时候相对应的/etc/rc.d/rcN.d目录中的脚本只是一个软链接,指向的还是init.d这个目录中的脚本

如图:rc3.d目录中的内容,可以看到都是软链接(概念类似引用)

image

 

了解了上面的原理后,我们就可以定义我们自己的服务脚本,并让系统在引导的时候加载我们的脚本。

方式有以下几种:

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

image

3、使用 ntsysv (图形界面选择)

用ntsysv –-level N进入对于相应运行级别服务的启动设置

image

通过空格选择启动或否(*表示启动),上下方向键选择

 

1.4小结

大概的引导流程就是以上的几步了。

最后说下如何查看引导日志,主要有两种方式

1、# dmesg

记录了内核kernel驱动硬件的信息

如查询下硬盘eth0的信息:

image

 

2、查看 /var/log/messages的日志信息

记录了服务的启动信息

如查看ntpd的启动情况

image

 

 

 

 

二、GRUB解析及应用

了解了基本的引导流程,我们再来着重看下流程中最重要的自启动程序BootLoader,Linux常用的是GRUB。

2.1GRUB的配置与运用

GRUB的配置文件默认位置 /boot/grub/grub.conf (即GRUB它的实际位置在/boot下)

他有个软链接是 在/etc/grub.conf

先看下grub.conf

image

[解析]

default 定义缺省启动系统(多系统的时候会用到)

timeout 定义缺省等待时间

splashimage 定义GRUB界面图片

hiddenmenu 隐藏菜单

title 定义菜单项名称

root 设置GRUB的根设备

kernerl 定义内核文件所在位置 ro —只读

initrd 定义加载镜像文件

其中root中 (hd0,0) hd为硬盘类型 0为第一块硬盘 ,0为第一个分区

这个实际上是指定了 /boot所在的硬盘分区

可以看下/boot目录

image

 

2.2列子

2.2.1进入单用户模式

适合场合:忘记root密码、修复系统

方法:

1、在启动倒数的时候按ESC进入GRUB操作界面

image

e ——编辑当前的启动菜单项

b ——启动当前的菜单项

d ——删除当前行

c ——进入GRUB的命令行模式

Esc ——返回GRUB启动菜单界面,取消对当前所做的修改

2、按e进入,再选kernerl按e去编辑kernerl项

image

3、在最后加" 1"(空格 1),即运行级别1的单用户模式

4、按回车确定,再按B重启,便可以进入当用户模式

image

 

在单用户模式下,可以对root密码进行重置(命令 #passwd root)

同时可以做其他需要修复的操作。

 

 

 

三、总结

主要是掌握好系统的引导流程,明白在启动的时候系统的每一步在干什么,这样当系统出现问题了,我们就可以判断出是在哪一步出现了问题。这样才能在寻找解决方案的时候有的放矢,缩小范围。

猜你喜欢

转载自xukenetwork.iteye.com/blog/2162121