第六十五讲——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级别。 「一键投喂 软糖/蛋糕/布丁/牛奶/冰阔乐!」 赞赏 × 几人行 (๑>ڡ<)☆谢谢老板~ 2元 5元 10元 50元 100元 任意金额 2元 使用微信扫描二维码完成支付 版权声明:本文为作者原创,如需转载须联系作者本人同意,未经作者本人同意不得擅自转载。 给自己讲linux 2017-02-03 评论 1957 次浏览