参考: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. python 高阶函数、柯里化

    高阶函数 First Class Object 函数在python中是一等公民 函数也是对象,可调用的对象 函数可作为普通变量.参数.返回值等等 高阶函数 数学概念 y=g(f(x)) 在数学和计算机 ...

  2. MySQL创建及删除临时表

    示例SQL: drop temporary table if exists testdb.tmp_test_table; create temporary table testdb.tmp_test_ ...

  3. iOS-textfield控制光标开始位置

    //    UIView *paddingView1 = [[UIView alloc] initWithFrame:CGRectMake(0, 64, self.view.frame.size.wi ...

  4. oracle jdk和openjdk区别;idea如何加载jdk源码并调试jdk代码

    两个jdk的区别 oracle jdk是sun/oracle(甲骨文)公司的,部分jdk开源:相对比较稳定,使用的比较多. openjdk是完全开源的,据说是官方oracle唯一承认的开源版本. id ...

  5. pip3快速下载paddle

    安装百度的paddle paddle时很慢,后来采用国内的源,速度嗖嗖滴 pip3 install -U paddlepaddle -i https://pypi.douban.com/simple/ ...

  6. charles 新的修改请求

    本文参考:charles 新的修改请求 compose New 是新出一个弹窗,自己手动一个个的去写: 可以写各种状态: – URL: – Method: – GET – POST – PUT – D ...

  7. 用Inno setup制作以管理员权限启动的安装包

    inno setup制作的安装包,默认是不需要管理员权限启动的.我们制作安装包,往往需要做一些设置工作,这些设置工作可能用到管理员权限.使用Resource Hacker修改inno setup资源, ...

  8. SQL查询当天、本周、本月记录详解

    --查询当天: select * from info where DateDiff(dd,datetime,getdate())=0 --查询24小时内的: select * from info wh ...

  9. 在使用pandas 0.23.4对日期进行分组排序时报错

    date_df["rank_num"] = date_df.groupby("issuer_id").report_date.agg("rank&qu ...

  10. mysql 表字段部分替换

    update user set `ph` = REPLACE(`ph`,'shenji.osnt.me','60.210.113.147:555');