写点什么

怎样在 1 秒内启动 Linux

  • 2015-12-02
  • 本文字数:1925 字

    阅读完需:约 6 分钟

尽可能快的启动系统,对于自动化设备是非常重要的。系统能够在用户无法感知的时间内启动,也就意味着在不需要工作时,可以完全切断电源,而不是挂起进入休眠状态。本文基于 Atmel AT91 系列片上系统和 NAND 闪存,经过一系列的优化,将 Linux 系统启动时间,从最初的 11 秒,降低到最终的 656 毫秒。

背景知识

系统从上电到完全启动,需要经过许多过程。一个简化的启动流程大概包含:

  1. 硬件重置
  2. 启动引导程序(bootloader)
  3. 操作系统初始化
  4. 应用程序执行

其中硬件非常关键,但是硬件一般难以更改。后续的优化,主要针对引导程序、Linux 内核和应用程序展开。

引导程序优化

引导程序主要完成对 CPU 的基础设置,处理 ARM 标记(ATAGS,ARM TAGS)或设备树(device trees),切换存储管理单元(MMU,Memory Management Unit)等工作。

重要通知:接下来 InfoQ 将会选择性地将部分优秀内容首发在微信公众号中,欢迎关注 InfoQ 微信公众号第一时间阅读精品内容。

对于 U-Boot,常用的优化方式有:

  • 删除不不要的功能:如网络加载等,如果不需要,那么直接移除这些代码吧;
  • 关闭不需要的功能
    • 关闭内核镜像验证
    • 关闭引导程序输出
    • 关闭启动延迟
  • 将通用功能的引导程序修改成一个优化后的初始程序加载器(Initial Program Loader,IPL),对于 U-Boot,可以通过 SPL(Second Program Loader,第二阶段程序加载器)来实现。

内核优化

Linux 内核被设计的非常灵活,可以针对需要的功能做各种配置优化。因此,优化内核对于系统启动速度是至关重要的。

首先,移除一切不要的驱动,尽可能的减少内核加载的内容,能够大大缩短系统启动时间。其次,还有很多内核选择可能需要进一步尝试,比如内核压缩方式,对于嵌入式系统来说,LZO 压缩方式,通常会是一个不错的选择。最后,还可以通过定制一些启动参数,达到加快启动的目的。例如可以通过“lpj=”参数,预设每个循环需要的节拍数(loops per jiffy,lpj)的值,避免系统在启动时自动推算。这样在基于 ARMv5 的系统中,可以节省 100ms 以上的时间。

对于内核启动的优化,可以通过 bootgraph.pl 脚本(位于内核源码的 script/bootgraph.pl )来绘制内核启动耗时图表,用以分析启动最耗时的地方。这个脚本使用非常简单,直接将 dmesg 的输出作为其输入,即可生成 svg 图表:

dmesg | perl scripts/bootgraph.pl > output.svg生成的图表如下图,

图中每一个色段表示一个功能的初始化耗时。可以简单的关闭不需要的功能,或者针对功能进行特定的优化。

除了内核本身之外,内核所在的文件系统也对系统启动有着非常大的影响。对于使用闪存芯片作为存储的系统来说, UbiFS 是一个很好的选择。它能够容忍意外断电,有着出色的挂载速度,以确保系统快速启动。

应用程序优化

内核完成系统启动之后,接来下就是执行应用程序。对于应用程序的优化,主要有两部分,一部分是由应用程序来接管启动的 INIT 进程,另一部分是优化应用程序的链接方式。

标准的 SystemV INIT 程序,需要执行一堆启动脚本。对于嵌入式系统来说,大部分是没有意义的。另一部分(比如挂载文件系统),可以由应用程序自己来实现。然后,可以在内核启动参数中通过“init=”参数,将 INIT 进程直接指定为应用程序。

应用依赖的动态链接库,会按照以下顺序查找:

  1. LD_PRELOAD 环境变量指定的路径(一般对应文件 /etc/ld.so.preload);
  2. ELF .dynamic 节中 DT_RPATH 入口指定的路径,若 DT_RUNPATH 入口不存在的话;
  3. 环境变量 LD_LIBRARY_PATH 指定的路径,但如果可执行文件有 setuid/setgid 权限,则忽略这个路径;编译时指定–library-path 会覆盖这个路径;
  4. ELF .dynamic 节中 DT_RUNPATH 入口指定的路径;
  5. ldconfig 缓存中的路径(一般对应 /etc/ld.so.cache 文件),若编译时使用了 -z nodeflib 的链接选项,则此步跳过;
  6. /lib,然后 /usr/lib 路径 ,若使用了 -z nodeflib 链接选项,则此步亦跳过;

因此,尽可能的将应用程序依赖的动态链接库放到优先查找的路径,可以加快链接速度。对于交叉编译环境特别需要注意,主机上的动态链接库位置和目标系统上的位置可能不一致,这会增加应用程序执行时动态链接库的加载时间。

总结

基于上面提到的三个优化点,可以将系统的启动时间,从最初的 11s 降低到 656ms(数据参考 Jan Altenberg 在都柏林举行的嵌入式 Linux 会议上的演讲稿)。从硬件到引导程序再到内核最后到应用程序,每个启动步骤都有自己可优化的地方,经过一些简单的优化,就可以减少系统的启动时间。


感谢魏星对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群(已满),InfoQ 读者交流群(#2))。

2015-12-02 18:004759

评论

发布
暂无评论
发现更多内容

【YashanDB知识库】Springboot启动找不到崖山jdbc驱动的问题处理

YashanDB

数据库 yashandb

设计师怎么进行在线评审?2个实用软件盘点!

职场工具箱

效率工具 设计 设计师 软件推荐 在线白板

【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法

YashanDB

数据库 yashandb

Symantec Endpoint Protection 14.3 RU10 v14.3.12154.10000 下载

sysin

超高清4K动态壁纸花见 Live Wallpaper & Themes 4K Pro for Mac激活版

小玖_苹果Mac软件

央视聚焦!天翼云全栈适配DeepSeek 引领国产智算新纪元

极客天地

【YashanDB知识库】共享超过32000字节字符串插入CLOB类型方案

YashanDB

数据库 yashandb

TikTok运营中的IP问题解析

Ogcloud

TikTok tiktok运营 tiktok矩阵 TikTok矩阵运营

普通人也能轻松掌握的20个DeepSeek高频提示词(2025版)

王磊

【YashanDB知识库】DataX迁移Hive到崖山分布式

YashanDB

数据库 yashandb

一文简单了解企业级数据安全管理办法核心以及详细措施等

行云管家

数据安全 堡垒机 企业数据安全

【YashanDB知识库】分布式LSC表修改字段

YashanDB

数据库 yashandb

【YashanDB知识库】扩展redo大小

YashanDB

数据库 yashandb

一文详解 RocketMQ 如何利用 Raft 进行高可用保障

阿里巴巴云原生

阿里云 RocketMQ 云原生

【YashanDB知识库】MySQL field 函数的改写方法

YashanDB

数据库 yashandb

一个测试代币引发的「血案」:TST 从 0 到 5 亿市值始末

TechubNews

加密货币 加密市场 TST

Redis 持久化原理分析和使用建议

vivo互联网技术

redis 持久化

【YashanDB知识库】服务器重启后启动yasom和yasagent进程时有告警

YashanDB

数据库 yashandb

Zonos-v0.1:开源 TTS 模型,支持多语言和高保真声音克隆;「Apple 智能」或即将在国内上线,苹果举行开发者活动

声网

Topaz Gigapixel AI for Mac(AI图片无损缩放工具)v8.2.0激活版

小玖_苹果Mac软件

【YashanDB知识库】共享从 MySQL异常处理CONTINUE HANDLER的改写方法

YashanDB

数据库 yashandb

5G毫米波阵列天线仿真——CDF计算【CST仿真案例】

思茂信息

5G 仿真 CST软件

本地搭建DeepSeek和知识库 Dify做智能体Agent(推荐)

不在线第一只蜗牛

人工智能 DeepSeek

Acunetix v25.1 发布,新增功能概览

sysin

Acunetix

《一文讲透》第4期:KWDB 数据库运维(7)—— 集群规划

KaiwuDB

数据库 集群规划

LibreOffice 25.2 (Linux, macOS, Windows) - 自由免费的全能办公套件

sysin

【YashanDB知识库】数据库升级后用yasboot在线扩充备节点出现报错

YashanDB

数据库 yashandb

怎样在1秒内启动Linux_Linux_金灵杰_InfoQ精选文章