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

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文件就会连带运行。

总结流程图如下

 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值