答案1
2016年更新
这里的大多数答案都是五年前的,所以是时候进行一些更新了。
Ubuntu 过去默认使用 upstart,但去年他们放弃了它,转而使用 systemd - 请参阅:
正因为如此,有一篇不错的文章面向新贵用户的 SystemdUbuntu wiki - upstart 和 systemd 之间非常详细的比较以及从 upstart 到 systemd 的过渡指南。
(注意根据 Ubuntu 维基默认情况下,您仍然可以通过安装upstart-sysv
并运行来在当前版本的 Ubuntu 上运行 upstart sudo update-initramfs -u
,但考虑到 systemd 项目的范围,我不知道它在实践中是如何工作的,也不知道 systemd 是否可以卸载。)
下面的命令和脚本部分中的大部分信息改编自该文章中使用的一些示例(就像 Stack Exchange 用户贡献一样,可以方便地获得许可)知识共享署名-相同方式共享 3.0 许可证)。
以下是常用命令和简单脚本的快速比较,请参阅下面的部分以获取详细说明。这个答案将基于 Upstart 的系统的旧行为与基于 systemd 的系统的新行为进行比较,如问题中所问,但请注意,标记为“Upstart”的命令不一定是 Upstart 特定的 - 它们通常是以下命令对于每个非 systemd Linux 和 Unix 系统都是通用的。
命令
运行苏:
- 暴发户:
su
- 系统:
machinectl shell
(请参阅下面的“su 命令替换”部分)
运行画面:
- 暴发户:
screen
- 系统:
systemd-run --user --scope screen
(请参阅下面的“意外终止后台进程”部分)
运行 tmux:
- 暴发户:
tmux
- 系统:
systemd-run --user --scope tmux
(请参阅下面的“意外终止后台进程”部分)
开始工作 foo:
- 暴发户:
start foo
- 系统:
systemctl start foo
停止作业 foo:
- 暴发户:
stop foo
- 系统:
systemctl stop foo
重新启动作业 foo:
- 暴发户:
restart foo
- 系统:
systemctl restart foo
列出职位:
- 暴发户:
initctl list
- 系统:
systemctl status
检查作业 foo 的配置:
- 暴发户:
init-checkconf /etc/init/foo.conf
- 系统:
systemd-analyze verify /lib/systemd/system/foo.service
列出作业的环境变量:
- 暴发户:
initctl list-env
- 系统:
systemctl show-environment
设置作业的环境变量:
- 暴发户:
initctl set-env foo=bar
- 系统:
systemctl set-environment foo=bar
删除作业的环境变量:
- 暴发户:
initctl unset-env foo
- 系统:
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
例子系统脚本写在/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
已合并到 pull request #1022 中的 systemd 中:
因为,根据伦纳特·珀特林的说法,“su确实是一个破碎的概念”。
他解释说“您可以像以前一样使用 su 和 sudo,但是不要指望它能完全发挥作用”。
现在实现su
类似行为的官方方法是:
machinectl shell
已经进一步 伦纳特·珀特林解释 在问题 #825 的讨论中:
“嗯,对此已经进行了很长时间的讨论,但问题是 su 应该做什么还很不清楚。[...]长话短说:su 确实是一个破碎的概念。它会给你一种外壳,并且使用它来实现这一点很好,但这不是完整的登录,并且不应被误认为是完整的登录。” ——伦纳特·珀特林
也可以看看:
- Lennart Poettering 将“su”命令替换合并到 systemd 中:在 Fedora Rawhide 上进行测试
- Systemd 吸收“su”命令功能
- Systemd 吸收“su”(黑客新闻)
意外终止后台进程
命令如下:
不再按预期工作。例如,nohup
是一个 POSIX 命令,用于确保进程在您注销会话后继续运行。它不再有效在 systemd 上。screen
还tmux
需要以特殊方式或其他方式调用类似的程序您与它们一起运行的进程将被终止(虽然不杀死这些进程通常是运行 screen 或 tmux 的主要原因)。
这不是一个错误,而是一个深思熟虑的决定,因此将来不太可能得到修复。这就是伦纳特·珀特林所说的说关于这个问题:
在我看来,UNIX 实际上很奇怪,它默认允许任意用户代码在注销后不受限制地保留。许多操作系统人员已经讨论了很长时间,这应该是可能的,但肯定不是默认的,但到目前为止,没有人敢打开开关,将其从默认设置变为选项。注销后不清理用户会话不仅丑陋而且有些黑客行为,而且还是一个安全问题。 systemd 230 现在终于打开了开关,并最终默认在用户注销时正确清理所有内容。
欲了解更多信息,请参阅:
- Systemd 默认开始终止后台进程
- Systemd v230 在用户注销、打破屏幕、tmux 后杀死后台进程
- Debian 错误#825394:用户注销后 systemd 杀死后台进程
高层次的启动理念
在某种程度上,systemd 是向后工作的——在 upstart 中,作业会尽快启动,而在 systemd 中,作业则在必须时启动。归根结底,两个系统都可以以几乎相同的顺序启动相同的作业,但可以说您是从相反的方向考虑的。
方法如下面向新贵用户的 Systemd解释一下:
暴发户启动进程(作业)的模型是“基于贪婪事件”,即启动事件发生的所有可用作业都会尽早启动。在启动过程中,upstart 会合成一些初始事件,例如启动或 rcS 作为“树根”,早期服务在这些事件上启动,而后期服务在前者运行时启动。新作业只需将其配置文件安装到 /etc/init/ 即可激活。
系统启动进程(单元)的模型是“基于惰性依赖”,即只有当其他启动单元依赖于某个单元时,该单元才会启动。在启动过程中,systemd 启动一个“根单元”(default.target,可以在 grub 中覆盖),然后它会传递扩展并启动其依赖项。新单元需要将自身添加为引导序列单元(通常为 multi-user.target)的依赖项才能激活。
在发行版中的使用
现在根据维基百科的一些最新数据:
默认使用 upstart 的发行版:
- 乌班图(9.10 至 14.10)
- Chrome操作系统
- 铬操作系统
默认使用 systemd 的发行版:
- 架构Linux- 自 2012 年 10 月起
- 中央操作系统- 自 2014 年 4 月 (7.14.04)
- 核心操作系统- 自 2013 年 10 月起 (v94.0.0)
- 德班- 自 2015 年 4 月起 (v8)
- 软呢帽- 自 2011 年 5 月起 (v15)
- 马吉亚- 自 2012 年 5 月起 (v2.0)
- 开放SUSE- 自 2012 年 9 月起 (v12.2)
- 红帽企业 Linux- 自 2014 年 6 月起 (v7.0)
- SUSE Linux 企业服务器- 自 2014 年 10 月起 (v12)
- 乌班图- 自 2015 年 4 月起 (v15.04)
(看维基百科获取最新信息)
既不使用 Upstart 也不使用 systemd 的发行版:
- 德瓦安(由于 Debian 社区中的 systemd 争议而创建了 Debian 分叉,导致 Debian 社区的成员辞职)伊恩·杰克逊) - 特别提倡初始自由考虑包含以下 init 系统:西尼特,开放式RC,运行,s6和牧羊人。
- 虚空Linux- 用途运行作为 init 系统和服务主管
- 根图- 用途开放式RC
- 操作系统- 用途发射
- 自由BSD使用一个传统 BSD 风格的 init(不是 SysV 初始化)
- 网络BSD用途RC.d
- 蜻蜓使用传统的在里面
- 开放BSD使用RC系统启动脚本描述这里
- 阿尔卑斯Linux(相对较新且鲜为人知的发行版,非常强调安全性,变得越来越流行 - 例如码头工人是将其官方镜像从 Ubuntu 迁移到 Alpine)使用开放式RC初始化系统
争议
在过去Debian 的一个分支已经被提议来避免 systemd。这德文 GNU+Linux创建了 - 一个没有 systemd 的 Debian 分支(感谢墨菲1在评论中指出)。
有关此争议的更多信息,请参阅:
你们中的许多人可能已经知道,Ian Jackson 推动的 Init GR Debian 投票对于保护 Debian 的遗产及其用户免受 systemd 雪崩的影响并没有什么用处。
这种情况可能会锁定 systemd 依赖项,这实际上会威胁开发自由,并对 Debian 及其上游和下游造成严重后果。
CTTE 成功地交换了依赖关系,并通过 sysvinit 微妙地安装了 systemd 为我们赢得了时间,但即使这个过程也很疲惫且充满戏剧性。最终,一周前,伊恩·杰克逊辞职了。 [...]
我辞去技术委员会职务,立即生效。
尽管 TC 中应该继续代表 30-40% 的项目成员的观点,这一点很重要,但我本人在这一点上显然是一个很有争议的人物,无法这样做。我应该靠边站,努力减少有关项目治理的对话的个性化程度。 [...]
- 初始自由:
Devuan 的诞生源于关于将其用作 Debian 默认 init 系统的争议。这Debian 对 systemd 的官方立场充满了声称其他人已经揭穿。有兴趣的读者可以继续讨论这个热门话题systemd 争议。不过,我们鼓励您保持冷静并保持文明的声音。在 Devuan,我们更感兴趣的是对它们进行错误的编程,而不是回顾过去。 [...]
一些专门讨论 systemd 争议的网站和文章已经创建:
有很多黑客新闻上有趣的讨论:
- https://news.ycombinator.com/item?id=7728692
- https://news.ycombinator.com/item?id=13387845
- https://news.ycombinator.com/item?id=11797075
- https://news.ycombinator.com/item?id=12600413
- https://news.ycombinator.com/item?id=11845051
- https://news.ycombinator.com/item?id=11782364
- https://news.ycombinator.com/item?id=12877378
- https://news.ycombinator.com/item?id=10483780
- https://news.ycombinator.com/item?id=13469935
在其他发行版中也可以观察到类似的趋势:
哲学
暴发户遵循 DOTADIW 的 Unix 哲学 - “做一件事并把它做好”。它是传统 init 守护进程的替代品。除了启动和停止服务之外,它不执行任何其他操作。其他任务被委托给其他专门的子系统。
系统所做的远不止于此。除了启动和停止服务之外,它还管理密码、登录、终端、电源管理、恢复出厂设置、日志处理、文件系统挂载点、网络等等 - 请参阅消息文件的一些功能。
扩张计划
根据对 systemd 的展望 已取得的成就以及未来的发展根据 Lennart Poettering 于 2014 年在 GNOME.asia 上的演讲,以下是 systemd 的主要目标、已涵盖的领域和仍在进行中的领域:
系统目标:
我们的目标
将 Linux 从一堆零碎的东西变成一个有竞争力的通用操作系统。
构建互联网的下一代操作系统 统一发行版之间毫无意义的差异
将创新带回核心操作系统
桌面、服务器、容器、嵌入式、移动、云、集群、. 。 。这些区域比您想象的更紧密
降低管理员复杂性,无需监督即可提高可靠性
一切都值得反省
自动发现、即插即用是关键
我们修复损坏的东西,而不是用胶带粘住它们
已经覆盖的领域:
我们已经涵盖的内容:
初始化系统、日志记录、登录管理、设备管理、临时和易失性文件管理、二进制格式注册、背光保存/恢复、rfkill 保存/恢复、bootchart、预读、加密存储设置、EFI/GPT 分区发现、虚拟机/容器注册、最小容器管理、主机名管理、区域设置管理、时间管理、随机种子管理、sysctl 变量管理、控制台管理、. 。 。
工作正在进行中:
我们正在做什么:
- 网络管理
- systemd-networkd
- 本地 DNS 缓存、mDNS 响应器、LLMNR 响应器、DNSSEC 验证
- 内核中的IPC
- kdbus、sd 总线
- 与 NTP 时间同步
- systemd-时间同步
- 与容器的更多集成
- 服务沙箱
- 应用程序沙箱
- 操作系统镜像格式
- 容器镜像格式
- 应用图像格式
- 具有自动发现功能的 GPT
- 无状态系统、可实例化系统、恢复出厂设置
- /usr 是操作系统
- /etc 是(可选)配置
- /var 是(可选)状态
- 原子节点初始化和更新
- 与云集成
- 跨节点服务管理
- 可验证的操作系统映像
- 一直到固件
- 引导加载
本回答的范围
作为墨菲1评论中指出,“应该指出的是,多年来 systemd 的工作范围已经远远超出了简单的系统启动范围。”
我试图在这里包含大部分相关信息。在这里,我按照问题中的要求比较了 Upstart 和 systemd 在用作 init 系统时的共同功能,我只提到 systemd 超出 init 系统范围的功能,因为这些功能无法与 Startup 进行比较,但它们的存在很重要了解这两个项目之间的区别。应检查相关文档以获取更多信息。
更多信息
更多信息请访问:
- 暴发户网站
- 系统网站
- 暴发户在维基百科上
- 系统在维基百科上
- 系统架构在维基百科上
- Linus Torvalds 和其他人讨论 Linux 的 systemd(ZD网)
- 关于 systemd 争议作者:罗伯特·格雷厄姆
- 发起自由运动
- 从 upstart 转向 systemd 的理由是什么?
附加功能
这氧化亚铅团队创建了一个Systemd 与 SysV Init Linux 备忘单。
答案2
upstart 和 systemd 都是尝试解决传统 SysV init 系统局限性的一些问题。例如,某些服务需要在其他服务之后启动(例如,在网络运行之前无法挂载 NFS 文件系统),但 SysV 中处理该问题的唯一方法是在 rc#.d 目录中设置链接使得一个在另一个之前。除此之外,当添加或更改依赖项时,您可能需要稍后对所有内容重新编号。 Upstart 和 Systemd 有更智能的设置来定义需求。另外,还有一个问题是,所有内容都是某种 shell 脚本,并不是每个人都能编写最好的初始化脚本。这也会影响启动速度。
我可以看到 systemd 的一些优点:
- 每个启动的进程都有自己的 cgroup 或特定的 cgroup。
- 为服务预先创建套接字和文件句柄,类似于 xinetd 为其服务所做的事情,从而允许依赖的服务更快地启动。例如,systemd 将为 syslog 保持打开 /dev/log 的文件句柄,并且发送到 /dev/log 的后续服务将缓冲其消息,直到 syslogd 准备好接管为止。
- 实际启动服务时运行的进程更少。这意味着您没有编写 shell 脚本来启动您的服务。这可以提高速度,并且(IMO)首先更容易设置。
我知道的一个缺点是,为了利用 systemd 的套接字/FH 预分配,许多守护进程必须进行修补才能让 systemd 将 FH 传递给它们。
答案3
看到systemd
上面提到的ML 总将军今天。所以请仔细阅读。H在线一如既往是 Linux 技术的重要来源,也是我开始研究的地方Systemd 作为 SysV Init 和 Upstart 的替代品。然而,H Online 文章(在本例中)并不是非常有用的读物,其背后的真正用途是它提供了有用读物的链接。
真正的答案就在系统公告。其中给出了 SysV initd 的问题以及新系统需要做什么的一些关键点
开始少一点。
并开始更多的并行工作。
它的主要计划似乎是仅在需要时启动服务,并为该服务启动套接字,以便需要它的服务可以在守护程序完全在线之前很久就连接到创建的套接字。显然,套接字将保留少量缓冲数据,这意味着在延迟期间不会丢失数据,一旦守护进程在线,数据就会被处理。
该计划的另一部分似乎是不序列化文件系统,而是也按需挂载这些文件系统,这样您就不会等待您的/home/
等(不要与 混淆/etc
)挂载,和/或fsck
当您可以时启动守护进程等/
已/var/
安装。它表示将使用 autofs 来达到此目的。
.desktop
它还具有创建样式初始化描述符作为脚本替代品的目标。这将防止大量缓慢的sh
进程,甚至更多的进程分支,例如shell 脚本中经常使用的sed
和。grep
他们还计划在需要时不启动某些服务,如果不再需要它们甚至可能关闭它们,例如,仅当您使用蓝牙设备时才需要蓝牙模块和守护程序。给出的另一个例子是 ssh 守护进程。这就是 inetd 能够完成的事情。就我个人而言,我不确定我是否喜欢这个,因为当我确实需要它们时,这可能意味着延迟,并且在 ssh 的情况下,我认为这意味着可能的安全漏洞,如果我的 inetd 受到损害,整个系统都会受到损害。然而,我被告知,使用它来破坏这个系统是不可行的,如果我愿意,我可以通过每个服务和其他方式禁用这个功能。
另一个功能显然是能够根据时间事件启动,无论是在定期安排的时间间隔还是在某个特定时间。这crond
与现在的操作类似atd
。尽管我被告知它不支持用户“cron”。就我个人而言,这听起来是最毫无意义的事情。我认为这是由不在多用户环境中工作的人编写/想到的,如果您是系统上的唯一用户,除了不以 root 身份运行之外,用户 cron 没有太多目的。我每天都在多用户系统上工作,规则始终是作为用户运行用户脚本。但也许我没有他们那样的远见,而且它绝不会让我无法运行crond
或atd
,所以它不会伤害任何人,除了我想的开发人员。
systemd 的一大缺点是必须修改一些守护进程才能充分利用它。它们现在就可以工作了,但是如果它们是专门为其套接字模型编写的,那么它们会工作得更好。
似乎大部分 systemd 的人们对 upstart 的问题是事件系统,他们认为它没有意义或没有必要。也许他们的话说得最好。
或者更简单地说:用户刚刚启动 D-Bus 的事实绝不表明 NetworkManager 也应该启动(但这正是 Upstart 会做的)。反之亦然:当用户请求 NetworkManager 时,这绝对表明 D-Bus 也应该启动(这肯定是大多数用户所期望的,对吧?)。
一个好的初始化系统应该只启动需要的东西,并且按需启动。要么是惰性的,要么是提前并行的。然而,它不应该启动超过必要的范围,特别是不应该启动所有可以使用该服务的安装项目。
正如我已经说过的,这在系统公告。
答案4
要非常详细地了解 systemd,从第一个设计草案开始(以及对现有 init 系统的详细批评,包括新贵,以及 systemd 建议如何修复它们),请访问其主页。随着时间的推移,已经有几篇关于创业的文章发表在低水温网络。请注意,任何提及 systemd (或pulseaudio)的地方都会引发无休止的口水战。
IMVHO(作为 Fedora 用户)我非常对此感到满意。这一行中的一些东西早就应该处理当前 Linux 系统的复杂性了。 Fedora 使用 upstart 有一段时间了,但它从未摆脱过作为 sysvinit 的奇特替代品的阶段,运行的初始化脚本几乎没有变化。它简化启动配置的承诺是以再次手动设置相互依赖关系,这是行不通的。 systemd 会自行解决依赖性(或者只允许启动内容而不考虑依赖性,它们会自行解决)。另一个很大的优点(有人说这是一个严重的缺点)是它充分利用了 Linux 特定的功能(特别是 cgroups 允许隔离守护进程及其所有后代,因此很容易监视、限制资源或杀死它们)一个团体;还有很多其他的)。