参考:5 Best Modern Linux ‘init’ Systems (1992-2015)

参考:Linux开机流程

参考:《鸟哥的 Linux 私房菜:基础学习篇 第四版》第十七章、认识系统服务 (daemons)

前言

在Linux和其他类Uniux系统中,init process(初始化进程)是系统启动时由内核执行的第一个进程,其PID为1。init process静默运行在后台,直到系统关闭。

init进程负责启动所有其他进程,比如守护进程、服务和其他后台进程。因此,它是系统中其它所有进程之父。一个进程可以启动许多个子进程,如果在子进程没死之前父进程死了,孤儿进程(orphan process)的父进程会变成init进程。

本文所关注的init system就是内核之后的第一个程序,也就是init process。

如果init process无法启动,后面将不会启动任何进程,系统将进入一个名为“Kernel Panic”的阶段。

这么多年过去了,许多的init system在主流Linux发行版中脱颖而出。

System V Init

  System V (SysV) 是一个在类 Unix 系统中最成熟最受欢迎的init system,也是第一个商业 Unix 系统的init system。除了 Gentoo 使用自主的init system、Slackware 使用 BSD 风格的init system外,几乎所有的 Linux 发行版都率先使用 SysV 作为init system。SysV是 Unix/Linux 系统中所有进程的父进程。很多时候我们说init进程,实际上指的就是SysV。操作系统内核第一个调用的程序就是init,然后init去唤醒所有系统必须服务(本机的或者远端的)。
  随着时间的推移,SysV 由于一些设计上的缺陷,有几个 替代init scheme被开发出来。这些init scheme为 Linux 提供更加高效和完美的init system。 尽管这些替代方案都超越了 SysV 并提供了更多新特性,但它们仍然和原始 SysV 初始化脚本保持兼容。

CentOS 7.X后,便由systemd替代init。如果你去/etc/init.d/下面会有个README提示你

You are looking for the traditional init scripts in /etc/rc.d/init.d,
and they are gone? Here's an explanation on what's going on: You are running a systemd-based OS where traditional init scripts have
been replaced by native systemd services files. Service files provide
very similar functionality to init scripts. To make use of service
files simply invoke "systemctl", which will output a list of all
currently running services (and other units). Use "systemctl
list-unit-files" to get a listing of all known unit files, including
stopped, disabled and masked ones. Use "systemctl start
foobar.service" and "systemctl stop foobar.service" to start or stop a
service, respectively. For further details, please refer to
systemctl(). Note that traditional init scripts continue to function on a systemd
system. An init script /etc/rc.d/init.d/foobar is implicitly mapped
into a service unit foobar.service during system initialization. Thank you! Further reading:
man:systemctl()
man:systemd()
http://0pointer.de/blog/projects/systemd-for-admins-3.html
http://www.freedesktop.org/wiki/Software/systemd/Incompatibilities

SystemD

SystemD 即 System Management Daemon,Unix命名约定,喜欢在守护进程(daemon)后面加d。

在Linux 平台中,SystemD 是一个相对较新的init scheme。它由 Fedora 15 引入,集成了各类工具以便更好的管理系统。主要目的是:系统初始化、管理和跟踪OS启动过程中 和 OS运行时 所有的系统进程。 
Systemd 全面有别于其他传统的 Unix 初始化系统,特别是在系统和服务管理方面。它同样兼容 SysV 和 LBS 初始化脚本。 
其中较为突出的特性如下:

  • 纯粹、简单、高效的设计
  • 启动时的并发和并行处理
  • 更好的 API
  • 开启可选进程的移除功能
  • 使用 journald 来支持事件日志
  • 使用 systemd calender timers 来支持任务计划
  • 以二进制文件存储日志
  • 保存 systemd 的状态以待今后查看
  • 与 GNOME 更好整合实现等
  • 查看 Systemd 初始化系统简介:Understanding and administering systemd

The Story Behind ‘init’ and ‘systemd’: Why ‘init’ Needed to be Replaced with ‘systemd’ in Linux

Upstart

Upstart由 Ubuntu 的制作团队开发,是一个基于事件的初始化系统,用以替代 SysV。它可以启动不同的系统任务(system tasks)和进程、在系统运行时校验进程并在系统关闭时结束进程。 
Upstart是一个使用 SysV 和 Systemd 启动脚本的混合初始化系统。

Upstart 中值得一提的特性如下:

  • Ubuntu 的原生初始化系统,但可以运行在其他所有的发行版中
  • 基于事件启动/结束的任务和服务
  • 启动/结束任务和服务时生成事件
  • 可以由其他系统进程发送事件
  • 使用 D-Bus 和 init 进程通信
  • 用户可以启动/结束其各自的进程
  • 可以再现崩溃的进程等
  • 访问 Upstart 主页:http://upstart.ubuntu.com/index.html

OpenRC

OpenRC 是一个基于依赖关系的类 Unix 系统初始化方案,兼容 SysV。基本可以说是 SysV 的升级版,但必须要清楚记住的是:OpenRC 并非只是完全替代 /sbin/init 文件。 
它所提供的出色特性如下:

  • 可运行在包括 Gentoo 和 BSD 在内的多数 Linux 系统之中
  • 支持硬件触发的初始化脚本(LCTT 译注:如硬件热插拔所触发的)
  • 支持单个配置文件
  • 不支持单个服务配置文件
  • 以守护进程的方式运行
  • 并行服务启动等
  • 访问 OpenRC 主页:https://wiki.gentoo.org/wiki/OpenRC

runit

runit 同样是一个跨平台初始化系统,可以运行在 GNU/Linux、Solaris、BSD 和 Mac OS X 中,可用于替代 SysV,同时提供服务监控。 
相比于 SysV 和其他 Linux 初始化系统,它提供了一些好用和卓越的组件,如下:

  • 服务监控:每个服务都关联一个服务目录
  • 清理进程状态,以保证每个进程处于干净状态
  • 可靠的日志机制
  • 快速的系统启动和关闭
  • 可移植
  • 打包方便
  • 代码体积小等
  • 访问 runit 主页:http://smarden.org/runit/

总结

Linux 中的初始化系统负责启动和管理所有的进程。此外,SysV 是 Linux 系统中主要的初始化系统,但由于一些性能缺陷,系统开发者已经开发出几个替代品。 除了上面几种替代方案,还有其他方案未列出。

init system的更多相关文章

  1. we are experimenting with a new init system and it is fun

    http://0pointer.de/blog/projects/systemd.html Rethinking PID 1 If you are well connected or good at ...

  2. Linux’s init system & systemd

    一.init system 1.计算机是如何启动的 以早期 Fedora 系统为例. 1.开机 2.BIOS 和 GRUB(引导加载程序) 3.Linux 内核启动后,init 进程 是在 Fedor ...

  3. System.arrayCopy()和普通数组复制之间的效率差别

    都是System.arrayCopy() 效率高,到底有多高呢,拉出来遛遛就知道了: package JCF.ArrayList; import java.util.Date; public clas ...

  4. spring init

    DN学院讲师招募     Markdown编辑器轻松写博文     TOP 50 CTO坐镇直招     读文章说感想获好礼 通过Spring @PostConstruct 和 @PreDestroy ...

  5. java代码中init method和destroy method的三种使用方式

    在java的实际开发过程中,我们可能常常需要使用到init method和destroy method,比如初始化一个对象(bean)后立即初始化(加载)一些数据,在销毁一个对象之前进行垃圾回收等等. ...

  6. spring init method destroy method

    在java的实际开发过程中,我们可能常常需要使用到init method和destroy method,比如初始化一个对象(bean)后立即初始化(加载)一些数据,在销毁一个对象之前进行垃圾回收等等. ...

  7. i.mx6 Android5.1.1 初始化流程之init.rc解析(未完成)

    接上一篇:i.mx6 Android5.1.1 初始化流程之init进程 参考资料:http://blog.csdn.net/mr_raptor/article/category/799879 这个博 ...

  8. init() 方法

    1 /** * servlet init()在web应用程序启动之后,第一个请求到达Servlet之前调用. * 问题1:如果init()中需要处理大量的工作,那么servlet在处理第一个请求需要花 ...

  9. Spring报错: org.springframework.beans.factory.support.BeanDefinitionValidationException: Couldn't find an init method named 'init' on bean with name 'car'(待解答)

    在Spring工程里,有一个Car类的bean,Main.java主程序,MyBeanPostProcessor.java是Bean后置处理器. 文件目录结构如下: Car.java package ...

随机推荐

  1. 【C#设计模式3】工厂方法模式

    一.引言 在简单工厂模式中讲到简单工厂模式的缺点,有一点是——简单工厂模式系统难以扩展,一旦添加新产品就不得不修改简单工厂方法,这样就会造成简单工厂的实现逻辑过于复杂,然而本专题介绍的工厂方法模式可以 ...

  2. 【C/C++开发】运算符重载

    c++的一大特性就是重载(overload),通过重载可以把功能相似的几个函数合为一个,使得程序更加简洁.高效.在c++中不止函数可以重载,运算符也可以重载.由于一般数据类型间的运算符没有重载的必要, ...

  3. TCP 客户端编程

    1.Qt中TCP客户端编程 对Qt编程而言,网络只是数据传输的通道: Qt提供了QTcpSocket类(封装了TCP协议细节): 将QTcpSocket的对象当做黑盒使用,进行数据首发. 1.1QTc ...

  4. springboot使用activemq同时接收queue和topic消息

    原文链接:https://blog.csdn.net/jia_costa/article/details/79354478 新建springboot项目, pom文件如下 <?xml versi ...

  5. 第一周——不同java 的发展史你,注定成为不了领袖型人才

     James Gosling  1991年,James 高斯林在Sun公司的工程师小组想要设计这样一种小型计算机语言,该语言主要用于电视盒的消费类电子产品上.另外,由于不同的厂商选择不同的CPU和操作 ...

  6. sql server 日期函数

    一.sql server日期时间函数Sql Server中的日期与时间函数 1.  当前系统日期.时间     select getdate()  2. dateadd  在向指定日期加上一段时间的基 ...

  7. java--带参方法 递归阶乘

    package com.test.day01; // public class TestParam { public void f1(int n){ n =0; } public static voi ...

  8. 无线网卡SP-WL450U的驱动问题

    修改win10的设备驱动为需要的驱动,SP-WL450U的驱动问题 解决SP-WL450U的驱动问题,在电脑上安装无线网卡后,总是用不上5G信号,只能选择2.4G.重新安装程序后也不行,在反复试用后发 ...

  9. JDBC(Java项目使用Oracle数据库)

    Java项目中使用Oracle数据库(Eclipse) 前言 这学期选了Oracle数据库这门课,于是自己下载了Oracle11gR2版本的数据库.在这之前我一直用的是MySQL.虽然两者教程差不多, ...

  10. YAML 语言格式

    1. 认识 YAML YAML(Yet Another Markup Language)语言(发音 /ˈjæməl/ )是一个类似 XML.JSON 的标记性语言.YAML 强调以数据为中心,并不是以 ...