引导流程解析共分成三个部分,分别是linux引导流程、linux运行级别、linux启动服务管理。下面一个一个来:
上
上图就是系统引导流程的流程图,我们一个部分一个部分来分别介绍:
一、固件:电脑按下电源以后,首先都是加载固件,叫做firmwall,PC上面应用最多的就是CMOS/BIOS(CMOS是固化在硬件上的那段程序,BIOS是基于这个程序的图形化管理界面),它既不是硬件也不是软件,它主要的功能是在硬件层面进行加电自检(通常是检查线连上没,硬件可以识别没)。在SUN的系统里不叫cmos而叫prom,也不叫bios而叫openbooter,所以名字虽然不同但是原理是差不多的,要学习这些固件,在购买服务器的时候,会有操作手册,上面会有各种命令的解释。固件设置里面只讲一点就是硬件时钟和软件时钟的设置(hwclock与date)。
二、自居程序:在进行完加电自检,电脑会开始读硬盘,首先读的是MBR(master boot recorder)主引导记录,主引导记录在0柱面0磁头1扇区的位置。主引导记录分3个部分:自居程序bootloader,磁盘分区表Partition table,结束标志字magic number。
自居程序在所有的操作系统里面都有,在linux自居程序中广泛应用的是grub(windows的自居程序在C盘可以查看到,NTloader)。那自居程序grub有什么用呢?它最重要的作用就是载入内核。其实内核在/boot文件夹是可以查看到的,内核其实是一个可执行文件而不是一堆文件。一堆文件的那个是内核的源代码文件而不是可以使用的内核程序。内核的版本号和名字等配置信息可以在/etc/grab.conf配置文件查看,该配置文件具体的内容将在后续中详细剖析。
三、载入内核:在载入内核以后,工作就交给了内核。内核在引导期间,其实最主要只做两个事情:1.首先是驱动硬件,所谓驱动就是使系统认识硬件,并调用硬件。一个系统最庞大的部分就是驱动,通常根据需要对驱动进行裁剪,就成了裁决系统。2然后就是启动一个进程,叫做init进程。它应该是系统存在的第一个进程。
四、启动进程init:该进程的的PID(进程ID)恒为1,一般情况下PID是随即分配的,但是init进程是固定的。PPID称为父进程ID,可以看出init进程的父进程的PID为0,其实PID为0的进程是内核调度器(kernel scheduler)它负责对进程进行调度,即CPU时间片的分配。
在父子进程关系中,按道理父进程死了,子进程必须死。但是有时候父进程死了,但是子进程因为某种特殊情况并没有死,这样子进程就成了孤儿进程,linux检查到孤儿进程,会把该孤儿进程的PPID变成1。另外一种情况,就是子进程死了,父进程不知道,导致子进程变成僵尸进程。
五、读取配置文件inittab:在启动进程init以后,就会读取/etc/inittab配置文件。使用more /etc/inittab打开inittab文件,首先看到的是关于系统运行级别的信息。
Linux运行级别(runlevel)一共有7种:
0halt(关机)
1.Singgle user mode(但用户,类似windows的安全模式)
2.Multiuser(没有NFS网络文件共享服务的多用户模式,命令行)
3.Full multiuer mode(和3一样,多加了NFS)
4.Unuerd(还未使用)
5.X11(默认使用,图形界面)
6.Reboot(重启)
如上所述默认的一般是5.通过命令runlevel可以查看当前运行级别。通过init num或者telinit num可以动态切换运行界别。(其实通过ls -l 'which telinit'可以得知telinit是init的一个软链接)。
接着继续学习inittab配置文件,使用grep -v '^#' /etc/inittab | more 得到没有注释的配置文件。通过man init可以得知,所有init配置文件里面的每行都是通过格式
id : runlevels : action : process
id:标识符,标记条目的唯一性,一般为两位字母或者数字
runlevels:指定运行级别,如果为空,表示所有运行级别都可以。
action:指定脚本或者命令的运行状态
process:指定要运行的脚本或者命令
下面对action的取值进行介绍:
1.initdefault:指定系统缺省启动的运行级别
2.sysinit:系统启动时,执行process指定的脚本或命令
3.wait:执行process指定的命令或者脚本,并在执行完成以后才运行其他的条目.
4.once:执行process命令或者脚本,但不等待其结束。
5.Ctrlaltdel:按下ctrl+alt+del键,执行process
6.Respawn:一旦该process终止,则重新运行该process指定的命令或。
7.Powerfail:电源出错执行process
8.Powerokwait:电源恢复执行的process
上述第三个action值wait的例子中,其实通过ls -l /etc/rc.d/rc可以得知,rc其实是一个可执行文件(其实也是脚本)。在rc.d这个目录下其实并不只有rc这一个文件,还有许多文件或者目录。
可以看到有从rc0.d到rc6.d共7个目录。他们是相应运行级别需要启动的服务目录文件。系统是通过action:initdefault的运行级别来匹配这里的服务目录的。现在以rc3.d为例:
可以看到rc3.d目录下有很多服务程序,从他们的名称中,我可以可以得知它们的作用,名称都是有3个部分组成:
第一个大写字母+数字+名字
第一个大写字母S(start)表示启动服务,K(kill)表示杀死服务
数字表示启动顺序,数字越小越先启动,数字相同,按照创建时间启动,名字根据作用而定。
所以在这里我们可以根据自己应用的需要,把有用的进程开启,无用的关闭,比如如果无用的不想开启,可以把S改成s,就不会启动了。
此处加一个专题,就是我们如何在系统启动好以后来动态开启和关闭服务呢?
首先我们要知道,系统所有的服务都是在/etc/rc.d/init.d目录下。我们可以通过start、stop、restart、status来启动、终止、重新启动、查看状态来操作服务。例如:用sshd服务为例:
现在我们如果要把一个服务变成开机启动有3种方法:
(1)第一个就是在/etc/rc.d/rcn.d的服务目录中创建一个名为SXXX的软链接,指向一个脚本就可以了。
(2)使用chkconfig命令设置进程是否启动
(3)使用ntsysv进入图形化设置进程是否启动