Upstart和systemd的优点/缺点是什么?


183

似乎systemd是热销的新init系统,与几年前Upstart一样。每个优点/缺点是什么?另外,它们各自与其他init系统相比如何?


4
@keith iirc openrc仅使用SysV,优点是精心设计的启动脚本集合,这些启动脚本使用通用组件并且可移植(意味着可以在任何shell上工作),这是很好的清理方法,但实际上并不是一个新的initd
xenoterracide 2011年

@xeno可以,但是您无法真正分辨出来。根本没有rcX.d或[KS]符号链接。实际上,sysv init本身非常灵活,运行级别实际上并未以通常的方式使用。
基思

尽管此博客的作者反对systemd,但我建议您阅读一下。它超越了systemd和BSD init的优缺点。textplain.net/blog/2015/…–
Peschke

1
请也通过2016更新unix.stackexchange.com/a/287282/49091
igaurav

systemd的任何声称的优势都不会在100年内抵消全世界为实现此目的而已经招致的成本。Unix管理员处理这种垃圾所花费的每一分钟,每一小时或每一天,必须已经累加了数十亿美元,除了几句风花雪月之外,还有什么真正的好处?
Waslap

Answers:


90

2016更新

这里的大多数答案都已经有5年了,所以是时候进行一些更新了。

Ubuntu以前默认使用upstart,但去年却放弃了它,转而使用systemd-请参阅:

因此,在Ubuntu Wiki上有一篇不错的文章《针对Upstart用户的Systemd》 -非常详细地比较了upstart和systemd,以及从upstart到systemd的过渡指南。

(请注意,根据Ubuntu Wiki,您仍然可以通过安装upstart-sysv和运行默认情况下在默认版本的Ubuntu上运行upstart,sudo update-initramfs -u但考虑到systemd项目的范围,我不知道它在实践中如何工作,或者systemd是否在可以卸载。)

下面的“命令和脚本”部分中的大多数信息都是根据该文章中使用的一些示例改编而成的(就像在Creative Commons Attribution-ShareAlike 3.0许可下的Stack Exchange用户贡献一样,已被方便地许可)。

这是常见命令和简单脚本的快速比较,请参阅以下各节以获取详细说明。该答案是将问题中要求的基于Upstart的系统的旧行为与基于systemd的系统的新行为进行比较,但是请注意,标记为“ Upstart”的命令不一定是特定于Upstart的-它们通常是每个非系统Linux和Unix系统都通用。

指令

运行su:

  • 暴发户: su
  • systemd: machinectl shell

(请参阅下面的“ su命令替换”部分)

运行画面:

  • 暴发户: screen
  • systemd: systemd-run --user --scope screen

(请参阅下面的“意外终止后台进程”部分)

运行tmux:

  • 暴发户: tmux
  • systemd: systemd-run --user --scope tmux

(请参阅下面的“意外终止后台进程”部分)

开始工作foo:

  • 暴发户: start foo
  • systemd: systemctl start foo

停止作业foo:

  • 暴发户: stop foo
  • systemd: systemctl stop foo

重新启动作业foo:

  • 暴发户: restart foo
  • systemd: systemctl restart foo

列出工作:

  • 暴发户: initctl list
  • systemd: systemctl status

检查作业foo的配置:

  • 暴发户: init-checkconf /etc/init/foo.conf
  • systemd: systemd-analyze verify /lib/systemd/system/foo.service

列出作业的环境变量:

  • 暴发户: initctl list-env
  • systemd: systemctl show-environment

设置作业的环境变量:

  • 暴发户: initctl set-env foo=bar
  • systemd: systemctl set-environment foo=bar

删除作业的环境变量:

  • 暴发户: initctl unset-env foo
  • systemd: systemctl unset-environment foo

日志

在upstart中,日志是/ var / log / upstart目录中的普通文本文件,因此您可以照常进行处理:

cat /var/log/upstart/foo.log
tail -f /var/log/upstart/foo.log

在systemd中,日志以内部二进制格式(而不是文本文件)存储,因此您需要使用journalctl命令来访问它们:

sudo journalctl -u foo
sudo journalctl -u foo -f

剧本

用编写的示例新贵脚本/etc/init/foo.conf

description "Job that runs the foo daemon"
start on runlevel [2345]
stop on runlevel [016]
env statedir=/var/cache/foo
pre-start exec mkdir -p $statedir
exec /usr/bin/foo-daemon --arg1 "hello world" --statedir $statedir

用以下脚本编写的示例systemd脚本/lib/systemd/system/foo.service

[Unit]
Description=Job that runs the foo daemon
Documentation=man:foo(1)
[Service]
Type=forking
Environment=statedir=/var/cache/foo
ExecStartPre=/usr/bin/mkdir -p ${statedir}
ExecStart=/usr/bin/foo-daemon --arg1 "hello world" --statedir ${statedir}
[Install]
WantedBy=multi-user.target

su命令替换

一个su命令替换被合并到拉请求#1022 systemd:

因为根据Lennart Poettering的说法,“ su确实是一个破碎的概念”

他解释说:“您可以像以前一样使用su和sudo,但是不要指望它会完全起作用

现在,实现类似su行为的官方方法是:

machinectl shell

Lennart Poettering 在发布问题#825的讨论中作了进一步 解释

“嗯,对此进行了长时间的讨论,但是问题在于,su应该做的事情还很不清楚。 ,也可以使用它,但它不是完整的登录名,不应将其误认为一个登录名。” -Lennart Poettering

也可以看看:

意外杀死后台进程

像这样的命令:

不再按预期工作。例如,nohup是POSIX命令,用于确保从会话注销后该进程继续运行。它不再适用于systemd。诸如此类的程序screen以及tmux需要以特殊方式调用的程序,否则与它们一起运行的进程将被杀死(而未杀死这些进程通常通常首先是运行screen或tmux的主要原因)。

这不是一个错误,这是一个经过深思熟虑的决定,因此将来不太可能解决。这就是伦纳特·珀特林这个问题:

在我看来,对于UNIX来说实际上是很奇怪的,它默认情况下允许任意用户代码在注销后保持不受限制的状态。许多操作系统人士已经讨论了很长时间了,这应该是可能的,但肯定不是默认值,但是到目前为止,没有人敢将开关从默认设置转换为选项。注销后不清理用户会话不仅丑陋而且有些骇人听闻,而且还是安全问题。 现在,systemd 230最终翻转了开关,并最终默认情况下在用户注销时正确清理了所有内容。

有关更多信息,请参见:

高级启动概念

以某种方式systemd向后工作-在新贵的工作中尽快开始,而在systemd的工作中必须尽快开始。归根结底,两个系统都可以以几乎相同的顺序启动相同的作业,但是您可以从相反的方向来看。

这是Systemd for Upstart用户的解释方式:

Upstart用于启动流程(作业)的模型是“基于贪婪事件的”,即,发生启动事件的所有可用作业都应尽早启动。在启动过程中,新贵将一些启动事件(例如启动或rcS)作为“树根”进行合成,早期服务在这些事件上启动,后来服务在前者运行时启动。一个新作业只需要将其配置文件安装到/ etc / init /中即可生效。

systemd用于启动过程(单元)的模型是“基于懒惰的依赖关系”的,即,仅当某个其他启动单元依赖于该单元时,该单元才会启动。在引导过程中,systemd启动一个“根单元”(default.target,可以在grub中覆盖),然后可传递地扩展并启动其依赖项。一个新的单元需要添加自身作为引导序列(通常是multi-user.target)的一个单元的依赖关系,以便激活。

发行版中的用法

现在根据维基百科的一些最新数据:

默认情况下使用新贵的发行版:

默认情况下使用systemd进行分发:

(有关最新信息,请参阅维基百科

既不使用Upstart也不使用systemd的发行版:

争议

在过去,有人提出了Debian的fork来避免systemd。该Devuan GNU + Linux的创建- Debian的无systemd叉子(感谢fpmurphy1指点出来的评论)。

有关此争议的更多信息,请参见:

你们中许多人可能已经知道,伊恩·杰克逊(Ian Jackson)提倡的Init GR Debian投票对于保护Debian的遗产及其用户免受系统性的雪崩袭击并没有帮助。

这种情况预示着系统依赖的锁定,这实际上威胁着发展自由,并对Debian,其上游和下游产生严重后果。

CTTE设法通过依赖于sysvinit的微妙安装systemd来交换依赖关系并为我们赢得了时间,但是即使这个过程也很累并且充满了戏剧性。最终,一周前,伊恩·杰克逊(Ian Jackson)辞职。[...]

我将从技术委员会辞职,立即生效。

虽然重要的是应继续在我的技术委员会中代表与我同意的项目的30-40%的意见,但我本人现在显然太有争议了,不能这样做。我应该退后一步,以减少有关项目治理的对话的个性化程度。[...]

Devuan诞生于关于将其用作Debian的默认初始化系统的争议。Debian在systemd上官方立场充斥着其他人揭穿的主张。有兴趣的读者可以在“系统性争议”中继续讨论这个热门话题。但是,我们鼓励您保持冷静,保持声音平和。在Devuan,我们对错误的编程比回头更感兴趣。[...]

已经创建了一些有关systemd争议的网站和文章:

很多 Hacker News上有趣的讨论的:

在其他发行版中也可以观察到类似的趋势:

哲学

暴发户遵循DOTADIW的Unix哲学-“做一件事情,做好事”。它替代了传统的init守护程序。除了启动和停止服务之外,它没有任何其他作用。其他任务则委托给其他专门的子系统。

systemd的功能远不止于此。除了启动和停止服务之外,它还管理密码,登录名,终端,电源管理,工厂重置,日志处理,文件系统挂载点,网络连接以及更多功能- 有关某些功能,请参阅NEWS文件。

扩张计划

根据一种systemd的角度看,已经实现了,而什么样的未来由伦纳特·珀特林在2014年GNOME.asia介绍,这里是systemd的主要目标,即已经覆盖和那些仍在取得进展的领域:

系统目标:

我们的目标

  • 将Linux从零碎的零碎变成竞争性的通用操作系统。
  • 构建Internet的下一代OS统一发行版之间毫无意义的差异
  • 将创新带回到核心操作系统

  • 桌面,服务器,容器,嵌入式,移动,云,群集等。。。这些区域比您想象的更靠近

  • 降低管理员的复杂性,可靠性而无需监督
  • 一切自省
  • 自动发现,即插即用是关键
  • 我们将东西固定在损坏的地方,不要用胶带粘在上面

已经涵盖的领域:

我们已经介绍的内容:

初始化系统,日志记录,登录管理,设备管理,临时和易失性文件管理,二进制格式注册,背光保存/还原,rfkill保存/还原,引导图,预读,加密存储设置,EFI / GPT分区发现,虚拟机/容器注册,最小容器管理,主机名管理,语言环境管理,时间管理,随机种子管理,sysctl变量管理,控制台管理等。。。

工作正在进行中:

我们正在从事的工作:

  • 网络管理
  • 系统联网
  • 本地DNS缓存,mDNS响应器,LLMNR响应器,DNSSEC验证
  • 内核中的IPC
  • kdbus,sd-bus
  • 与NTP时间同步
  • 系统时间同步
  • 与容器的更多集成
  • 服务沙箱
  • 应用程序沙箱
  • 操作系统映像格式
  • 容器图片格式
  • 应用图片格式
  • 具有自动发现功能的GPT
  • 无状态系统,可实例化系统,出厂重置
  • / usr是操作系统
  • / etc是(可选)配置
  • / var是(可选)状态
  • 原子节点初始化和更新
  • 与云整合
  • 跨节点的服务管理
  • 可验证的操作系统映像
  • 一直到固件
  • 引导加载

该答案的范围

正如fpmurphy1在评论中指出的那样,“应该指出,多年来systemd的工作范围已远远超出了系统启动的范围。”

我试图在这里包括大多数相关信息。在这里,我将按照问题中的要求比较Upstart和systemd用作初始化系统时的常见功能,我只提到systemd的功能超出了初始化系统的范围,因为这些功能无法与Startup进行比较,但是它们的存在很重要了解这两个项目之间的区别。应该检查相关文档以获取更多信息。

更多信息

可以在以下位置找到更多信息:

附加功能

LinOxide团队创造了一个Systemd VS SysV初始化的Linux的cheatsheet


4
...并且发生了这样的Debian分叉。Devuan GNU + Linux是Debian的一个分支,没有systemd。
fpmurphy

2
应当指出,多年来,systemd的工作范围已远远超出了系统启动的范围。
fpmurphy

1
出色的职位,对Cent小伙子非常有帮助。谢谢您抽出宝贵的时间!!!
origin1tech

4
@ronsmith service <foo> start/stop/restart/status仍然可以正常工作。像大多数Unix软件一样,systemd提供了与众所周知的默认命令的兼容性。
Shadur

2
很好的答案。不过有一点:BSD操作系统不是Linux发行版:它们是具有自己内核的不同Unix操作系统。
乔治(Giorgio)

68

新贵公司和systemd都试图解决传统SysV init系统的局限性。例如,某些服务需要在其他服务之后启动(例如,您必须在网络运行之前才能挂载NFS文件系统),但是SysV中处理此问题的唯一方法是在rc#.d目录中设置链接这样一个先于另一个。除此之外,添加或更改依赖项之后,您可能需要重新编号所有内容。Upstart和Systemd具有更智能的设置来定义需求。此外,还有一个问题是,所有内容都是某种形式的Shell脚本,而不是每个人都编写最佳的初始化脚本。这也会影响启动速度。

我可以看到systemd的一些优点:

  • 每个启动的进程都有自己的cgroup或特定的cgroup。
  • 预先为服务创建套接字和文件句柄,类似于xinetd为其服务所做的工作,从而使从属服务启动更快。例如,systemd将为/ dev / log保持syslog的打开文件句柄,发送到/ dev / log的后续服务将缓冲其消息,直到syslogd准备好接管为止。
  • 实际运行服务的进程较少。这意味着您无需编写Shell脚本来启动服务。这可以提高速度,并且(IMO)首先更容易设置。

我知道的一个缺点是,要利用systemd的套接字/ FH预分配,必须修补许多守护程序,以使FH由systemd传递给它们。


13
PulseAudio是一个非常复杂的声音系统(pulseaudio.org),最初由systemd的作者Lennart Poettering编写。我在这里主要是在开玩笑,因为我认识几个喜欢抱怨pulseaudio的人,而且我敢肯定他们也会抱怨systemd。老实说,我对systemd或Pulseaudio都没有问题。
jsbillings

4
使Plan9的丰富内容变得几乎松散了……一切都是文件。
dhchdhd 2011年

4
老实说,pulseaudio是一个不存在的问题的解决方案。PA没有什么可以做的,而ALSA无法做到,而且我听说很多人一遍又一遍地遇到PA的问题。
WhyNotHugo

3
您错过了两个系统的缺点:(1)所有的启动脚本都需要重写。(2)与非Linux操作系统(例如BSD)的兼容性较差。
WhyNotHugo 2012年

8
太好了 请查看0pointer.de/blog/projects/the-biggest-myths。我目睹了systemd的发展,可以证明这里给出的许多批评是完全没有根据的。在链接上,您会发现一击接一击,合理的辩驳。
vonbrand 2013年

30

看到今天systemdArch General ML上提到的。因此,请仔细阅读。H Online一如既往是Linux技术的绝佳来源,在这里我找到了开始研究Systemd as SysV Init和Upstart替代产品的地方。但是,H Online文章(在这种情况下)不是非常有用的阅读材料,它的真正用途是它提供了指向有用阅读内容的链接。

真正的答案是在systemd公告中。这给出了SysV initd出了什么问题以及新系统需要做什么的一些关键点

  • 开始少。
  • 并开始更多并行工作。

它的主要计划似乎是仅在需要时启动服务,并启动该服务的套接字,以便需要该服务的服务可以在守护程序完全联机之前很长时间就连接到已创建的套接字。显然,套接字将保留少量的缓冲数据,这意味着在滞后期间不会丢失任何数据,它将在守护程序联机后立即进行处理。

该计划的另一部分似乎是不序列化文件系统,而是按需挂载那些文件系统,这样您就不必等待/home/,等(不要与/etc)混淆来挂载,和/或fsck何时可以挂载文件系统。//var/等启动守护程序已经安装。它表示将为此使用autofs。

它还具有创建.desktop样式初始化描述符以替代脚本的目标。这将防止万吨缓慢的sh过程,并从之类的东西的过程更加叉sedgrep那些经常在shell脚本中使用。

他们还计划在请求它们之前不启动某些服务,甚至可能在不再需要它们时将其关闭,例如,仅在使用蓝牙设备时才需要蓝牙模块和守护程序。给出的另一个示例是ssh守护程序。这是inetd能够做到的事情。就我个人而言,我不确定我是否喜欢这样,因为这可能意味着我确实需要它们时的延迟,而对于ssh,我认为这可能是一个安全漏洞,如果我的inetd受到损害,则整个系统将会受到影响。但是,我被告知,使用它来破坏该系统是不可行的,并且如果我愿意的话,我可以按服务和其他方式禁用此功能。

显然,另一个功能将是基于时间事件(以规则的计划时间间隔或在特定时间)启动的功能。这是类似于crondatd现在要做的。尽管有人告诉我它不支持用户“ cron”。就个人而言,这听起来是最没有意义的事情。我认为这是由不在多用户环境中工作的人编写/构想的,如果您是系统上的唯一用户,那么cron并没有太多用途,除了不是以root身份运行。我每天都在多用户系统上工作,规则是始终以用户身份运行用户脚本。但是也许我没有他们的远见卓识,并且它绝不会使我无法运行crondatd,所以它不会伤害任何人,但我认为是开发人员。

systemd的最大缺点是必须修改某些守护程序才能充分利用它。它们现在可以工作,但是如果专门为其套接字模型编写它们,则它们会更好地工作。

似乎在大多数情况下,systemd与新贵有关的人民问题是事件系统,他们认为这没有意义或不必要。也许他们的话说得最好。

或更简单地说:用户刚刚启动D-Bus的事实绝不表示也应该启动NetworkManager(但这就是Upstart会做的事情)。恰恰相反:当用户要求使用NetworkManager时,这绝对表明D-Bus也应该启动(这肯定是大多数用户所期望的,对吧?)。
一个好的初始化系统应该仅按需启动,然后按需启动。延迟地或并行地提前。但是,它的启动时间不应超过必要的时间,尤其是并非安装了所有可以使用该服务的东西。

正如我已经说过的那样,在systemd公告中对此进行了更为全面的讨论。


对不起,但公告就像一本书。我必须阅读并仔细阅读,然后才能真正在此处添加更多内容。
xenoterracide 2011年

2
这比@John的答案好吗?是占位符吗?H Online的促销?
tshepang 2011年

1
@tshepang很好,它实际上链接到系统d的公告,而h网上的东西具有该链接和其他有趣的链接。这是一个冗长乏味的阅读。一旦发现问题,我可能会添加更多……这不是一个简单的主题。当我写这篇文章时,我想您可能想早点阅读。但是随便让我失望吧。肯定@jsbillings的答案是不错的,并且到目前为止比我的要好。但不如阅读公告本身
xenoterracide 2011年

@tshepang我明天睡觉后可能会增加更多。网络上的东西只是我是一名优秀的记者,并引用了我的消息来源。
xenoterracide 2011年

@tshepang。我已经更新了答案。除非irc://frenode.net/systemd上的乐于助人的人决定他们想要提供某种纠正,否则,我肯定可以完成。
xenoterracide

11

你们大多数人忘记的一件事是cgroup中的流程组织。

因此,如果systemd启动了一个东西,它将把这个东西放入它自己的cgroup中,并且该进程没有逃脱那个cgroup的意思(没有特权)。这就是后果:

  • 具有许多用户的大型系统的管理员具有识别恶意用户/进程的有效新方法。
  • 可以通过“ Wonder autocgroup patch”来更好地确定CPU调度的优先级。

8

要对systemd进行非常详细的介绍,请从第一个设计草案开始(以及对现有init系统的详细评论,包括新贵,以及systemd建议如何修复它们),请转到其主页。随着时间的流逝,LWN上发表了几篇有关启动的文章。请注意,凡提及systemd(或pulseaudio)都会触发永无止境的战争。

IMVHO(以及Fedora用户)对此感到非常满意。解决当前Linux系统的复杂性早就该行了。Fedora曾使用过一段时间的新贵,但它从未脱离过成为sysvinit的理想替代品的阶段,它几乎运行了不变的初始化脚本。其简化引导配置的承诺再次付出了代价手动设置相互依赖关系,那是行不通的。系统化的数字本身就是依赖的(或者只允许在不考虑依赖的情况下开始工作,他们会自行整理)。另一个大优点(有人说这是一个严重的缺点)是它利用了特定于Linux的功能(特别是cgroups允许隔离守护程序及其所有后代,因此很容易监视,限制资源或将其杀死)一组;还有许多其他)。


3

日志记录-Systemd实际上类似于WinSXS文件夹,用于记录内容,除非您手动删除或减小文件大小,否则它会创建副本副本,否则它将继续占用您的驱动器。我称它为引导加载程序cookie。


错误。那些不是副本,它具有可配置的限制freedesktop.org/software/systemd/man/journald.conf.html
朋友
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.