怎样在 1 秒内启动 Linux

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

背景知识

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

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

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

引导程序优化

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

对于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会议上的演讲稿)。从硬件到引导程序再到内核最后到应用程序,每个启动步骤都有自己可优化的地方,经过一些简单的优化,就可以减少系统的启动时间。

文章转载自 开源中国社区[https://www.oschina.net]

时间: 2024-10-22 12:11:32

怎样在 1 秒内启动 Linux的相关文章

1 秒内启动Linux的方法_linux shell

 尽可能快的启动系统,对于自动化设备是非常重要的.系统能够在用户无法感知的时间内启动,也就意味着在不需要工作时,可以完全切断电源,而不是挂起 进入休眠状态.本文基于Atmel AT91系列片上系统和NAND闪存,经过一系列的优化,将Linux系统启动时间,从最初的11秒,降低到最终的656毫秒. 背景知识 系统从上电到完全启动,需要经过许多过程.一个简化的启动流程大概包含: 硬件重置 启动引导程序(bootloader) 操作系统初始化 应用程序执行 其中硬件非常关键,但是硬件一般难以更改.后续

借助 Java 9 Jigsaw,如何在 60 秒内创建 JavaFX HelloWorld 程序?

[编者按]本文作者为 Carl Dea,主要介绍利用 Jigsaw 项目在大约一分钟内编写标准化的"Hello World"消息代码.本文系国内 ITOM 管理平台 OneAPM 编译呈现. 你可能已经听说了 Jave 9 的新模块系统,也就是 Jigsaw 项目.如果你还不了解 Java 9 的新模块系统,请阅读 Mark Reinhold 的模块系统状态报告.另外还可以看看 @nipafx Nicolai Parlog 的优秀博客.Nicolai 在博客中详细介绍了 Java 9

如何在一分钟内对Linux服务器进行最佳性能诊断

当你为了解决一个性能问题登录到一台 Linux 服务器:在第一分钟,你应该检查些什么? 在 Netflix,我们有一个巨大的 EC2 Linux 云,以及大量的性能分析工具来监控和诊断其性能,其中包括用于云监控的 Atlas,以及用于按需实例分析的 Vector.虽然这些工具可以帮助我们解决大多数问题,但我们有时仍需要登录到一个服务器实例,并运行一些标准 Linux 性能工具. 在这篇文章中,Netflix Performance Engineering 团队将会向你讲解在命令行中进行一次最佳的

从ramdisk根文件系统启动Linux成功,及使用initramfs启动linux

下面两篇文章是ARM9论坛上的讲解ramdisk文件系统的很不错的文章 今天做了个试验,让Linux2.6.29.4从ramdisk根文件系统启动成功,总结一下. 其中涉及的内容较多,很多东西不再详述,如需深入研究请查阅相关资料(百度或谷歌一下一大堆).开发环境:Fedora 9交叉编译工具链:arm-linux-gcc 4.3.2 with EABI嵌入式Linux内核版本:2.6.29.4-FriendlyARM.昨天写贴子的时候具体记不清了,今天起来启动开发板用uname -r查一下,就是

在vsphere client中部署ovf模板后启动linux 的network后报错

问题背景: 在vsphere client中部署ovf模板后启动linux 的network后提示:device eth0 does not seem to be present, delaying initialization 设备eth0没有准备就绪,延迟初始化,如图所示: 问题原因是导出的ovf模板中的MAC地址为源系统的MAC(配置文件为源系统(导出ovf模板的系统)的配置文件),用ovf部署后的系统MAC地址已经变化,所以导致初始化失败,解决方法如下: 1. vi /etc/sysco

python脚本内运行linux命令的方法

  本文实例讲述了python脚本内运行linux命令的方法.分享给大家供大家参考.具体实现方法如下: ? 1 2 3 4 5 6 7 8 9 #/usr/bin/env python import subprocess class RunCmd(object): def cmd_run(self, cmd): self.cmd = cmd subprocess.call(self.cmd, shell=True) #Sample usage a = RunCmd() a.cmd_run('ls

Jquery插件实现点击获取验证码后60秒内禁止重新获取

 这篇文章主要介绍了Jquery插件实现点击获取验证码后60秒内禁止重新获取,十分常用的功能,这里分享给大家,有需要的小伙伴参考下吧.     通过jquery.cookie.js插件可以快速实现"点击获取验证码后60秒内禁止重新获取(防刷新)"的功能 效果图: 先到官网(http://plugins.jquery.com/cookie/)下载cookie插件,放到相应文件夹,代码如下:   代码如下: <!DOCTYPE html> <html> <he

直接从硬盘启动Linux ISO镜像的图文教程

  Linux的GRUB2启动加载器可以直接从硬盘启动Linux ISO文件,可以启动Live CD的 ISO,而不用烧录到光盘来安装Linux到一个硬盘分区,或从USB驱动启动. 我们在Ubuntu 14.04上实施了该过程--Ubuntu及基于Ubuntu的Linux版本对此支持良好.其它Linux发行版上的工作原理也类似. 获取Linux ISO文件 这一密技需要你的硬盘驱动器上安装有Linux系统,你的计算机必须使用GRUB2启动加载器,这是大多数Linux系统的标准启动加载器.不好意思

限时传参-bat文件在5秒内传参,如果没传参数,则给默认值

问题描述 bat文件在5秒内传参,如果没传参数,则给默认值 我写个bat文件,要求在5秒内传入yes或者no如果过了时间,没有响应,则默认为no, 哪位大侠能帮帮忙 解决方案 大概是这样吧,可以再按照自己的条件修改 set /p abc=请在5秒内输入yes或者no: ping -n 5 127.0.0.0>nul if "%abc%"=="" set abc=no