第六十五讲——kernel初始化的过程

本文共有3235个字,关键词:

一是设备探测
二是驱动初始化(从initrd文件中装在驱动模块)
三是以只读方式挂载根文件系统,为了文件系统的安全选择只读挂载,避免写入或者损坏数据。
四是装在第一个PID为1的进程:init。
在第三步以只读方式挂载,避免了BUG影响整个根文件系统,当装载完成后由init重启文件系统为读写。
/sbin/init (/etc/inittab)
早先这个init可能是一个脚本,也可能是一个二进制程序,但是在rhel6.0之后,使用的就不再是传统的Unix init了。
在6.0之后,使用的是upstart,但是名称依然是init,另一个版本的init(可执行程序)。
upstart由Ubuntu组织开发,upstart可以实现并行的启动进程,但是有些服务是有依赖关系的,这些依赖关系各自都有体现。
upstart的配置文件/etc/inittab只有一行,因为upstart使用d-bus进行通信,所以不再需要各种指定的子系统。(IPC机制,进程间通信,实现事件驱动基于d-bus各子系统之间的通信)
理解init的工作机制有助于理解其他类型的机制,所以先讲一讲6.0之前的inittab。
/etc/inittab
由三个冒号分隔为四段:
首先是id,标识符,区分不同的行
其次是runlevels,在哪些级别下会执行此命令。
接下来是action,采取的动作,即什么时候启动进程。
最后是process,执行的进程,即需要运行的程序。
id:runlevels:action:process
所以/etc/inittab中每一行都代表一个要启动的进程。
省略级别则表示所有级别生效。
id::sysinit:/etc/rc.d/rc.sysinit
系统的初始化脚本:rc.sysinit
ACTION:
initdefault:设定默认的运行级别
sysinit:系统的初始化
wait:等待级别切换,级别切换一次就执行一次,但是只是在切换到指定级别时执行。
respawn:重新启动,可能会启动多次,一旦程序终止会重新启动(指定级别下)
下面来说一说系统初始化脚本/etc/rc.d/rc.sysinit的任务:
系统初始化执行的脚本位于/etc/rc.d/rc.sysinit,此脚本间隙详细阅读,前两百行可以略过。
一是激活udev和SELinux
二是根据/etc/sysctl.conf文件来设定内核参数
三是设定系统时钟
四是装在键盘映射
五是启用交换分区
六是设置主机名
七是根文件系统检测,并以读写方式重新挂载
八是激活RAID和LVM设备
九是启用磁盘配额
十是根据/etc/fstab,检查并挂载其他文件系统
十一是清理过期的锁文件和PID文件
在/etc/rc#.d下的文件,K、S
K# 后面为数字,表示关闭的优先级,数字越小越优先关闭
S# 后面跟数字,表示开启服务的优先级,数字越小越优先。
我们应当遵循先关闭后启动的原则,先关闭以K开头的程序,在启动S开头的程序,都是链接文件。
只要一个陈故乡支持start,restart等等放入/etc/initrd/目录下,可以通过命令自动创建链接文件到/etc/rc.d/下的各级别下。
服务类脚本:
红帽在编排时遵循sys-V风格,在/etc/rc.d/init下的脚本,至少支持(接受)四个参数:start|stop|restart|status
额外的参数:
reload:无需重启读取配置文件,1号信号也能够重新加载配置文件
configtest:用于检测配置文件中是否有语法错误。
/etc/rc.d/init/下所有的脚本有两行:

#chkconfig:定义

#description
这一类脚本依靠这两个能够实现称为系统服务。
chkconfig命令:指定/etc/init.d下的这一类脚本,能够自动给他们创建连接到/etc/rc.d/rc#.d目录下,这一类脚本必须要有chkconfig、description两行。
#chkconfig #1# #2# #3#
1启动的级别,runlevels(345等等),
2SS启动的游优先顺序
3KK关闭的优先顺序
当chkconfig命令来为此脚本在rc#.d目录创建连接时,runlevels表示默认创建默认为S#开头的连接,除此之外的级别默认创建为K#。
description:描述信息
用于说明此脚本的简单功能,“\”为换行,每一行不能超过80个字符,否则在图形化界面显示不出来。
chkconfig、description为注释的内容,但是chkconfig命令会读取这两行中的内容。
一般来说,先开启的服务后关闭,后开启的服务先关闭。因为开启的服务可能有其他服务依赖。
当一个程序启动起来之后,就在/var/lock下创建一个锁文件,当程序关闭时就删除锁文件,我们可以通过锁文件判断程序是否运行。
chkconfig –list查看所有独立守护进程的启动设定
chkconfig—list [SERVICE_NAME]查看特定的进程
我们将脚本文件放在/etc/init.d目录下,使用chkconfig –add SERVICE_NAME 将脚本加入服务列表,加入由chkconfig控制的服务中去。
但凡能够在对应级别下可以设置其启动、停止状态的服务都叫独立守护进程(可以管理在哪些级别下是开启的,在哪些级别下是关闭的。)
卸载对应的进程:
chkconfig –del SERVICE_NAME 将创建连接的文件全部删除。
chkconfig –level RUNLEVES_NSME(on|off)改变守护进程的启动级别开关。
chkconfig runlevels SS KK
runlevels可以为一个短横线:- 表示没有级别默认为S#开头的链接,即所有的链接都以K#开头。
/etc/rc.d/rc.local脚本 /etc/rc.d/rc3.d/S99local
S99为所有服务的最后一个脚本,所以一些不期望写成服务加入守护进程,也不希望特别麻烦的操作,都可以写入到这个脚本中,随开机启动,在用户登录前执行。
local是系统启动时最后执行的脚本。
action:
respawn,只要进程停止就会重启,启动终端0-6,respawn用于终端和图形界面
继续讲一讲/etc/inittab的任务
一是设定默认的运行级别
二是运行系统初始化脚本
三是运行指定运行级别对应目录下的脚本
四是设定Ctrl+Alt+Del组合键的操作
五是设定UPS电源在电源故障/恢复时执行的操作
六是启动虚拟终端(2345级别)
七是启动图形终端(只在对应的级别下启动)
守护进程的类型:
独立守护进程
瞬时守护进程:不需要关联运行级别,由一个独立守护进程xinetd进行管理,xinetd被称为超级守护进程,对瞬时守护进程进行管理,需要时才启动。
xinetd超级守护进程:
用于管理瞬时守护进程,xinetd默认是没有安装的,当xinetd安装的时候,会有许多的瞬时守护进程,它没有运行级别的概念,有xinetd调用,我们需要知道的是,当我们将一个程序加入守护进程的时候,对当前的服务是没有影响的,重启才会生效,有需要时可以直接将对应的服务启动。
chkconfig [—level RUNLEVELS] SERVICE (on|off) 指定的级别如果省略。默认为2345级别。

「一键投喂 软糖/蛋糕/布丁/牛奶/冰阔乐!」

几人行

(๑>ڡ<)☆谢谢老板~

使用微信扫描二维码完成支付

版权声明:本文为作者原创,如需转载须联系作者本人同意,未经作者本人同意不得擅自转载。
添加新评论
暂无评论