Linux程序:Init

5/3/2022 运维操作系统Linux

# 一、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)
1
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
1

chkconfig

  • 添加服务
chkconfig –add 服务名
1
  • 使服务自动启动 sh
chkconfig –level 2345 服务名 on
1
  • 使服务自动禁止
chkconfig –level 2345 服务名 off
1
  • 删除服务
chkconfig –del 服务名
1
  • 检查服务状态
chkconfig 服务名 status
1
  • 显示所有已启动的服务
chkconfig –list
1

service

  • 启动、停止、重启某服务
service 服务名 start | stop | restart
1

update-rc.d

  • 删除服务
update-rc.d -f 服务名 remove
1

在Ubuntu 中系统定义的服务存放在 /etc/services 文件中。部分非常驻服务由 xinetd 服务控制。xinetd 服务配置文件保存在 /etc/xinetd.conf。例如:Telnet 服务就是由xinetd 代理服务的。

# 2.3 SysVinit 执行流程

SysVinit 时代 Linux 启动流程:

  1. BIOS

  2. MBR

  3. Grub

  4. Linux-Kernel

  5. 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 全过程)

  6. 完成系统初始化,用户登录。

# 三、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
1

启动、停止、重启服务

initctl start | stop | restart  服务名
1

# 3.3 Upstart Init 执行流程

Upstart 下 Init 执行流程:

  1. BIOS

  2. MBR

  3. Grub

  4. Linux-Kernel

  5. 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 全过程)

  6. 完成系统初始化,用户登录。

# 四、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
1

设置服务 自动启动 | 非自动启动

systemctl enable | disable *.service
1

服务启动 | 停止 | 重启

systemctl start | stop | restart *.service
1

查看服务状态

systemctl status *.service
1

查看所有可用单元

systemctl list-unit-files
1

查看所有运行的单元

systemctl list-unit-files | grep enabled
1

查看所有可用服务

systemctl list-unit-files --type=service
1

查看所有运行的服务

systemctl list-unit-files --type=service | grep enabled
1

屏蔽 httpd 服务

systemctl mask httpd
1

# 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/
img img
上次更新时间: 9/25/2024, 1:19:15 AM