从upstart切换到systemd的基本原理?

Ubuntu 15.04带来的更大变化是从upstart切换到systemd,作为管理启动和系统服务启动的默认设置。

任何人都可以向非技术用户充分解释这对我们有何影响? 为什么它很重要?

Layman用户不应该通过设计注意到任何变化。 它是一个init系统,而不是用户传统上与之交互的东西。 它应该完全取代Upstart提供的function – 并做一些额外的事情 – 但非技术用户只有在出现问题时才能看到它。

积极使用和开发Upstart的用户,系统管理员和开发人员是需要解决问题的人。 Ubuntu Wiki上有一个迁移文档可以帮助开发人员转换他们的init脚本,但是用户和sysops可以通过坚持14.04(直到2019年才支持)继续使用Upstart。

改变的原因和理由不是来自Ubuntu的一方。 Canonical对Upstart(他们的项目)很满意,但许多Debian用户希望转向现代的init引擎,以便在启动时获得更好的并发性,并在所有服务中更好地监控function。

这意味着各种选择 (理由)和systemd 之间的斗争最终赢了。

Canonical与Debian一起使用,因为它最简单,也可能是最好的。 他们放弃了一个项目,并没有在上游进行战斗。 它还使我们与其他正在转向systemd的发行版(Red Hat,Fedora等)保持一致。 更加专注,减少重复劳动。

tl; dr对于非技术人员,这根本不会影响你。 对于Ubuntu来说,它应该意味着更少的工作和更好的init系统。

任何人都可以向非技术用户充分解释这对我们有何影响?

从理论上讲,这不应该影响那些没有参与系统实际工作方式的非技术性最终用户。 在实践中,你会看到很多东西。

这是一个不完整的清单:

  • 如果你有使用upstart作业定义文件的附加软件来启动程序,它们将停止工作。 你必须安装(并且可能只是编写,但更常见的是只是已经写过的其他人)系统服务单元文件。 示例: https : //askubuntu.com/questions/613785
  • 系统开发人员对电源管理等事情的各种设计假设导致默认值与您可能习惯的内容不一致。 例如,系统开发人员对于响应笔记本电脑上的盖子开关应该会发生什么有非常明确的想法 。
  • 如果您使用的是nvidia专有的显示驱动程序,那么systemd中会有各种影响您的设计决策。 示例: https : //askubuntu.com/questions/613773
  • 来自暴发户时,这并不是真正相关,因为Ubuntu用户已经有一个手册页告诉他们这几年了,但我提到了非Ubuntu用户,他们可能会读到这个:来自System 5 init其他Linux操作系统用户+ rc被systemd 向后兼容System 5 rc这一事实所困扰。 像upstart,以及大多数其他系统一样,它声称并提供,不与System 5 init及其配置文件/etc/inittab向后兼容。

    因此,那些遵循30多年人们建议的人“嗯,你可以将其编辑成/etc/inittab …”,或者那些使用遵循该建议的软件的人现在拥有的软件不能从引导。 示例: https : //unix.stackexchange.com/a/196197/5132

  • 您无法通过systemd shutdown命令进入单用户模式 ,就像以前的shutdown命令一样。 除了在系统行话中称为救援模式这一事实之外,救援模式在系统世界观中不被视为关闭状态。 它被视为一个运行状态。 shutdown now将关闭机器电源。 这是systemctl rescue在系统世界中达到单用户模式。 进一步阅读: https : //unix.stackexchange.com/a/196471/5132
  • 继续最后一个主题:如果你还没有抛弃运行级别的想法,现在是时候这样做了。 更进一步阅读: https : //unix.stackexchange.com/a/196014/5132
  • 您将不得不小心遵循随机WWW浏览找到的一般系统建议,因为您“知道”“它现在都是系统化的”。 您将看到有人在讨论使用systemctl--user选项运行命令。 这不适用于Ubuntu(尚)。 upstart和systemd在这个领域有很大的不同,Ubuntu 15版仍然使用upstart per-session init而不是systemd per-user实例 。 例如, https://superuser.com/a/860598/38062将不适用。 ☺

正如其他人已经在这里指出的那样,从理论上讲,这不应该影响非技术最终用户 – 理论上理论和实践之间没有区别,但实际上存在差异。

澄清

我认为这里发布的一些内容需要一些澄清:

它是一个init系统,而不是用户传统上与之交互的东西。

SysV init和Upstart都是这种情况,但不再是systemd的情况了。 它做了很多用户传统上与之交互的事情:


它应该完全取代Upstart提供的function – 并做一些额外的事情

要澄清两件事 – 首先要完全取代Upstart:

没有SysV初始化脚本

人们对systemd的一个问题是它不运行SysV init脚本。 所以有一个例子,它并没有完全取代Upstart提供的function。

这是我们可以依赖30多年的东西,传统上你编写了SysV init脚本以获得最大的可移植性,而不必重复自己(通过编写相同脚本的多个版本),但情况不再如此。

当仅使用来自官方存储库的软件包时,这应该不是问题,因为大概所有过去具有SysV init或Upstart脚本的软件包都需要在打包之前重写其脚本。

对于碰巧使用任何第三方或自定义软件的人来说,只有一个问题是,他们的初始脚本是为SysV init或Upstart编写的,而且在升级到带有systemd的系统之前需要重写init脚本(或者获取)安装的upstart, 也是一个选项 ,或迁移到不使用systemd的系统)。

有一个systemd-sysv-generator应该自动将SysV init脚本转换为systemd脚本,但是有一些bug和一长串显式不兼容性 。

现在,第二个澄清 – 关于那些额外的东西:

额外的东西很少

系统化的那些“少数额外的东西”将会覆盖 – 根据A Perspective for systemd – 已经取得的成就,以及 Lennart Poettering在2014年GNOME.asia所展示的内容 – 如下:

  • init系统
  • 期刊记录
  • 登录管理
  • 设备管理
  • 临时和易失性文件管理
  • 二进制格式注册
  • 背光保存/恢复
  • rfkill保存/恢复
  • bootchart
  • 预读
  • 加密存储设置
  • EFI / GPT分区发现
  • 虚拟机/容器注册
  • 集装箱管理
  • 主机名管理
  • 现场管理
  • 时间管理
  • 随机种子管理
  • sysctl变量管理
  • 控制台管理
  • 内省
  • 自动发现
  • 即插即用
  • 网络管理
  • systemd-networkd
  • DNS缓存
  • mDNS响应者
  • LLMNR响应者
  • DNSSECvalidation
  • IPC在内核中
  • kdbus
  • SD总线
  • 与NTP的时间同步
  • systemd-timesyncd
  • 与容器集成
  • 沙盒服务
  • 应用程序的沙盒
  • OS图像格式
  • 容器图像格式
  • 应用图片格式
  • GPT具有自动发现function
  • 无状态系统
  • 可实例化的系统
  • 工厂重置
  • 节点初始化和更新
  • 与云集成
  • 跨节点的服务管理
  • 可validation的操作系统映像一直到固件
  • 引导加载
  • 构建Internet的下一代操作系统统一分布之间的无意义差异

所以回到:“它是一个初始化系统,而不是用户传统上与之交互的东西。” – 必须指出的是,init系统只是该列表中的一个项目。


最后,我要评论的最后一件事:

[T]他只有非技术用户才会看到这是出错的时候。

哦,多么宽慰。 🙂

变化

最终用户(除了脚本本身)最值得注意的更改是启动和停止服务并使用如下命令:

  • 屏幕
  • TMUX
  • nohup的

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

这不是一个错误,它是一个设计选择,所以它不太可能在将来得到修复。 这就是Lennart Poettering就此问题所说的话 :

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

有关详情,请参阅:

  • 默认情况下,Systemd开始杀死您的后台进程
  • 用户注销后,Systemd v230会终止后台进程,中断屏幕,tmux
  • Debian Bug#825394: 用户注销后systemd杀死后台进程

运行screen

  • 新贵: screen
  • systemd: systemd-run --user --scope screen

(注意:上面的“upstart”的行为实际上除了systemd之外的任何事情,这不是特定的新贵)

开始工作foo:

  • 新贵: start foo
  • systemd: systemctl start foo

停止工作foo:

  • 新贵: stop foo
  • systemd: systemctl stop foo

重启job foo:

  • 新贵: restart foo
  • systemd: systemctl restart foo

列出工作状态:

  • upstart: initctl list
  • systemd: systemctl status

(请参阅我对Upstart和systemd的优缺点有什么回答?有关此问题范围之外的更多详细信息。)

日志

处理日志也有很大的不同,因为与Unix传统相反,systemd的日志以自定义格式存储在二进制文件中,因此不是:

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

您需要使用特殊命令来访问日志:

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

争议

首先将系统引入Debian,然后引入Ubuntu并不是没有争议和广泛的反对意见,正如编写以下文章之一的人所知道的那样:

  • 遇见Devuan,一个苦涩的系统叛乱 (PCWorld) 诞生的Debian岔路口
  • 抓住你的干草叉:周一Ubuntu切换到systemd (The Register)
  • Linux系统上的Linus Torvalds和其他人 (ZDNet)
  • 关于systemd争议 (勘误表安全)

关于systemd的官方Debian立场以及由此产生的争议导致了2014年的Exodus声明,并以Ian Jackson的辞职告终。

Init FreedomWithout-Systemd.orgSystemd-Free.org计划诞生了, 对Hacker News进行了大量讨论 。

进一步阅读

  • 今天悲伤的消息:系统决定由Paul Wouters 部署在Ubuntu 16.10中
  • 关于没有Systemd的systemd的争论
  • systemd与SysV不兼容的列表 (官方文档)
  • 由Derrik Diener 重新启用Ubuntu 15.04上的Upstart
  • systemd sysv init兼容模式:它如何工作以及何时中断进行故障排除
  • Upstart和systemd的优缺点是什么? 在unix.stackexchange.com上