更快速地启动 Linux

进行 Linux 内核和固件开发会导致多次重启和大量时间浪费。
145 位读者喜欢这篇文章。

在我拥有或使用过的所有计算机中,启动速度最快的是 20 世纪 80 年代的计算机;当您的手从电源开关移到键盘时,BASIC 解释器已准备好接收您的命令。现代计算机启动时间从笔记本电脑的 15 秒到小型家用服务器的几分钟不等。为什么启动时间会有如此大的差异?

20 世纪 80 年代的微型计算机直接启动到 BASIC 提示符,它有一个非常简单的 CPU,一旦通电,就开始从内存地址获取和执行指令。由于这些系统在 ROM 中有 BASIC,因此没有加载时间——您可以非常快速地获得 BASIC 提示符。同一时代的更复杂的系统,例如 IBM PC 或 Macintosh,启动时间显着(约 30 秒),但这主要是由于必须从软盘读取操作系统 (OS)。在能够加载操作系统之前,只有几秒钟花费在固件中。

现代服务器通常在固件中花费数分钟而不是数秒,然后才到达从磁盘启动操作系统的地步。这主要是由于现代系统复杂性的增加。CPU 不再能够启动并以全速开始执行指令;我们已经习惯了 CPU 频率缩放、节省大量功耗的空闲状态以及多个 CPU 内核。事实上,现代 CPU 内部有数量惊人的更简单的 CPU,它们有助于启动主 CPU 内核并提供运行时服务,例如在 CPU 过热时限制频率。在大多数 CPU 架构上,在 CPU 内部这些内核上运行的代码以不透明的二进制 blob 形式提供。

在 OpenPOWER 系统上,CPU 内部每个内核上执行的每条指令都是开源软件。在使用 OpenBMC 的机器(例如 IBM 的 AC922 系统和 Raptor 的 TALOS II 和 Blackbird 系统)上,这也扩展到在基板管理控制器上运行的代码。这意味着我们可以深入了解从您插入电源线到显示熟悉的登录提示这段时间里到底发生了什么。

如果您是 Linux 内核团队的一员,您可能会启动许多内核。如果您是固件团队的一员,您可能会启动许多不同的固件映像,然后启动操作系统以确保您的固件仍然有效。如果我们能够缩短硬件的启动时间,这些团队可以变得更高效,并且最终用户在设置系统或重启以安装固件或操作系统更新时可能会心存感激。

多年来,Linux 发行版的启动时间已经进行了许多改进。现代 init 系统可以很好地处理并发和按需执行操作。在现代系统上,一旦内核开始执行,只需几秒钟即可到达登录提示符。这几秒钟不是优化启动时间的地方;我们必须更早地介入:在到达操作系统之前。

在 OpenPOWER 系统上,固件通过启动存储在固件闪存芯片中的 Linux 内核来加载操作系统,该内核运行一个名为 Petitboot 的用户空间程序,以查找保存用户想要启动的操作系统的磁盘,并使用 kexec() 对其进行操作。这种代码重用利用了为加快 Linux 启动速度所做的努力。即便如此,我们还是在内核配置和用户空间中找到了可以改进的地方,并且可以轻松节省几秒钟的启动时间。通过这些优化,启动 Petitboot 环境仅占启动时间的个位数百分比,因此我们必须在其他地方寻找更多改进。

在 Petitboot 环境启动之前,还有一个先前的固件位,称为 Skiboot,在此之前是 Hostboot。在 Hostboot 之前是 Self-Boot Engine,它是芯片上的一个单独内核,可以启动单个 CPU 内核并从三级缓存中执行指令。这些组件是我们可以在缩短启动时间方面取得最大进展的地方,因为它们占用了绝大部分时间。也许其中一些组件没有得到充分优化,或者没有尽可能多地并行执行操作?

另一种攻击途径是重启时间而不是启动时间。在重启时,我们真的需要重新初始化所有硬件吗?

与任何现代系统一样,改进启动(和重启)时间的解决方案是并行执行更多操作、处理遗留问题以及(可以说)作弊的混合体。


Stewart Smith 将在 1 月 21 日至 25 日于新西兰基督城举行的 linux.conf.au 上展示 更快速地启动

User profile image.
Stewart 目前在 IBM 的 Linux 技术中心工作,负责 OPAL,即 OpenPOWER 抽象层——POWER 系统的开源固件。当您没有固件的源代码时,他目前觉得很奇怪,而当您可能没有运行每日构建版本时,他会觉得更加奇怪。

9 条评论

我在家里的电脑(core i3 3.5Ghz,8GB 内存,机械硬盘)从冷启动到登录提示符需要 54 秒。它运行的是 OpenSuse。登录后,电脑会启动 Firefox、Sypheed、我的弹出日历和一个脚本,告诉我关机时运行的备份工作正常。22 秒后,一切就绪。

我的工作电脑,配置类似,但运行 Windows 10,从冷启动到登录需要 2 分半钟。登录后,它会启动 Firefox 和 Outlook 邮件客户端以及组策略执行的任何操作。90-100 秒后,它完成所有操作(所有沙漏都消失了),我可以开始工作了。

我有时在工作中使用的配置较低的 Windows 7 电脑,启动速度更快,登录速度也更快。我的雇主还在我的办公桌上放了一台 Mac。它采用 i5 处理器,启动和登录速度比 W10 快,但不如我的家用 Linux 电脑快。

如果您使用 lzo 或 lz4 压缩来压缩整个操作系统 Squashfs,并对其进行 overlay mount,则可以将速度提高 2 倍或更多。这需要手动调整您的 initrd,这可能会被自动更新破坏。

回复 ,作者 MartyMonroe

这是我们考虑研究的事情。但是,如果我们能将启动时间减半,那么节省的时间只占总启动时间的一小部分,而这样做的投入却很高,因为我们需要一种方法来签名、验证和测量 squashfs 映像,以实现安全和可信启动。

因此,我们的下一批工作将集中在其他固件组件上 :)

回复 ,作者 Szycha (未验证)

一如既往,这是一篇内容丰富的文章,但和往常一样,有点令人沮丧。为了研究启动过程,甚至有必要获得一个完全开放的系统。与 LibreBoot 一样,硬件最终变成了 IBM 硬件。也许当涉及到软件自由(或软件和固件自由的结合?)时,存在某种“没有免费午餐”的原则

https://twitter.com/JonErlichman/status/1083812854854307840

不过,与 Raptor Blackbird 系统相比,现在获得它的成本要低得多——这是一款 microATX 主板,可以以 1200 美元的价格购买配备 4 核 CPU 的版本。

也许其他硬件供应商应该效仿我们的榜样,尊重自由 :)

回复 ,作者 Lori

让我恼火的不是启动时间。而是现在所有主要发行版都坚持使用 systemd 的关机时间。

我希望看到一篇关于更快关机的文章。在一个简单的桌面环境中,每个服务 30 秒应该足以稳定下来。我徒劳地搜索过在服务启动时或启动后手动更改关机时间的方法,或者在关机作业运行时截断它的方法。

非常需要一篇涵盖此主题的文章。

如果有人去解决这个问题就好了,我也感同身受。但这不是我目前的专业领域。也许在 Linux 发行版深耕的人可以写一篇?

回复 ,作者 Guy Scree (未验证)

海洋学家、计算机科学教师、独立软件开发者
系统架构师(FOSS 和 WinDoze),精通混合语言编程和 XUL 又名 Mozilla 源代码

回复 ,作者 stewart-ibm

绝对应该优化关机

Creative Commons License本作品已根据 知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.