Ubuntu 放弃 Upstart

作者: James Darvell

在 2015年4月23日,Ubuntu 15.04 版本(代号 Vivid Vervet)发布。这是一个重要的版本,尽管表面上看起来和之前的版本非常相似。真正的区别在于“内在”,因为 Ubuntu 从 Upstart init 系统切换到 systemd。

Init 系统

Upstart 和 systemd 都是 init 系统。Init 系统是内核在启动过程中运行的第一个用户空间程序,负责运行所有其他进程、服务和守护进程。在 Linux 的大部分历史中,都使用了历史悠久的 System V init 进程,它可以追溯到 1983 年。

旧的 System V init 进程的问题在于,它是为更老一代的计算机设计的。那时,软件和硬件都远没有现在复杂,功能也更弱。对于现代计算机来说,System V init 进程太慢了,因为它没有充分利用计算机资源。

System V init 进程一次启动一个守护进程和服务,等待每个进程完成启动后再继续下一个。对于多核处理器和支持多任务处理的内核来说,并行启动这些进程会更好。

System V 方法的另一个问题是,系统管理员需要非常仔细地配置守护进程和服务的顺序,因为它们之间存在依赖关系。一些服务期望在它们启动时另一个服务已经运行。如果它们启动顺序不对,可能会导致错误。

System V 的 init 系统在过去很棒,但它不太适合现代发行版。

Upstart

Canonical 针对启动过程缓慢的解决方案是 Upstart。这个 init 系统最初是为 Ubuntu 创建的,但它被设计为可以与任何发行版一起工作。Upstart 使用“贪婪的基于事件”的模型解决了依赖关系和并行启动进程的问题。这减轻了管理员的很大负担,因为 Upstart 能够计算出加载进程的最佳顺序。“贪婪”意味着 Upstart 会根据“事件”尽快运行所有作业。当一个进程完成启动时,就会发生事件,然后依赖于它的进程将能够运行。

因此,Upstart 努力启动尽可能多的进程,直到所有可用的进程都在运行,但实际上某些服务在典型的会话期间可能不会被使用。有人可能会认为在启动时启动所有可用的服务和守护进程是浪费。

systemd

systemd 是作为一个独立项目开发的,由 Lennart Poettering 和 Kay Sievers 发起。它采用不同的方法来并行化启动过程。它仅在至少一个其他进程需要它时才启动一个进程。当然,为了启动,某些进程必须在启动过程中被需要(否则任何东西都不会运行)。

这种“懒惰”的方法意味着,很少使用的服务直到进程或用户第一次请求时才会被启动。这是一种比 Upstart 更精简的方法,Upstart 不区分常用进程和不常用进程。鉴于这些差异,systemd 启动 Ubuntu 比 Upstart 稍快也就不足为奇了。

潜在的故障

Ubuntu 不是第一个使用 systemd 的发行版。Debian(Ubuntu 的“爸爸”)最近也进行了切换。其他发行版由于切换而遇到了错误。例如,配置启动配置文件的服务管理器必须更改为与新的 init 系统一起工作。

Ubuntu 通过保留其旧的 init 配置文件格式以及 systemd 使用的新格式,巧妙地避开了这个问题。Ubuntu 中使用的 systemd 版本可以读取这两种格式。因此,使用 Upstart 配置设置的旧工具仍然可以工作。

systemd 确实比 Upstart 提供了启动性能的提升,但社区中的一些成员担心 systemd 处理服务消息的方式会降低性能,甚至为拒绝服务攻击打开大门。

显然,Canonical 一定对 systemd 抱有很大的信心,才会放弃 Upstart(它自己的项目)而支持它。随着时间的推移,我们将看到这是否是一个明智的决定。

加载 Disqus 评论