当前位置: 首页>>技术教程>>正文


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

, , ,

问题描述

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

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

最佳解决办法

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

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

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

这意味着a fight between various options(理由)和systemd最终获胜。

Canonical went along with Debian因为它最容易也可能是最好的。他们放弃了一个项目而不是上游。它还使我们与其他正在转向systemd的发行版(Red Hat,Fedora等)保持一致。更加专注,减少重复劳动。

长话短说对于非技术人员,这根本不会影响到你。对于Ubuntu来说,它意味着更少的工作和更好的init系统。

次佳解决办法

Could anyone adequately explain to a non-technical user how and if this affect us at all?

理论上,这不应该影响non-technical最终用户,他们没有参与系统实际工作的细节。在实践中,你会看到很多东西。

这是一个不完整的清单:

  • 如果您使用add-on软件使用新手作业定义文件来启动程序,它们将停止工作。你必须安装(并且可能只是编写,但更常见的是只是已经写过的其他人)系统服务单元文件。示例:https://askubuntu.com/questions/613785

  • 系统开发人员对电源管理等事情的各种设计假设导致默认值与您可能习惯的内容不一致。例如,The systemd developers have very definite ideas about what should happen in response to the the lid switches on laptops

  • 如果您使用的是nvidia专有显示驱动程序,那么systemd中会有各种影响您的设计决策。示例:https://askubuntu.com/questions/613773

  • 来自暴发户时并不是真正相关,因为Ubuntu用户已经有一个手册页告诉他们这几年了,但是我提到了non-Ubuntu用户,他们可能会读到这个:来自System 5的其他Linux操作系统用户init + rc由于systemd只与System 5 rc向后兼容,因而被咬了。像暴发户,甚至大多数其他系统,它声称和供应,没有与System 5 init及其配置文件/etc/inittab的向后兼容性。所以那些听从30多年的人建议的人“嗯,你可以只是将此编辑为/etc/inittab …“,或者使用遵循该建议的软件的人现在拥有不在启动时启动的软件。示例:https://unix.stackexchange.com/a/196197/5132

  • 您无法通过systemd shutdown命令进入single-user模式,就像使用以前的shutdown命令一样。除了在系统行话中称为救援模式这一事实之外,救援模式在系统世界观中不被视为关闭状态。它被视为一个运行状态。 shutdown now将关闭机器电源。它是systemctl rescue在系统世界中达到single-user模式。进一步阅读:https://unix.stackexchange.com/a/196471/5132

  • 继续上一个主题:如果你还没有抛弃运行级别的想法,现在是时候这样做了。进一步阅读:https://unix.stackexchange.com/a/196014/5132

  • 你将不得不小心遵循随机WWW浏览找到的一般系统建议,因为你”know”“它现在都是systemd”。您将看到人们谈论使用--user选项向systemctl运行命令。这不适用于Ubuntu(尚)。 upstart和systemd在这方面有很大不同,Ubuntu 15版仍然使用新手per-session init而不是systemd per-user实例。因此,例如,https://superuser.com/a/860598/38062将不适用。 ☺

第三种解决办法

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

Clarification

我认为这里发布的一些事情需要澄清:

It’s an init system, not something users traditionally interact with.

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


It should completely replace the functionality provided by Upstart —and do a few extra things

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

没有SysV初始化脚本

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

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

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

对于碰巧使用任何third-party或自定义软件的人来说,这只是一个问题,他们的初始脚本是为SysV init或Upstart编写的,那些将需要在升级到带有systemd的系统之前重写init脚本(或者获得新手)安装,即also an option,或迁移到不使用systemd的系统)。

systemd-sysv-generator应该自动将SysV init脚本转换为systemd脚本,但是有some bugs和一长列explicit incompatibilities

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

额外的东西很少

根据Lennart Poettering 2014年在GNOME.asia上的A Perspective for systemd – What Has Been Achieved, and What Lies Ahead演示文稿,系统将要涵盖的那些“少数额外的东西” – 如下:

  • init系统

  • 期刊记录

  • 登录管理

  • 设备管理

  • 临时和易失性文件管理

  • 二进制格式注册

  • 背光保存/恢复

  • rfkill保存/恢复

  • bootchart

  • 预读

  • 加密存储设置

  • EFI /GPT分区发现

  • 虚拟机/容器注册

  • 集装箱管理

  • 主机名管理

  • 现场管理

  • 时间管理

  • 随机种子管理

  • sysctl变量管理

  • 控制台管理

  • 内省

  • 自动发现

  • 即插即用

  • 网络管理

  • systemd-networkd

  • DNS缓存

  • mDNS响应者

  • LLMNR响应者

  • DNSSEC验证

  • IPC在内核中

  • kdbus

  • sd-bus

  • 与NTP的时间同步

  • systemd-timesyncd

  • 与容器集成

  • 沙盒服务

  • 应用程序的沙盒

  • OS图像格式

  • 容器图像格式

  • 应用图片格式

  • GPT与auto-discovery

  • 无状态系统

  • 可实例化的系统

  • 工厂重置

  • 节点初始化和更新

  • 与云集成

  • 跨节点的服务管理

  • 可验证的操作系统映像一直到固件

  • 引导加载

  • 构建Internet的下一代操作系统统一分布之间的无意义差异

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


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

[T]he only time a non-technical user will see this is when it goes wrong.

哦,真是一种解脱。 🙂

Changes

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

它不再按预期工作。例如,nohup是一个POSIX命令,用于确保在您从会话中注销后进程继续运行。它是systemd上的no longer works。此外,像screentmux这样的程序需要以特殊方式调用,否则the processes that you run with them will get killed(虽然没有让这些进程被杀死,但通常是首先运行screen或tmux的主要原因)。

这不是一个错误,它是一个设计选择,所以它不太可能在将来修复。这就是Lennart Poettering has said关于这个问题:

In my view it was actually quite strange of UNIX that it by default let arbitrary user code stay around unrestricted after logout. It has been discussed for ages now among many OS people, that this should possible but certainly not be the default, but nobody dared so far to flip the switch to turn it from a default to an option. Not cleaning up user sessions after logout is not only ugly and somewhat hackish but also a security problem. systemd 230 now finally flipped the switch and finally by default cleans everything up correctly when the user logs out.

有关详情,请参阅:

运行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

列出工作状态:

  • 新贵:initctl list

  • systemd:systemctl status

(有关此问题范围之外的更多详细信息,请参阅我对What are the pros/cons of Upstart and systemd?的回答。)

Logs

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

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

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

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

Controversies

首先将系统引入Debian,然后引入Ubuntu并不是没有争议和广泛的反对意见,因为任何撰写以下文章的人都知道:

official Debian position on systemd和生成的controversy导致Exodus declaration in 2014,并以Ian Jackson’s resignation结束。

The Init FreedomWithout-Systemd.orgSystemd-Free.org计划诞生了,有很多discussion on Hacker News

进一步阅读

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/6995.html,未经允许,请勿转载。