以下是全文翻译,增加了目录,原文请看: https://blog.darknedgy.net/technology/2015/09/05/0/

目录

现代初始系统的历史(1992-2015)

  • IBM系统资源控制器(1992)
  • daemontools(1997)+衍生物(1997-2015)
  • rc.d (2000)
  • simpleinit,jinit和need(8)concept(2001-3)
  • minit(2001-2)
  • depinit(2002)
  • daemond(2002-3)
  • GNU dmd(2003)
  • pinit(2003)
  • initng(2005)
  • launchd (2005)
  • 服务管理设施(SMF)(2005)
  • eINIT(2006)
  • upstart (2006)
  • Asus eeePC fastinit +衍生品(2007-2015)
  • OpenRC (2007)
  • Android init(2008)
  • systemd (2010)
  • procd(2012)
  • Epoch(2014)
  • sinit(2014)

最后的笔记
评论

现代初始系统的历史(1992-2015)

通过VR

类Unix系统的进程管理,监督和init(8)的主题受到大量的历史性和“流行文化”解释的困扰。这导致围绕功能集的大量混淆和误解,以及如何在Unix上制定围绕可靠流程管理的问题,使其成为所有说服的煽动者的成熟主题。

就GNU/Linux而言,最常见的年表是首先是sysvinit。它吸了很长时间,但无论出于何种原因,没有人对它做任何事情,直到Apple创建了launchd,这启发了Ubuntu制作(或取决于你同情的人,NIH)Upstart只是为了用CLA来阻碍它。然后在2010年systemd改变了一切。哦,与此同时,Gentoo做了一件名为OpenRC的事情。

事实上,事件和解决方案的时间表很难理解,这通常会使人们对现有解决方案的新颖程度产生影响。最关键的是,如果没有良好的历史理解,你就无法从以前的事业中犯错,也许最终会在设计中不必要地犯同样的错误。

本文的目的是直接记录创建“现代”init系统的历史记录,我们将“现代”定义为广泛用于尝试改进经典BSD和System V初始化和服务管理方式的任何内容。 。

本文并非旨在传授任何技术判断,而是简单地记录已完成的工作,以便对系统软件研究感兴趣的人,特别是Unix过程监督,可以将其用作现有技术的快速参考。同样重要的是,它旨在让更多的随意读者了解这个问题空间中解决方案的历史,并希望扩大他们对这个有争议的问题的视野。

它不一定会进行深入的技术分析,而是提供一般概述和链接以获取更多信息。

(在我们开始之前,本文不会涵盖那些无法适应init(8)守护进程的基本主管,例如supervisord,monit,Circus,God,bluepill和Eye。这些很受网络开发人群的欢迎,考虑到其中很多都是基于在Python或Ruby等语言上,它们不是init系统,通常也不是新颖的。)

IBM系统资源控制器(1992)

可能是为IBM AIX编写的第一个现代init系统。它是第一个坚持现在众所周知的监督语义,即没有服务守护自己,而是由主管本身守护它们。

它也是第一个不仅在守护进程上运行,而是“子系统” - 可以是守护进程和辅助程序组。13年后,Solaris SMF将重用相同的原则。

SRC是一个完全包含的框架,具有启动,停止,重新启动和获取子系统状态的工具。

SRC不依赖于脚本甚至是传统的服务配置,而是依赖于使用命令在其自己的对象数据库中注册子系统和服务器。同样,SMF将通过引入用于存储运行时数据和持久性配置的服务配置存储库来回应这一点,尽管仍然以XML清单的形式保留用户可见的配置文件。

daemontools(1997)+衍生物(1997-2015)

麦克斯韦的Unix进程管理方程。

丹尼尔·伯恩斯坦(Daniel J. Bernstein)最初于1997年发行,后来它继续发挥巨大的影响力,并且经常习惯于今天。它激发了一些衍生品并直接影响了那些偏离其模型的系统,如minit,ninit和depinit。

事实上,所有init系统都可以并且已经以一种或另一种形式映射为daemontools的超集(例如systemd => nosh)。

请参阅JdeBP的“守护神之家 ”,Wayne Marshall的“djb方式”中的daemontools部分以及伯恩斯坦自己的页面,以获得比我所能给出的更好的概述。

rc.d(2000)

rc.d是一个模块化的,基于依赖性的initscript框架,最初由NetBSD于2000年左右采用,主要由Luke Mewburn设计。它已经扩展到其他BSD,取代旧的,完全平坦的/etc/rc。

在rc.d中,init(8)守护进程执行/etc/rc,它运行rcorder(8)程序,用于计算/etc/rc.d/中对initscripts的排序依赖性。Initscripts是以一种干净的标准格式编写的,它基于一个名为/etc/rc.subr的公共子程序文件,所有的initscripts都来自该文件。反过来,从/etc/rc.conf文件(由/etc/rc提供的shell脚本)处理启用/禁用,命名服务配置和其他模块的服务的全局系统和服务启动行为。简单的键值对。

rc.d设法保持高度的可配置性和灵活性,最常见的关于基于System V initcript的系统的痛点被彻底根除,但它再次被限制为基本的设计管理框架。Arch Linux在2012年迁移到systemd之前使用了类似rc.d的设置。

simpleinit,jinit和need(8)concept(2001-3)

理查德·古奇(Richard Gooch)在他2002年的论文“ Linux Boot Scripts ”中设想了SysV和BSD之间的中间地带。

简而言之,它基于/sbin/init.d中的简短脚本的平面目录,提供服务并通过使用两个小实用程序进行同步:need(8)和provide(8),它们依次符号链接到initctl的argv [0](8)。

这两个原语旨在废弃运行级别,支持状态转换并提供依赖关系管理。提供(8)基于名称注册服务,并且需要(8)根据名称是否存在以阻塞方式启动或停止服务。显示服务(8)用于状态列表。否则,保留标准SysV inittab(5)。另请参见initctl(8)联机帮助页。

它确实获得了一些适度的成功,包括在几个嵌入式或实验性项目中,以及作为基于依赖性的init的早期示例。它至今仍被至少一个活跃发行版源码Mage GNU / Linux使用。

simpleinit直接激发了John Fremlin在C ++中编写了一个名为jinit的衍生产品,该产品异常地将System V消息队列用于其IPC。它自2003年以来一直没有更新。

minit(2001-2)

由Fefe(Felix von Leitner)设计,它可以被描述为倒置(内生)daemontools。

daemontools为每个服务生成一个单独的监督过程,minit将其统一到一个中央msvc主管。它还有一个非常基本的依赖系统,通过每个服务目录有一个“依赖”文件,实际上只是一种计算服务排序的方法。它可以同步和异步启动服务。

它非常小,占地面积极小,旨在链接到由同一作者制作的dietlibc。一个2004年呈现在Linux的Kongress大会进入背后MINIT原则的更多细节。

Nikola Vladov后来在2007年左右开始创建ninit,它通过更多服务配置选项扩展了minit,并增加了sysvinit兼容性。

depinit(2002)

depinit,由理查德·莱特曼(Richard Lightman)于2002年左右撰写,是一个自称为“[并入]来自sysvinit,simpleinit,daemontools和make”的思想的系统。

它支持并行服务启动,这是一个相对智能(当时)的依赖系统,其中必须停止某些事件时计算最少数量的从属服务,通过管道旋转记录器以及如何操作进程的用户可配置信号。它避开了运行级别,转而支持在文件系统中按名称对服务进行分组,并且具有完全自包含的关闭过程,该过程不依赖于脚本。

它使用了shell脚本,但由于拥有一个理智的流程管理系统,因此它们更加简洁。遗憾的是,它没有获得重大通知而已经消失。

daemond(2002-3)

虽然很少有人知道但历史上有趣的系统,daemond在解决依赖关系的时间系统(包括内核模块的特殊节)中有一个相对错综复杂的系统,并且它自己的配置语法基于可以选择包含来自shell脚本的片段的块(类似于Upstart)工作)。
例:

service "fsck" {
description "Check filesystems";
require "lvm";
setup "/sbin/fsck -C -R -A -a";
}service "mount-local" {
require "fsck";
description "Mount local filesystems";
setup "/sbin/mount -a -v -t nonfs,nosmbfs";
}

除了服务之外,它还从/etc/daemond.rc读取初始配置文件,并围绕快速并行启动进行设计。
它的依赖节如下:

require "file-or-service";
This states that the service cannot be started at all unless the
file is present, or the service has been succesfully started.need "file-or-service";
Same as require, except that if the dependency cannot be satisfied
then the entire service is made unavaliable, as though it did not
exist (so that services that depend on it will be able to proceed).
This is useful when you want a service that must start when some
condition is met, but which is optionnal otherwise.want "service";
This is not a proper dependency, but a 'collaborating' service.  This
directive states that if the service where it appears starts, then
service must be attempted as well, but need not succeed.require module "module";
need module "module";
Same as the first two, but for kernel modules.  It is usually better
to rely on kernel autoloading for the most part.group "group";
This places the service in a group.  That group can then be refered
to as if it was a service (starting all of the group) and will be
deemed successful if all the members of the group are started,
unless...require any "group";
...is used, in which case the group will be deemed succesful if /any/
service in the group is started.mode "mode" { ... };
This defines a target mode (akin to init's runlevels).  It can only
contain dependencies.

它是用C ++而不是C编写的,作者显然有野心,在他的自述文件中说:

我希望有一天能成为antedeluvian SysV>BSD inits的主流替代品,它需要受到很多人的打击。如果您>创建了服务定义文件以使系统正常启动,我几乎肯定想要一个副本 - 特别是如果您使用标准分发 - >以便我也可以分发它们。

它没有留下印象。

GNU dmd(2003)

dmd(daemon manage daemons)是一个最初由WolfgangJährling于2003年推出的系统,最着名的是完全可以在Guile Scheme中编写和配置。

近十年来它一直处于昏迷状态(如果不是死的),它在2013年作为Guix交易包管理系统的一部分重新启动,该系统也是用Guile编写的。今天,它被用作Guix系统分发的init守护进程和服务管理器。

它具有良好的文档记录并且通常很简单,基于提供/需求关系形式的依赖关系,并且服务配置例程是可重用的Scheme宏,包括用于封装各种执行规程的所谓构造函数。

由于底层Scheme语言的首要地位,因此它具有非常灵活和可扩展性。以下是GuixSD来源的示例:

(define (root-file-system-service)
"Return a service whose sole purpose is to re-mount read-only the root file
system upon shutdown (aka. cleanly \"umounting\" root.)This service must be the root of the service dependency graph so that its
'stop' action is invoked when dmd is the only process left."
(with-monad %store-monad
(return
(service
(documentation "Take care of the root file system.")
(provision '(root-file-system))
(start #~(const #t))
(stop #~(lambda _
;; Return #f if successfully stopped.
(sync)(call-with-blocked-asyncs
(lambda ()
(let ((null (%make-void-port "w")))
;; Close 'dmd.log'.
(display "closing log\n")
;; XXX: Ideally we'd use 'stop-logging', but that one
;; doesn't actually close the port as of dmd 0.1.
(close-port (@@ (dmd comm) log-output-port))
(set! (@@ (dmd comm) log-output-port) null);; Redirect the default output ports..
(set-current-output-port null)
(set-current-error-port null);; Close /dev/console.
(for-each close-fdes '(0 1 2));; At this point, there are no open files left, so the
;; root file system can be re-mounted read-only.
(mount #f "/" #f
(logior MS_REMOUNT MS_RDONLY)
#:update-mtab? #f)#f)))))
(respawn? #f)))))

pinit(2003)

pinit是一个鲜为人知但却非常重要的初始系统,由Wouter von Klaunen设计,大约在2003年。

它可以说是第一个使用XML作为其服务配置语言的系统,甚至早于launchd和SMF。这些类似于以下内容:

<?xml version="1.0"?>
<command provides="system.swap">
<startup message="Activating all swap partitions...">
/sbin/swapon -a
</startup>
<shutdown message="Deactivating all swap partitions...">
/sbin/swapoff -a
</shutdown>
<dependency name="system.checkfs"/>
</command>

可以证明,它有一个依赖系统(更多的是基于排序的,而不是像SMF或systemd那样的完全事务依赖解析器)。它支持并行服务启动,也可能是第一个拥有插件系统的人。也就是说,各种启动过程,而不是硬编码到init守护程序或作为脚本启动,是作为共享对象动态加载到pinit的地址空间中或从pinit的地址空间卸载的,尽管似乎没有正式定义的API。

预留运行级别以支持静态配置文件,列出启用/禁用状态转换的内容,与systemd预设不同。

与其前辈相比,它有点重量级,使用libxml和GLib作为其实用程序库。

它被遗弃,最终没有给人留下印象。

initng(2005)

最初由Jimmy Wennlund于2005年3月发布并在Gentoo系统上进行了大量测试,initng是一个更雄心勃勃,更完整的新学校系统。除了通常的流程管理,监督,服务分组(这里称为运行级别),依赖性和并行性之外,它最引人注目的是其极其全面的插件系统,在最终版本的基础系统中有47个。插件能够连接到20多个专用于initng的不同分段子系统。这些都记录在这里,但它们有效地将init守护进程转换为专用模块加载器和处理程序。

服务本身是以基于块的格式配置的,称为ifiles,initng提供许多预先写好的文件,例如

service service/aumix {
use = service/alsasound;
need = system/initial system/bootmisc;
stdall = /dev/null;
script start = {
if [ -f /etc/aumixrc ]
then
@/usr/bin/aumix@ -f /etc/aumixrc -L
else
@/usr/bin/aumix@ -v75 -c75 -w75
fi
};
exec stop = @/usr/bin/aumix@ -f /etc/aumixrc -S;
}

因此,它可以被视为meta-init的综合示例。

它曾被Ubuntu考虑过,但他们最终决定创建Upstart。从那以后,initng项目悄然死亡,几乎没有成功。

launchd(2005)

可以说是第一个“新学校”初始化系统,其特点是在使用控制实用程序与init(8)守护进程通信时,所有逻辑都包含在内。通过XML plists配置。在OS X中,它也是Mach内核服务的引导守护程序(发现注册表)。推广“套接字激活”的流行语。从代理(每个用户)隔离守护进程(系统范围),后者被分组为焊接到OS X特定子系统(如loginwindow或Aqua UI)的类型。围绕纯粹的延迟加载服务,没有正式的依赖模型,而是期望服务在整个OS X堆栈的其余部分通过IPC同步。Couples将类型处理为调度策略和资源限制,显然意味着保留桌面响应。

它被认为是Ubuntu,由于许可原因(当时它使用GPL不兼容的Apple Public Source License)而被丢弃。目前正在由NextBSD项目进行探索,并可能在以后的FreeBSD中进行探索。

服务管理设施(SMF)(2005)

Solaris SMF可能是第一个拥有复杂事务依赖系统的系统,这些系统在内部图形引擎中进行跟踪。专为复杂的服务器管理方案而设 与Solaris Fault Manager深度集成以跟踪硬件异常,每个服务都通过FMRI(故障管理资源标识符)进行识别。使用XML清单配置服务,然后将其编译到称为服务配置存储库的数据库中(服务也可以选择存储运行时数据),可以使用svcprop(1)读取并使用svccfg(1)动态配置。服务实例本身通过svcadm(1)控制,并通过svcs(1)获得状态。

SMF区分主重启动器(svc.startd,默认依赖关系管理器)和委托重启器,它们导出与主重启器相同的服务状态,但具有不同的特定于应用程序的行为。在Solaris下,inetd是一个委托的重新启动器。

可以在Oracle文档中找到更多信息。

eINIT(2006)

与initng类似,它基于大量插件,init守护进程只是一个处理程序。也针对Gentoo。以XML格式配置。比initng明显更高的元可配置性,每个模块都可以在einit.xml清单中使用XML进行配置。基于提供/需要类型的依赖项和事件子系统,但更多内部事件(如监视模块加载/卸载)比服务注册的内容更多。

例:

<einit prefix="services-virtual-module">
<daemon id="daemon-boinc"
name="BOINC client"
provides="boinc"
requires="mount-critical"
command="cd /var/lib/boinc; boinc_client"
restart="yes" />
</einit>

未能获得牵引力并因此被放弃。

Upstart(2006)

最初由Scott James Remnant为Ubuntu设计。在Fedora中简单使用,仍然在ChromeOS中(Ubuntu本身转向systemd)。

Upstart围绕着发出事件和采取行动以响应的想法,例如启动和停止服务。它提供了几个称为桥的模块,用于将各种内核或用户空间事件转换为其自己的本机队列。内置事件列表在upstart-events(7)中定义。

首先使用D-Bus作为PID 1内部的通信机制。

因此,事件是针对服务采取行动的抽象前提条件或后置条件。它们与动态和延迟加载同样重要。

Upstart Cookbook深入探讨了这个架构。

Asus eeePC fastinit +衍生品(2007-2015)

作为华硕eeePC笔记本电脑系列的一部分,它在2007-2008期间预装了一个名为Xandros的GNU / Linux发行版的变体,他们编写了一个名为fastinit的专有init(8)替代品,专门用于......启动速度非常快,我想。

2008年,它被Claudio Matsuoka逆向设计。其速度的原因很简单。它是一个小型C程序中完全独立的引导逻辑,它直接调用POSIX来执行通常作为shell脚本运行的所有操作。它通过编辑硬编码的C宏在编译时设计用于静态可配置性。因此,它也不灵活。

然而,在2014 - 2015年左右,它由嵌入式开发人员Joachim Nilsson和重新推出的finit进行了分叉和显着扩展。

与前面提到的pinit非常相似,finit适用于基于插件的系统,用于动态连接到引导逻辑,除了它实际上有一个明确定义的API。它与SysV运行级别保持兼容,并带有用于预打开服务器套接字的嵌入式inetd,并使用平面/etc/finit.conf文件进行配置,如下所示:

user admin
host testbedcheck /dev/vda1module button
module evdev
module loop
module psmouserunlevel 2network service networking starttty /dev/tty1
tty /dev/tty2
tty /dev/tty3# Alternative method instead of runparts
#task [S] /etc/init.d/keyboard-setup start -- Setting up preliminary keymap
#task [S] /etc/init.d/acpid start          -- Starting ACPI Daemon
#task [S] /etc/init.d/kbd start            -- Preparing console
#run [2] /etc/init.d/networking start      -- Start networking# Services to be monitored and respawned as needed
service [2345] /sbin/klogd -n             -- Kernel logging server
service [2345] /sbin/syslogd -n           -- Syslog server
service [3] /usr/sbin/gdm                 -- GNOME Display Manager# Run start scripts from this directory
# runparts /etc/start.d# Inetd services
inetd time/udp                wait [2345] internal          -- UNIX rdate service
inetd time/tcp              nowait [2345] internal          -- UNIX rdate service
inetd ssh@eth0:222/tcp      nowait [2345] /usr/sbin/sshd -i -- SSH service
inetd ssh/tcp               nowait [2345] /usr/sbin/sshd -i -- SSH service# For multiple instances of the same service, add :ID somewhere between
# the service/run/task keyword and the command.
service :1 [2345] /sbin/httpd -f -h /http -p 80   -- Web server
service :2 [2345] /sbin/httpd -f -h /http -p 8080 -- Old web server

finit绝对是面向更有限的系统,但它设法通过其小表面赋予了很大的灵活性。

OpenRC(2007)

主要由Gentoo使用,但也使用Alpine Linux等,旨在取代早期的Gentoo baselayout脚本。OpenRC实际上并不提供init守护进程,而是提供了一个全面的进程管理框架(尽管很少有监督,因为它意味着与外部主管集成,例如它对s6 daemontools-like supervisor的明确支持)受BSD系统的rc.d影响很大。由此得名。它已成功从Busybox init + mdev和sysvinit启动。

查看Gentoo wiki和ArchWiki概述。

Android init(2008)

Android init是一个专门的init守护进程,用于处理特定于平台的功能,如系统属性,并提供基于称为操作的事件机制的一般延迟加载系统,一些用户定义的,其他由init守护程序本身设置。它使用基于行的配置语言在单片/init.rc中配置。

我有一篇关于其工作原理的详细文章,可以在这里阅读。它没有太多新颖性,而是供应商可以在其initramfs中配置一次然后忘记。

systemd(2010)

原本打算叫做Babykit。

无需进一步澄清。

procd(2012)

procd是一个小型的init守护进程,具有专门为OpenWrt设计的监控,因此适用于路由器等系统。它使用一种称为ubus的小型,面向对象的消息总线实现进行通信,并通过名称空间和seccomp-bpf之类的系统调用过滤支持服务沙箱。

使用了一个特殊的init脚本库,例如

START=50
USE_PROCD=1start_service() {
procd_open_instance
procd_set_param command /usr/bin/xupnpd
procd_append_param command -d /usr/share/xupnpdprocd_set_param respawn
procd_close_instance
}

procd_例程将参数序列化为JSON并通过ubus传递它们。

Epoch(2014)

Epoch是一个故意极简主义的init守护进程,具有完整的进程管理和监督,但是以串行/同步方式执行所有进程。使用Object隐喻进行服务,类似于Android init,使用中心文件(这里是INI)配置,例如

Hostname=FILE /etc/hostname
DefaultRunlevel=boot
EnableLogging=true
DisableCAD=true
BlankLogOnBoot=true
MountVirtual=procfs sysfs devpts+ devshm+ObjectID=sysclock
ObjectDescription=Configuring system clock
ObjectStartCommand=hwclock -s
ObjectStopCommand=hwclock -w
ObjectStartPriority=1
ObjectStopPriority=2
ObjectEnabled=true
ObjectOptions=RAWDESCRIPTION
ObjectRunlevels=boot coreObjectID=mountruntmp
ObjectDescription=Mounting /run and /tmp
ObjectStartCommand=/etc/epoch/scripts/mountruntmp.sh
ObjectStopCommand=NONE
ObjectStartPriority=2
ObjectStopPriority=0
ObjectEnabled=true
ObjectOptions=RAWDESCRIPTION
ObjectRunlevels=boot core hurrObjectID=rwfs
ObjectDescription=root filesystem read-write support
ObjectStartCommand=/bin/mount -o remount,rw /
ObjectStopCommand=/bin/mount -o remount,ro /
ObjectStartPriority=4
ObjectStopPriority=6
ObjectEnabled=true

使用基于System V共享内存的私有基本消息总线实现。

正如所观察到的,它具有排序优先级的概念而不是依赖性。优先级也可用于逻辑分组,优先级0等同于掩码或硬禁用。

sinit(2014)

关于一切。

# MIT license.#include <sys/types.h>
#include <sys/wait.h>#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>#define LEN(x) (sizeof (x) / sizeof *(x))static void sigpoweroff(void);
static void sigreap(void);
static void sigreboot(void);
static void spawn(char *const []);static struct {
int sig;
void (*handler)(void);
} sigmap[] = {
{ SIGUSR1, sigpoweroff },
{ SIGCHLD, sigreap     },
{ SIGINT,  sigreboot   },
};static char *const rcinitcmd[]     = { "/bin/rc.init", NULL };
static char *const rcrebootcmd[]   = { "/bin/rc.shutdown", "reboot", NULL };
static char *const rcpoweroffcmd[] = { "/bin/rc.shutdown", "poweroff", NULL };static sigset_t set;int
main(void)
{
int sig;
size_t i;if (getpid() != 1)
return 1;
chdir("/");
sigfillset(&set);
sigprocmask(SIG_BLOCK, &set, NULL);
spawn(rcinitcmd);
while (1) {
sigwait(&set, &sig);
for (i = 0; i < LEN(sigmap); i++) {
if (sigmap[i].sig == sig) {
sigmap[i].handler();
break;
}
}
}
/* not reachable */
return 0;
}static void
sigpoweroff(void)
{
spawn(rcpoweroffcmd);
}static void
sigreap(void)
{
while (waitpid(-1, NULL, WNOHANG) > 0)
;
}static void
sigreboot(void)
{
spawn(rcrebootcmd);
}static void
spawn(char *const argv[])
{
pid_t pid;pid = fork();
if (pid < 0) {
perror("fork");
} else if (pid == 0) {
sigprocmask(SIG_UNBLOCK, &set, NULL);
setsid();
execvp(argv[0], argv);
perror("execvp");
_exit(1);
}
}

最后的笔记

在Dark n'Egygy论坛上联系VR,或者如果有任何不准确之处,请发表评论。文章的描述是一般性的,如果需要,应该在每个项目的基础上进行进一步的研究。


评论


作者:Glenda(2015年9月9日星期三05:53:12 EDT 2015)

Re:systemd,没有必要进一步澄清?这是一个警察,也贬低了文章,因为不是每个人都对systemd有一个隐含的理解。


作者:Glenda(2015年9月9日星期三13:49:27 EDT 2015)

Supervision-scripts本身不是一个框架,它是daemontools及其堂兄的定义集合。这个想法是基于监督的套件通常没有完整的定义集,导致需要编写通常耗时且容易出错的一次性脚本。

tl; dr它应该与daemontools / runit / s6一起部署,作为一组守护进程定义,可以“开箱即用”开箱即用。


作者:Glenda(2015年9月9日星期三14:27:07 EDT)

Gobolinux的BootBcript系统怎么样?它自2002年以来一直存在。


作者:Glenda(2015年9月12日星期六22:17:05)

OpenBSD的rc.d(8)实际上与NetBSD / FreeBSD无关,它是在4.9版本中引入的。

http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current/man8/rc.d.8 
http://www.openbsd.org/cgi-bin/man.cgi/OpenBSD-current /man8/rc.subr.8


作者:Glenda(2015年9月14日星期五05:49:31 EDT 2015)

关于openrc的一点。它自Gentoo发行开始以来就已存在。那时它并没有被称为openrc,但它基本上是相同的(尽管它当然已被扩展)。这可以追溯到2001年,并且受到Daniel Robbin对freebsd的体验的影响很大。


作者:Glenda(Tue Sep 15 16:33:29 EDT 2015)

没有关于RunIt的话题?它与S6非常相似,不同之处在于它通常比具有类似功能的其他init系统启动得更快。


作者:Glenda(2015年9月16日星期三12:30:59 EDT 2015)

同意wrt OpenRC。作为baselayout的一部分,它已经在Gentoo中延长了一段时间,但被拆分并重命名为OpenRC,因为Roy希望将其作为其他操作系统的独立项目。

它始于CVS,但您仍然可以看到SVN转换的历史记录:
https ://sources.gentoo.org/cgi-bin/viewvc.cgi/baselayout/trunk/?pathrev = 2


作者:Glenda(2015年9月17日星期四15:19:23)

那么supervisord,runit和nosh呢?


作者:Glenda(2016年8月22日16:49:02 EDT 2016)

OpenRC成立于2001年,直到2007年才与Gentoo的baselayou合并。
至少从2008年开始,它已经正式并行。

init-history相关推荐

  1. Saltstack使用(基础)

    yum install salt-master yum install salt-minion 端口:4505 salt 的消息发布专用端口 4506 客户端与服务器通信的端口 /lib/system ...

  2. SaltStack技术入门与实践

    第1章 SaltStack入门 1.2.1 SaltStack软件依赖 SaltStack有两种消息系统,一种是REAT,一种是ZeroMQ,默认使用ZeroMQ. 软件依赖列表如下: ●Python ...

  3. saltstack编写系统初始化状态

    saltstack编写系统初始化状态 目录结构 Selinux 防火墙 chrony时间同步 kernel文件描述符 history历史记录 timeout 连接超时 yum源 基础命令安装 安装sa ...

  4. 《SaltStack技术入门与实践》—— 实践案例 中小型Web架构1 初始化和Haproxy

    实践案例 <中小型Web架构> 本章节参考<SaltStack技术入门与实践>,感谢该书作者: 刘继伟.沈灿.赵舜东 实践.实践.再实践,这是熟练掌握SaltStack的真理. ...

  5. SaltStack系统初始化状态文件编写

    系统初始化 系统初始化要做的事: 就是系统刚安装的时候要做的事情: 前提是系统是好的,网络是好的,主机名已设置 ​ - SELINUX ​ - 防火墙关闭 ​ - 配置yum源 ​ - 安装常用软件 ...

  6. SaltStack实现中小型企业架构

    SaltStack实践案例 1 案例简述 通过SaltStack的配置管理实现"中小型Web架构"的自动化部署和配置管理,主要包括以下功能和服务: 系统初始化 Haproxy服务 ...

  7. Linux常用命令(echo、date、ls、cd、history、cat)

    一.linux常用命令有很多今天我们来总结一下常用的入门命令: 1.linux下关机命令:poweroff.init 0.halt.shutdown -h now 2.linux下重启命令:reboo ...

  8. history linux 日志服务器_Linux日志分析

    0x00 前言 Linux系统拥有非常灵活和强大的日志功能,可以保存几乎所有的操作记录,并可以从中检索出我们需要的信息. 本文简介一下Linux系统日志及日志分析技巧. 0x01 日志简介 日志默认存 ...

  9. pjax 历史管理 jQuery.History.js

    更新 http://www.bootcdn.cn/jquery.pjax/ 简介 pjax是一个jQuery插件,使用ajax和pushState技术提供快速的浏览体验与真正的永久链接.网页标题.以及 ...

  10. 大熊君学习html5系列之------History API(SPA单页应用的必备------重构完结版)

    一,开篇分析 Hi,大家好!大熊君又和大家见面了,(*^__^*) 嘻嘻--,这系列文章主要是学习Html5相关的知识点,以学习API知识点为入口,由浅入深的引入实例, 让大家一步一步的体会" ...

最新文章

  1. OpenVINO + OpenCV实现点头与摇头识别验证
  2. 雷军、张小龙:高手的努力深入而轻松,普通人的努力肤浅而痛苦!
  3. springboot默认数据源如何设置连接数_spring boot基于DRUID数据源密码加密及数据源监控实现...
  4. android 获取u盘名字_android 获取U盘路径
  5. SQLServer存储过程/函数加/解密(轉)
  6. 有关使用junit依赖出现@Before或者@Before注解不生效
  7. python文件路径操作及pathlib库
  8. 使用通用mapper实现条件查询_【微服务】152:Stream流和通用mapper批量查询的使用...
  9. SpringBoot—@ComponentScan注解过滤排除某个类
  10. maven依赖avro_Apache Avro使用入门指南
  11. ubuntu14.04中离线安装docker
  12. HDU 4932 Miaomiao#39;s Geometry(推理)
  13. 22. PHP 日期和时间
  14. 易达项目的工作进程第二天
  15. 频率泄露以及加窗原理
  16. python黑网站充值_Python黑帽子:Windows系统提权
  17. GOF-23种设计模式UML图
  18. 【截屏、录屏】工具分享-最简单的工具-QQ
  19. elasticsearch 文档增删改
  20. Java实验:教练和运动员案例

热门文章

  1. 第十一章:纳什均衡的计算
  2. 射影几何----笛沙格对合定理的证明
  3. 扫雷-下载-规则介绍
  4. Codeforces 912 D. Fishes (贪心、bfs)
  5. 【C语言典例】——day3:设计魔方阵(数组)
  6. NDK开发之ndk-build命令详解
  7. NodeJs股票查询应用
  8. 一文了解CPU及芯片硬件技术发展
  9. 计算机毕业设计ssm陈氏商城9pd36系统+程序+源码+lw+远程部署
  10. python面向对象-2