你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

嵌入式Linux启动时间优化方法——文件系统

[复制链接]
gaosmile 发布时间:2020-4-4 19:59

我们继续上篇没有讲完的嵌入式Linux启动时间优化方法,本文主要会讲文件系统。想看上一篇的请查看本文结尾的链接。


          1. 文件系统


          不同的存储介质会采用不同的文件系统:


          1)块存储介质 (包括存储卡, eMMC):


          ext2, ext3,ext4


          xfs, jfs,reiserfs


          btrfs


          f2fs


          SquashFS


          2)Raw 闪存:


          JFFS2


          YAFFS2


          UBIFS


          ubiblock +SquashFS


          对于块文件系统,特性各异:


          ext4:最适合较大的分区,良好的读写性能。


          xfs,jfs,reiserfs:在某些读或写场景中也可能很好。


          btrfs,f2fs:利用闪存块设备的特性,可以实现最佳的读写性能。


          SquashFS:对于只读分区,最佳挂载时间和读取性能。非常适合需要只读的根文件系统。


          下面分别介绍各文件系统的详细特性。


          1.1. JFFS2


          用于RAW Flash:


          挂载时间取决于文件系统的大小:内核必须在挂载时扫描整个文件系统,以读取属于每个文件的块。


          需要使用CONFIG_JFFS2_SUMMARY内核选项将此类信息存储在Flash中。这大大减少了安装时间。


          ARM基准:对于128 MB分区,从16 s到0.8 s。


          与YAFFS2和UBIFS相比,读写性能相当差。


          1.3 YAFFS2


          用于RAW Flash:


          良好的安装时间


          良好的读写性能


          缺点:不压缩,不在主线Linux内核中


          1.4. UBIFS


          用于RAW Flash:


          优势:


          良好的读写性能(类似于YAFFS2)


          其他优点:更好的磨损均衡(不仅可以在单个分区内,而且可以在整个UBI空间中使用)。


          缺点:


          不适用于小型分区(元数据开销过多)。请改用JFFS2或JAFFS2。


          挂载时间不是很好,因为初始化UBI需要时间(UBI Attach:在引导时或在用户空间中运行ubi_attach)。


          由Linux 3.7中引入的UBI Fastmap解决。


          1.5. UBI Fastmap如何工作


          UBI 加载:需要通过扫描所有擦除块来读取UBI元数据。时间与存储空间成正比。


          UBI Fastmap将此类信息存储在几个闪存块中(通常在系统关闭期间在UBI分离时),并在引导时找到该信息。


          这样可使UBI附加时间恒定。


          如果Fastmap信息无效(例如,不正常的系统关闭),它将退回到扫描状态(速度较慢,但能保证正确,Fastmap在下次启动时将恢复)。


          详细信息:Thomas Gleixner的ELCE 2012演讲:


          http://elinux.org/images/a/ab/UBI_Fastmap.pdf


          使用步骤:


          使用CONFIG_UBI_FASTMAP配置编译内核


          使用ubi.fm_autoconvert = 1内核参数至少引导一次系统。


          以干净的方式重启系统


          保证如上启动一次后可以删除ubi.fm_autoconvert = 1


          UBI Fastmap性能测试举例:


          在Linux 3.10的Microchip SAMA5D3 Xplained板(ARM)上测得


          UBI空间:216 MB


          根文件系统:已使用80 MB(Yocto)


          平均加载时间:


          无UBI Fastmap,加载时间:968ms


          有UBI Fastmap,加载时间:238 ms


          可见UBI Fastmap 改善非常显著!


          1.6. ubiblock + SquashFS


          对RAW Flash :


          ubiblock:位于UBI顶部的只读块设备


          利用CONFIG_MTD_UBI_BLOCK配置编译。


          允许将SquashFS放在UBI卷上。


          引导时间和读取性能不错。非常适合于只读根文件系统。


          2. 选取合适的文件系统


          RAW Flash :带有CONFIG_UBI_FASTMAP的UBIFS可能是最佳解决方案。


          块存储:SquashFS是根文件系统的最佳解决方案,它可以是只读的。Btrfs和f2fs可能是读/写文件系统的最佳解决方案。


          更改文件系统类型非常容易,并且对应用程序完全透明。只需尝试几个文件系统选项,看看哪个最适合!


          不要只关注启动时间。


          对于读写性能至关重要的系统,我们建议使用单独的根文件系统(以加快启动时间)和数据分区(以实现良好的运行时性能)。


          2.1 Initramfs


          一个很好的方案是使用非常小的initramfs,以启动关键应用程序,然后切换到最终的根文件系统。


        o4YBAF6HB5SAVmZLAABTE1cZY1I036.png
         


          initramfs机制:将根文件系统集成到内核映像中,因此它与内核一起被加载到内存中:


          它将文件系统的压缩存档集成到内核映像中


          变种:压缩的initramfs固件也可以由bootloader单独加载。


          initramfs在下面两种情况下非常有用:


          快速启动且非常小的根文件系统。由于文件系统在启动时已完全加载,因此应用程序启动也非常快。


          作为切换到实际根文件系统之前的中间步骤,该文件位于需要其驱动程序不属于内核映像的设备(存储驱动程序,文件系统驱动程序,网络驱动程序)上。始终在桌面/服务器发行版的内核上使用此选项,以保持内核映像大小合理。
       
           2.2 内存中的initramfs


        pIYBAF6HCDOAKhrPAAB4mxXyXhM679.png
         


          使用CONFIG_INITRAMFS_SOURCE选项在内核配置级别定义initramfs的内容


          可以是包含根文件系统内容的目录的路径


          可以是cpio归档文件的路径


          可以是描述initramfs内容的文本文件


          内核构建过程将自动获取CONFIG_INITRAMFS_SOURCE选项配置的内容,并将根文件系统集成到内核映像中


          详细信息(在内核源文件中):


          Documentation/filesystems/ramfs-rootfs-initramfs.txt


          DocumentaTIon/early-userspace/README


          2.3 用initramfs启动过程


        o4YBAF6HCNCAGFmwAAFM1GXaejI829.png
         


          2.4 initramfs 降低启动时间


          创建尽可能小的最小初始化文件,足以启动关键应用程序,然后使用switch_root切换到最终根文件系统:


          使用轻量级的C库以减小固件大小,建议使用uClibc。


          将BusyBox裁剪到最小。甚至可以不用BusyBox直接在C中实现/init。


          使用静态链接的应用程序(较少的CPU开销,较少的库加载,较小的initramfs(如果根本没有库))。Buildroot中用BR2_STATIC_LIBS配置。


          2.5 静态链接可执行文件


          静态链接的可执行文件对于减小大小(特别是在小型initramfs中)非常有用,并且启动工作量较少。


          如果您将initramfs放在压缩的内核映像中,请不要对其进行压缩(启用CONFIG_INITRAMFS_COMPRESSION_NONE)。


          否则默认情况下,您的initramfs数据将被压缩两次,内核将更大,并且将花费更多的时间来加载和解压缩。


          在Linux 5.1上的示例在Beagle Bone Black上具有1.60 MB的initramfs(tar存档大小):这可以将内核大小从4.94 MB减少到4.74 MB(-200 KB),并节省大约170毫秒的启动时间。

收藏 评论0 发布时间:2020-4-4 19:59

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版