优化嵌入式Linux的启动时间之启动脚本

优化嵌入式Linux的启动时间之启动脚本

注:本文转载自微信公众号嵌入式客栈——优化嵌入式Linux的启动时间之启动脚本

原创 逸珺 嵌入式客栈 2020-03-04

导读:嵌入式Linux在应用中往往希望系统能在尽量短的时间内启动,以提高用户体验。而且在有的应用场合,对启动时间具有严格的时间要求,尤其在工业或者医疗器械应用领域。此时如何加快Linux的启动,将成为一个挑战,对于大多数应用开发人员而言,由于Linux系统的复杂性,对于如何提高启动速度,往往无从下手。那么读完优化嵌入式Linux的启动时间系列文章,将获得清晰完整的解决思路。本文将从启动脚本的角度探讨如何优化进而缩短启动时间。

图片

 

1.优化初始化脚本和系统启动

有多种方法可以减少启动应用程序之前执行启动脚本中花费的时间:

  • 仅在启动必要的依赖项之后,尽快启动应用程序。

  • 简化shell脚本

  • 可以尝试执行启动脚本之前启动应用程序

1.1.bootchart

如果想更详细地了解用户区的引导顺序,则可以使用使用grabserial中的bootchart来实现,例如:

图片

那么如何配置并使用bootchart 呢?

  • 在busybox中配置使用bootchartd(CONFIG_BOOTCHARTD = y)

  • 通过命令行init = / sbin / bootchartd 引导您的开发板

  • 将/var/log/bootlog.tgz从目标复制到开发主机

  • 生成时间表:

    cd bootchart-<version>

    java -jar bootchart.jar bootlog.tgz

    bootchart 参见 http://www.bootchart.org

 

1.2. systemd

如果将systemd用作初始化程序,则可以使用systemd-analyze。 

http://www.freedesktop.org/software/systemd/man/systemd-analyze.html

图片

1.3. init 进程

在所有依赖项启动之后,应尽快启动:

  • 取决于您的init进程。在这里,我们假设使用sysV init脚本。

  • init脚本按字母数字顺序运行,并以字母开头(K表示停止(杀死),S表示开始)。

  • 将应用程序启动脚本使用最小的号码。

  • 甚至可以用应用程序替换init!如果可以成为第一个启动的应用程序,启动速度无疑大大加快!

  • 直接通过一个启动脚本启动所有服务(例如/etc/init.d/rcS)。这消除了对/ bin / sh的多次调用。

  • 甚至可以直接在应用程序的C代码中挂载文件系统:如

图片

 

1.4 减少fork的使用

  • fork/exec系统调用开销很大。故从Shell调用可执行文件的速度很慢。

  • 即使BusyBox实现的shell中echo也会导致fork 系统调用!

  • 在BusyBox配置中选择Shells-> Standalone shell,以使Shell尽可能调用小程序。

  • 管道和反引号也由fork/exec实现。应减少它们在脚本中的使用。例:

    cat /proc/cpuinfo | grep model

    应修改为:

    grep model /proc/cpuinfo

    更详细,请参考:

    http://elinux.org/Optimize_RC_Scripts

     

    又例如:

    图片

    应做如下修改更佳:

    图片

    仅此一项优化就可以在ARM AT91SAM9263系统(200MHz)上节省87毫秒!

1.5 减小固件的尺寸

  • 剥离可执行文件和库,删除仅用于开发和调试的ELF部分。strip命令由交叉编译工具链提供。默认情况下在Buildroot中完成的。

  • superstrip超级剥离

    http://muppetlabs.com/~breadbox/software/elfkickers.html。

    使用strip可以剥离出Linux未用于启动可执行文件的更多位。Buildroot停止支持它,因为它可能破坏可执行文件。 仅在保存一些字节至关重要时才尝试。

  • 还可以尝试https://packages.debian.org/sid/mklibs上提供的mklibs:

     

     mklibs产生精简的共享库,其中仅包含一组特定的可执行文件所需的例程。对于像OpenGL和QT这样的大型库确实很有用。它甚至可以在没有源代码的情况下工作。

    在Yocto中可用,但在Buildroot中不可用(2019.02状态)。

     限制:mklibs可以删除倾斜的库(由应用程序“手动”加载),因为它看不到它们

 

3.5.5 快速启动画面显示

  • 可以使用fbv显示启动画面,

    http://freshmeat.sourceforge.net/projects/fbv

  • 使用armel,可以只使用我们的静态编译二进制文件:

    https://github.com/bootlin/static-binaries/tree/master/fbv/

  • 但是在MicrochipAT91SAM9263系统上很慢为878毫秒!

  • 为了更快地执行此操作,可以转储帧缓冲区framebuffer中的内容:

    fbv -d 1/root/logo.bmp

    cp /dev/fb0/root/logo.fb

    lzop -9/root/logo.fb

  •  然后尽早在initramfs中将其复制回:

    lzopcat/root/logo.fb.lzo > /dev/fb0

后续会发布:

  • 优化嵌入式Linux的启动时间之文件系统

  • 优化嵌入式Linux的启动时间之内核

  • 优化嵌入式Linux的启动时间之bootloader

敬请关注!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值