我们正在开发一款依赖于启动脚本的产品。我们的原型为此使用了 rc.local,但我们注意到 upstart 和 systemd 是更现代的方法。然而,我们还没有发现太多具体的证据来说明为什么我们更喜欢 upstart 或 systemd 而不是 rc.local。
为什么选择 upstart 或 systemd?在选择方法时,我们特别关注安全性。
答案1
首先,你的产品不应该使用rc.local
根本.rc.local
是供系统管理员摆弄的;他们可以对它做任何他们想做的事情(只要它成功退出)。这使得编辑它变得非常棘手。
那么你应该使用哪一个呢?答案很简单。
他们全部。
系统在任何时候都使用单个 init 系统。如果您为所有系统提供配置,则会自动使用与正在运行的系统最兼容的系统。
快速概览
系統V初始化
- Upstart 和 systemd 都支持这些,因此您可以编写 sysv init 脚本并让它们在任何地方运行。
- 这个 init 系统只做一件事:使用适当的参数调用您的脚本。其他所有事情 - 跟踪启动的进程、更改用户、设置环境等,都必须在您的脚本中完成。如果您不擅长编写脚本(脚本通常是 shell 脚本,但我想也可以是其他脚本),这会使 init 脚本方法变得脆弱。为方便起见,提供了一些标准函数,位置因发行版而异。
- 初始化脚本的排序基于文件名和在各个
/etc/rc*
目录中的存在,以及特殊注释标题。
新贵 (≤ 14.04)
- 基于事件。可以让你的工作在开始之前等待特定事件发生(文件系统挂载、网络启动)。
- 不幸的是,Upstart 的实现使得使用更复杂的启动配置变得很棘手。此外,事后很难将您的作业插入其他作业的依赖链中。
systemd(≥ 16.04)
- 基于依赖关系。单元在需要时启动。请参阅适用于 Upstart 用户的 Systemd了解更多信息。Debian、Ubuntu 和基于 RHEL 的系统中当前的默认初始化。
- Systemd 基于 cgroups 的进程跟踪方法最为可靠。这使得进程很难逃脱给定的(安全)环境或资源限制。
- 管理员可以轻松覆盖初始化配置,而无需冒犯软件包维护者。
Upstart 和 systemd 都比 sysv init 具有明显的优势。它们都更具声明性而非命令性,并且内置了对管理服务所涉及的各种任务的支持。无论你支持哪个版本,你都应该使用最新的 init 系统。
答案2
Systemd 是 Upstart 的改进版,所以在我看来,问哪个更好或更安全并不公平。最好问问自己”我想按照老方法做事吗“如果是 Upstart,否则为 Systemd。
检查差异这里,我个人喜欢继续前进,因为这是 Systemd 的目的。两者都具有出色的安全性,由于您来自 Windows,请阅读Linux 安全的历史,那么我相信你会做出更好的决定。
再次rc.local
欢迎老派人士来到 Linux,我们相信未来,所以现在就把事情做好,而不是停留在过去。