Linux程序:Init
# 一、Init 程序
Init 程序是位于/sbin/init
的程序。Init 程序是Linux系统操作中不可缺少的程序之一。
Init 进程是 linux 系统启动时,在内核已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等之后,启动的一个用户级进程,来完成系统的启动。所以,Init 进程始终是第一个进程,其进程编号始终为1,Init 进程是所有进程的父进程,负责启动其它进程,这些进程大多数是服务进程。
Init 进程是一个守护进程,它将持续运行直至关机。
Init 程序主要有 SysV 、Upstart 、Systemd
。
大多数 Linux 发行版都使用如下的初始化系统之一:
- SysV 是更老的初始化系统,runlevel式启动。
- Upstart 是一个基于事件的传统的初始化系统的替代品,event-based启动。
- Systemd 是新的初始化系统,它已经被大多数最新的 Linux 发行版所采用。
Init 程序的目标:
- 希望更多的开机程序是并行开启的,而不是串行。
- 希望开机执行的程序越少越好、进入工作状态越快越好。
# 二、SysVinit(System V init daemon)
# 2.1 SysVinit 运行级别
SysVinit 是较早使用的 Init 程序,基于运行级别(run level)的原则。系统的运行级别表示当前计算机的状态。
系统以何种运行级别启动由 Init 读取 /etc/inittab
文件中的运行级别设置来确定。
运行级别定义具体如下:
运行级别 | 模式 | 含 义 |
---|---|---|
0 | halt | 关机,系统直接关机,不建议设为默认。 |
1 | single user mode | 单用户模式,救援或维护模式,可理解为 Windows 的安全模式,主要用于系统修复。 |
2 | multi-user mode,without NFS | 多用户模式,不含 NFS 服务,不完全的命令行模式,没有网络的纯文本模式。 |
3 | Full multi-user mode | 多用户模式,含 NFS 服务,完全的命令行模式,有网络的纯文本模式,即标准字符界面。 |
4 | unused | 系统保留,未使用。一般不应用。 |
5 | X11 | 图形模式,与 3 类似,但加载使用 X-windows,图形界面。 |
6 | reboot | 重启,系统直接重启,不建议设为默认。 |
Ubuntu 默认是没有 /etc/inittab
文件的,且运行级别的定义也有不同,具体如下:
0 => 关闭系统(halt)
1 => 单用户模式(single)
6 => 重启(reboot)
2,3,4,5 => 多用户模式(multi-user)
2
3
4
# 2.2 SysVinit 服务启动
- 启动与关闭服务的脚本存放在
/etc/rc[?].d
目录下。其中[x]
表示0~6
,分别对应级别0~6
,例如:运行级别为 2,将执行/etc/rc2.d/
下的脚本。 /etc/rcS.d/
路径下的脚本会先于/etc/rc[?].d/
执行。/etc/rc.local
会在/etc/rc[?].d/
路径下的脚本执行完成后,最后执行。- 启动与关闭服务的脚本命名以 K 开头(k=>kill)、S 开头(S=>start),K、S 后面跟着的数字,代表执行优先级,数字越小,执行顺序越高,优先执行,比如 K15 优先于 K20 被执行。当执行 K 开头的脚本,比如 K20acpid 会执行
/etc/init.d/acpid
脚本,并给脚本传递一个 stop 参数,指示其关闭 acpi daemon 服务。S 开头的会传递 start参数,指示其开启 acpi daemon 服务。 /etc/rc[?].d/
下面的脚本都是软链接,指向/etc/init.d/
中真正的执行脚本。
若要添加用户自定义的服务,需要将自定义服务的启动脚本放到 /etc/init.d/
路径下,并且在对应的运行级别目录下为其添加软链接即可。
服务管理工具:chkconfig、sevice、update-rc.d
常用命令:
显示切换前的运行级别 和 当前运行级别
runlevel
chkconfig
- 添加服务
chkconfig –add 服务名
- 使服务自动启动 sh
chkconfig –level 2345 服务名 on
- 使服务自动禁止
chkconfig –level 2345 服务名 off
- 删除服务
chkconfig –del 服务名
- 检查服务状态
chkconfig 服务名 status
- 显示所有已启动的服务
chkconfig –list
service
- 启动、停止、重启某服务
service 服务名 start | stop | restart
update-rc.d
- 删除服务
update-rc.d -f 服务名 remove
在Ubuntu 中系统定义的服务存放在 /etc/services
文件中。部分非常驻服务由 xinetd
服务控制。xinetd
服务配置文件保存在 /etc/xinetd.conf
。例如:Telnet 服务就是由xinetd 代理服务的。
# 2.3 SysVinit 执行流程
SysVinit 时代 Linux 启动流程:
BIOS
MBR
Grub
Linux-Kernel
Init
a. 运行
/sbin/init
b. 读取
/etc/inittab
(该文件定义了运行级别,在 Ubuntu 中演变为/etc/init/rc-sysinit.conf
)c. 执行
/etc/rc.d/rc-sysinit
(Ubuntu 中是/etc/init/rc-sysinit.conf
)d. 执行
/etc/rcS.d/
目录下的脚本e. 切换到默认的运行级别执行(Ubuntu 默认执行
" env DEFAULT_RUNLEVEL=2 " telinit "${DEFAULT_RUNLEVEL}"
执行/etc/rc2.d/
目录下的脚本)f. 执行
/etc/rc.local
(用户自定义的开机服务可放到该脚本中)g. 执行
/bin/login
(此时,已完成 Init 全过程)完成系统初始化,用户登录。
# 三、Upstart(Upstart init daemon)
Upstart init daemon 是 Sys V init daemon 的替代者,因为通过 /etc/inittab
的启动已经不能满足需要了,比如支持一些热插拔设备。Upstart 基于事件而非运行级别,可在系统启动、关闭、任务状态改变时启动或关闭服务。
Ubuntu 中就是使用 upstart 来启动系统的。Upstart 使用 /etc/init/
目录来决定系统在启动时运行哪些服务,可以通过 intctrl 来控制 Upstart 启动的服务。
# 3.1 Upstart 事件和作业
# 事件(Event):
事件就是 Init 得到的关于服务状态的变更信息。用户可通过 initctl emit 命令来手动触发一个事件,但通常情况下,事件是自动触发的。
Upstart的三种类型事件:
- Signal Event:异步且非阻塞的
- Method Event:同步且阻塞的
- Hook Event:同步且阻塞的
Upstart的三个主要进程:
- init: Upstart 主进程(PID=1)。职责是读取配置文件,处理各种服务和应用程序的依赖关系。根据事件来启动这些功能和服务,并动态的进行管理。
- initctl: Upstart 事件管理器。可被应用程序用来通知 init 哪些事件发生。initctl list 可类比 SysVinit 的 chkconfig工具。
- telinit: 管理运行级别。要研究 Upstart 是如何兼容 SysVinit 的,就要从telinit入手。
# 作业(Job):
作业是 Init 可以理解的一系列指令。用户可以用 initctl start 和 initctl stop 命令手动启动或终止一项工作,作业有10种状态。
Upstart的三种类型作业:
- 任务(Task):运行、并在执行结束后返回到等待状态的工作;
- 服务(Services):通常不会自己结束到工作;
- 抽象作业(Abstact job):只存在于 Upstart 内部。没有PID,定义 “永久运行” 的作业。
# 3.2 Upstart 服务启动
Upstart 的所有服务放在 /etc/init/
目录下,以服务名 .conf
文本文件存放。
*.conf 配置文件中:
- start on、stop on: 服务的依赖关系;
- exec: 服务启动命令;
- respawn :设置服务异常停止后服务自动重启;
- script ... end script :服务启动前后执行脚本;
若要在开机启动自定义服务,只要向 /etc/init/
中添加 自定义服务 .conf
配置文件即可。
服务管理工具:initctl
常用命令:
查看所有服务状态
initctl list
启动、停止、重启服务
initctl start | stop | restart 服务名
# 3.3 Upstart Init 执行流程
Upstart 下 Init 执行流程:
BIOS
MBR
Grub
Linux-Kernel
Init
a. 运行
/sbin/init
b. Upstart 内部初始化,触发 startup 事件
c. 触发依赖 startup 事件的服务,主要包括挂载文件系统、本地回环网络(即定义了 start on startup 的服务脚本)
d. 触发 rc-sysinit 事件
/etc/init/rc-sysinit.conf
,首先执行/ec/rcS.d/
目录下的脚本(事实上,此后的过程与 SysVinit 执行过程类似)e. 切换到默认的运行级别执行脚本。(Ubuntu 默认是
" env DEFAULT_RUNLEVEL=2 " telinit "${DEFAULT_RUNLEVEL}"
)f. 执行
/etc/rc.local
g. 执行
/bin/login
(此时,已完成 Init 全过程)完成系统初始化,用户登录。
# 四、Systemd(Systemd init daemon)
- Systemd 是 Linux 下与 SysV 和 LSB 初始化脚本兼容的系统和服务管理器。
- Systemd 使用 socket 和 D-Bus 来开启服务,提供基于守护进程的按需启动策略, 保留了 Linux cgroups 的进程追踪功能,支持快照和系统状态恢复,维护挂载和自挂载点,实现了各服务间基于从属关系的一个更为精细的逻辑控制,拥有前卫的并行性能。
- Systemd 同样是 SysV init daemon 的替代者,无需经过任何修改便可以替代 SysVinit 。
- Systemd 的特点是:与 SysVinit 完全兼容、更清晰的服务依赖关系、开机系统初始化服务并行启动、更少的shell开销、更有效地引导加载服务。
- systemd 的目标是:尽可能启动更少进程,尽可能将更多进程并行启动,尽可能减少对shell脚本的依赖。传统sysvinit使用inittab来决定运行哪些shell脚本,大量使用shell脚本被认为是效率低下无法并行的原因。
Systemd 管理体系使用运行目标(target)取代 SysVinit 的运行级别(runlevel)。
Systemd 运行目标 tartget 的命名类似于 multi-user.target 等这种形式,比如:
运行级别3(run level 3)<=> 多用户模式目标(multi-user.target)。
运行级别5(run level 5)<=> 图形模式目标(graphical.target)。
默认的target相当于默认运行级别,通过软链来实现,如:ln -s /lib/systemd/system/graphical.target /etc/systemd/system/default.target。
在 /lib/systemd/system/
下面定义 runlevelX.target
文件是为了能够兼容运行级别的管方式。实际上 /lib/systemd/system/runlevel3.target
是被软连接到 multi-user.target
的。
# 4.1 Systemd 服务启动
服务配置文件放在 /lib/systemd/system/
目录下,以 *.service
命名。没有运行级别的概念,但是完全兼容 SysVinit 。
服务管理工具:systemadm (图形化)
常用命令:
查看当前运行级别
systemctl get-default
设置服务 自动启动 | 非自动启动
systemctl enable | disable *.service
服务启动 | 停止 | 重启
systemctl start | stop | restart *.service
查看服务状态
systemctl status *.service
查看所有可用单元
systemctl list-unit-files
查看所有运行的单元
systemctl list-unit-files | grep enabled
查看所有可用服务
systemctl list-unit-files --type=service
查看所有运行的服务
systemctl list-unit-files --type=service | grep enabled
屏蔽 httpd 服务
systemctl mask httpd
# 4.2 Systemd Init 执行流程
Systemd init 执行流程:
# 五、SysVinit 和 Systemd
SysVinit :
启动时间长,init进程是串行启动,只有前一个进程启动完,才会启动下一个进程
启动脚本复杂,Init进程只是执行启动脚本,不管其他事情,脚本需要自己处理各种情况,这往往使得脚本变得很长
由Linux内核加载运行,位于 /sbin/init ,是系统中第一个进程,PID永远为1
对于支持 service 的程序,安装的时候,会自动的在 /etc/init.d 目录添加一个配置文件。
进程的配置文件
参数 说明 /etc/init.d/ 服务启动脚本配置文件存放目录 /etc/inittab 默认运行级别配置文件 /etc/init/rcS.conf 系统初始化配置文件 /etc/init/rc.conf 各运行级别初始化的配置文件 /etc/init/rcS-sulogin.conf 单用户模式启动 /sbin/sushell 环境的配置文件 /etc/init/control-alt-delete.conf 终端下的 ctrl+alt+del 热键操作的配置文件 /etc/sysconfig/init tty终端的配置文件 /etc/init/start-ttys.conf 配置tty终端的开启数量、设备文件 /etc/init/tty.conf 或 /etc/init/serial.conf 控制tty终端的开启
Systemd:
按需启动服务,减少系统资源消耗。
尽可能并行启动进程,减少系统启动等待时间
由Linx内核加载运行,位于 /usr/lib/systemd/systemd ,是系统中第一个进程,PID永远为1
对于支持 systemd 的程序,安装的时候,会自动的在 /usr/lib/systemd/system 目录添加一个配置文件。
进程的配置文件
参数 说明 /etc/systemd/system/default.target 取代/etc/inittab文件配置,通常符号链接到 /lib/systemd/system/graphical.target /run/systemd/system/ 系统执行过程中所产生的服务脚本所在目录 /etc/systemd/system/ 里面存放着不同级别的开启自启服务 /usr/lib/systemd/system/ 和 /lib/systemd/system/ 和,两个文件完全一样,因为lib是/usr/lib的软链接 每个服务最主要的启动脚本设置,类似于之前的 /etc/init.d/

