您的位置:首页 > 运维架构 > Linux

Linux入职基础-4.11_系统启动过程(4):init初始化

2018-03-03 15:49 555 查看
Linux系统启动过程(4):init初始化
上节回顾:详解见上一篇《Linux内核(vmlinuz)启动》。Linux内核会在其进程空间内加载init程序,并把控制权交给init进程,由init进程继续来完成接下来的系统引导工作,Linux内核的引导部分也到此结束。
本节开始:
Init(/sbin/init)进程是内核引导过程完成时创建的第一个进程,该文件会读取/etc/inittab文件,对组成Linux的服务和应用程序进行初始化。
当系统关闭时,init负责杀死所有其它的进程,卸载所有的文件系统以及停止处理器的工作,以及任何它被配置成要做的工作。





一了解关联init初始化的主要目录的文件



/etc/rc.d/init.d
该文件夹包含所有服务在各个运行等级中的全部启动脚本。每个脚本最少接受两个参数start和stop,它们分别代表启动和停止服务(如网页服务)。
除此之外,init脚本通常还会接受一些额外的选项,如restart(重启服务器)、status(返回服务当前状态)、reload(告知服务从配置文件中重新载入配置)以及force-reload(强制服务重载它的配置)。
/etc/rc.d/rc.sysinit
etc/rc.d/rc.sysinit主要做在各个运行模式中相同的初始化工作,包括设定PATH、设定网络配置(/etc/sysconfig/network)、启动swap分区、设定/proc等等。
/etc/rc.d/rc0.d~/etc/rc.d/rc6.d
这些文件夹分别包含每个运行等级对应的init脚本。它们一般通过符号链接到/etc/init.d文件夹下的实际文件。
这些文件夹下的init脚本都有一些特别的名字,命名都以S(start)、K(kill)或D(disable)开头,后面跟一个数字。
当init进入一个运行等级的时候,它会按照数字顺序运行所有以K开头的脚本并传入stop参数,除非对应的init脚本在前一个运行等级中没有启动。然后init按照数字顺序运行所有以S开头的脚本并传入start参数。任何以D开头的init脚本都会被忽略—这让你可以在指定的运行等级禁止一个脚本,或者你也可以仅仅移除全部符号链接。
/etc/rc.d/rc.local
通常它是一个留给用户修改的shell脚本。一般会在init进程结束的时候运行它,所以你可以在这里放一些想要运行的额外脚本,而不用再创建自己的init脚本。
/etc/rc.d/rc
当运行级别改变时,负责启动/停止各种服务。
二、init执行的基本流程:
⑴、读取与解析/etc/inittab文件, inittab 文件摘录如下:
[root@lamp01 /]#vim /etc/inittab
# Defaultrunlevel. The runlevels used by RHS are:
id:5:initdefault:
# Systeminitialization.
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc0  // rc N;用rc脚本去运行rcN.d目录下的脚本
l1:1:wait:/etc/rc.d/rc1
l2:2:wait:/etc/rc.d/rc2
l3:3:wait:/etc/rc.d/rc3
l4:4:wait:/etc/rc.d/rc4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc6
# TrapCTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown-t3 -r now
# Run gettys instandard runlevels
1:2345:respawn:/sbin/mingettytty1
2:2345:respawn:/sbin/mingettytty2
3:2345:respawn:/sbin/mingettytty3
4:2345:respawn:/sbin/mingettytty4
5:2345:respawn:/sbin/mingettytty5
6:2345:respawn:/sbin/mingettytty6
inittab配置文件使用通用格式定义了几项内容:
id:runlevels:action:process
id 是惟一标识该项的字符序列,无实际含义;
runlevels 定义了操作所使用的运行级别;
action 指定了要执行的特定操作;
process 定义了要执行的进程。
action值
含义
initdefault:
指定一个默认的运行级别,只有当init一开始被调用时才扫描这一项。
如果runlevel字段指定了多个运行级别,其中最大的数字是默认的运行级别;如果inittab文件中没 有包含initdefault的记录项,则在系统启动时请求用户为它指定一个初始运行级别。
sysinit:
启动process指定的进程,在访问控制台之前执行,init需要等待该进程运行结束后才继续扫描inittab文件中的下一记录项。
wait:
启动process字段指定的进程,必须等到该进程执行结束才去继续扫描inittab文件中的下一记录项。
respawn:
启动process字段指定的进程;init不等待该进程处理结束,而是继续扫描inittab文件中的后续进程。
ctrlaltdel:
允许init在用户于控制台键盘上按下Ctrl+Alt+Del组合键时,重新启动系统。
bootwait:
系统启动后,当第一次从单用户模式进入多用户模式时处理这样的记录项,init启动这样的进程,并且等待它的处理结束,然后再进行下一个记录项的处理,当这样的进程终止时,系统也不重启它。
/etc/inittab文件最主要的作用就是设定Linux的运行等级, “:id:5:initdefault:”,这就表明Linux需要运行在等级5上。
Linux的运行等级设定如下:



⑵、执行rc.sysinit
在设定了运行等级后,Linux系统执行的第一个用户层文件就是/etc/rc.d/rc.sysinit脚本程序,根据脚本中的代码它做非常多的工作,包括设定PATH、设定网络配置(/etc/sysconfig/network)、启动swap分区、设定/proc、配额、加载模块等等。



如果你有兴趣,可以到/etc/rc.d中查看一下rc.sysinit文件,主要实现以下的功能:
A.  获取网络环境及主机类型
B.  测试与载入内存设备/proc及USB设备/sys
C.  决定是否启动SELinux
D.  接口设备的检测与即插即用(PNP)参数的测试
E.  用户自定义模块的加载
F.  加载核心的相关设置
G.  设置系统时间
H.  设置中断控制台(console)的字形
I.  设置RAID与LVM等硬盘功能
J.  以fsak检验磁盘文件系统
K.  进行磁盘配额quota的转换(非必要)
L.  重新以可读取模式载入系统磁盘
M.  启动quota的功能
N.  启动随机数设备
O.  清除启动过程中生成的临时文件
P.  将启动相关信息加载到/var/log/message文件中
运行过程如下:



⑶、执行不同运行级别的脚本程序
系统会根据默认的运行级别,来对应执行相应级别下的脚本(运行rc0.d到rc6.d中的相应的脚本程序),该处脚本是链接文件,链接到init.d中相对应的文件,真正运行的是init.d里的脚本。继续来完成相应的初始化工作和启动相应的服务。



K01dnsmasq ->../init.d/dnsmasq 链接关系如下图:



注:etc/rc.d/rcN.d/(N:0~6)目录下文件命名时以S或K开头,后面跟上0-99的数字;S代表启动时执行;K代表关闭时执行;01-99代表启动或关闭的级别(数字越小越优先)。
⑷、执行rc.local脚本



rc.local就是在一切初始化工作后,Linux留给用户进行个性化的地方。你可以把你想设置和启动的东西放到这里。
⑸、执行/bin/login程序,进入登录状态
I、命令行登录
II、ssh登录
III、图形界面登录
现在来介绍这三种登录方式:
I、命令行登录:
init进程调用getty程序(意为get teletype),让用户输入用户名和密码。输入完成后,再调用login程序,如果密码正确,就从文件 /etc/passwd 读取该用户指定的shell,然后启动这个shell(Linux默认的shell是Bash,简单说就是命令行界面)。
首先读入 /etc/profile,这是对所有用户都有效的配置;
然后依次寻找下面三个文件,这是针对当前用户的配置。
  ~/.bash_profile
  ~/.bash_login
  ~/.profile
需要注意的是,这三个文件只要有一个存在,就不再读入后面的文件了。比如,要是 ~/.bash_profile 存在,就不会再读入后面两个文件了。



II、ssh登录:
这时系统调用sshd程序(Debian还会再运行/etc/pam.d/ssh),取代getty和login,然后启动shell。
接下来读入 /etc/profile,与第一种情况完全相同。
III、图形界面登录:
init进程调用显示管理器,Gnome图形界面对应的显示管理器为gdm(GNOME Display Manager),然后用户输入用户名和密码。如果密码正确,就读取/etc/gdm/Xsession,启动用户的会话。
其次,图形界面登录只加载 /etc/profile 和 ~/.profile。也就是说,~/.bash_profile 不管有没有,都不会运行。
用户进入操作系统以后,常常会再手动开启一个shell。这个shell就叫做non-login shell,它不同于用户登录时出现的那个shell,它不读取/etc/profile和.profile等配置文件。但是它会读入用户自己的bash配置文件 ~/.bashrc。大多数时候,我们对于bash的定制,都是写在这个文件里面的。



只要运行~/.bash_profile文件,~/.bashrc文件就会连带运行。
总结流程图如下
 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: