最牛技术 1秒启动Linux的窍门

1秒启动Linux可以实现吗?我们知道Linux系统开机并不算快,最少也需要11秒,但是,现在有一个技巧,可以1秒打开linux系统,到底是什么技术这么牛?请看下文详细介绍

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

背景知识

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

• 硬件重置

• 启动引导程序(bootloader)

• 操作系统初始化

• 应用程序执行

其中硬件非常关键,但是硬件一般难以更改。后续的优化,主要针对引导程序、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进程直接指定为应用程序。

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

• LD_PRELOAD环境变量指定的路径(一般对应文件/etc/ld.so.preload);

• ELF .dynamic节中DT_RPATH入口指定的路径,若DT_RUNPATH入口不存在的话;

• 环境变量LD_LIBRARY_PATH指定的路径,但如果可执行文件有setuid/setgid权限,则忽略这个路径;编译时指定–library-path会覆盖这个路径;

• ELF .dynamic节中DT_RUNPATH入口指定的路径;

• ldconfig缓存中的路径(一般对应/etc/ld.so.cache文件),若编译时使用了-z nodeflib的链接选项,则此步跳过;

• /lib,然后/usr/lib路径,若使用了-z nodeflib链接选项,则此步亦跳过;

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

总结

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

相关推荐:

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

Linux修改fstab文件后 系统无法启动的解决方法

时间: 2025-01-11 22:34:39

最牛技术 1秒启动Linux的窍门的相关文章

学习Linux(必看经典)牛人40天精通Linux运维的学习方法

学习Linux(必看经典)牛人40天精通Linux运维的学习方法 简介:linux运维人才是企业目前急需的技术人才之一,从从事linux运维的工作,本系列整理的视频课程是你不可或缺的要学习的内容,学习时,建议做好笔记,画好图,勤加练习,多和同学交流讨论,则可成大器.  Linux职业路线图 企业Linux高薪运维实战必会精品学习路线图 http://edu.51cto.com/roadmap/view/id-62.html 简介:如果你,认真学习完,并掌握了本课程,即可掌握企业的实战运维的基本应

从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查一下,就是

uboot学习之五-----uboot如何启动Linux内核

uboot和内核到底是什么?uboot实质就是一个复杂的裸机程序:uboot可以被配置也可以做移植: 操作系统内核本身就是一个裸机程序,和我们学的uboot和其他裸机程序没有本质的区别:区别就是我们操作系统运行起来后可以分为应用层和内核层,分层后,两层的权限不同,内存访问和设备操作的管理上更加精细(内核可以随便方位各种硬件,而应用程序只能被限制的访问硬件和内存地址) 直观来看:uboot的镜像是u-boot.bin,Linux系统的镜像是zImage,这两个东西其实都是两个裸机程序镜像.从系统启

[开机启动]Linux开机自启和运行级别

嵌入式系统中程序自启动方法 在很多嵌入式系统中,由于可用资源较少,常常在系统启动后就直接让应用程序自动启动,以减少用户操作和节省资源.如何让自己的应用程序自动启动呢?    在Linux系统中,配置应用程序自动启动的方法有以下三种:1.通过/Linuxrc脚本直接启动Linux内核一旦开始执行,它将通过驱动程序来初始化所有硬件设备,这个初始化过程可以在启动时的PC显示器上看到,每个驱动程序都打印一些相关信息.初始化完成后,通常调用的是init,通过loader调用init内的init=/app_

如何启动linux的telnet服务--转载

如何启动linux的telnet服务 如何启动linux的telnet服务 步骤如下: 1.如果安装了telnet.telnet-server的rpm包,就跳到2.,否则安装这个包. 2.修改telnet服务配置文件 vi /etc/xinetd.d/telnet service telnet { disable = yes flags = REUSE socket_type = stream wait = no user = root server = /usr/sbin/in.telnetd

启动linux下的VNC

vnc简介:VNC (Virtual Network Computer)是虚拟网络计算机的缩写.VNC 是一款优秀的远程控制工具软件,由著名的 AT&T 的欧洲研究实验室开发的.VNC 是在基于 UNIX 和 Linux 操作系统的免费的开源软件,远程控制能力强大,高效实用,其性能可以和Windows 和 MAC 中的任何远程控制软件媲美. 在 Linux 中,VNC 包括以下四个命令:vncserver,vncviewer,vncpasswd,和 vncconnect.大多数情况下用户只需要其

通过NFS(nfsroot)启动linux系统

Mounting the root filesystem via NFS (nfsroot) 英文原文位于inux内核源代码中的"Documentation/filesystems/nfs/nfsroot.txt". 1996年由Gero Kuhlmann <[email protected]>初次编写, 1997年经Martin Mares <[email protected]>, 2006年经Nico Schottelius <[email prote

在Win7环境下安装启动Linux

在Win7系统下,安装启动Linux特别的不方便,因为XP下的boot.ini配置文件不在了,要添加一下启动选项的话, 只能使用专门的工具,这或多或少给人带来不爽的感觉,,, 其实Win7下虽然没有了boot.ini文件,但是在C盘目录下的boot.ini文件,同样还是可以添加系统的启动选项的,这让我们又可以脱离专门的配置工具,手动的设置grub4dos,然后启动安装linux,ubuntu了. 首先去网上下载grub4dos这个软件包,然后把"grldr","grldr.m

IT技术学习指导之Linux系统入门的4个阶段(纯干货带图)

IT技术学习指导之Linux系统入门的4个阶段(纯干货带图) 全世界60%的人都在使用Linux.几乎没有人没有受到Linux系统的"恩惠",我们享受的大量服务(包括网页服务.聊天服务等)背后几乎都是由Linux系统支撑的服务器,超过20亿人每天都随身携带基于Linux内核开发的 Android手机出门,Linux也广泛应用在嵌入式系统上.因此学习Linux系统变得尤为重要,对于普通用户而言,平面式的学习Linux系统的基本使用已经足够,但对于开发者或者运维人员而言,深入学习Linux