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

摘要:
此时如何加快Linux的启动,将成为一个挑战,对于大多数应用开发人员而言,由于Linux系统的复杂性,对于如何提高启动速度,往往无从下手。那么读完优化嵌入式Linux的启动时间系列文章,将获得清晰完整的解决思路。本文将从优化文件系统的角度探讨如何缩短启动时间。由Linux3.7中引入的UBIFastmap解决。

导读:嵌入式Linux在应用中往往希望系统能在尽量短的时间内启动,以提高用户体验。而且在有的应用场合,对启动时间具有严格的时间要求,尤其在工业或者医疗器械应用领域。此时如何加快Linux的启动,将成为一个挑战,对于大多数应用开发人员而言,由于Linux系统的复杂性,对于如何提高启动速度,往往无从下手。那么读完优化嵌入式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)上测得
    1.UBI空间:216 MB
    2.根文件系统:已使用80 MB(Yocto)
    3.平均加载时间:
    a.无UBI Fastmap,加载时间:968ms
    b.有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,以启动关键应用程序,然后切换到最终的根文件系统。在这里插入图片描述
initramfs机制:将根文件系统集成到内核映像中,因此它与内核一起被加载到内存中:

  • 它将文件系统的压缩存档集成到内核映像中
  • 变种:压缩的initramfs固件也可以由bootloader单独加载。

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

  • 快速启动且非常小的根文件系统。由于文件系统在启动时已完全加载,因此应用程序启动也非常快。
  • 作为切换到实际根文件系统之前的中间步骤,该文件位于需要其驱动程序不属于内核映像的设备(存储驱动程序,文件系统驱动程序,网络驱动程序)上。始终在桌面/服务器发行版的内核上使用此选项,以保持内核映像大小合理。

2.2 内存中的initramfs
在这里插入图片描述

  • 使用CONFIG_INITRAMFS_SOURCE选项在内核配置级别定义initramfs的内容
    1.可以是包含根文件系统内容的目录的路径
    2.可以是cpio归档文件的路径
    3.可以是描述initramfs内容的文本文件

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

  • 详细信息(在内核源文件中):
    Documentation/filesystems/ramfs-rootfs-initramfs.txt
    Documentation/early-userspace/README

2.3 用initramfs启动过程
在这里插入图片描述
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毫秒的启动时间。

后续会发布:

  • 优化嵌入式Linux的启动时间之内核
  • 优化嵌入式Linux的启动时间之bootloader
    敬请关注!

码字不易若您觉得文章不错,不妨转发分享,点点在看,亦或者小小打赏,都将激励我们持续更新。
关注公众号扫左下二维码,关注公众号内容更丰富
回复“领取资源”可领取liunx、安卓视频教程、人工智能视频等学习资料。

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200303220245653.png?在这里插入图片描述
在这里插入图片描述

免责声明:文章转载自《优化嵌入式Linux的启动时间之文件系统》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇转:zTree树控件扩展篇:巧用zTree控件实现文本框输入关键词自动模糊查找zTree树节点实现模糊匹配下拉选择效果【转】foxmail邮箱我已进清理了为什么还是说我的邮箱已满下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

curl在windows下和linux中使用的一个区别

最近在windows环境下的cmd中,使用curl测试post接口,总是报Failed to decode JSON object的错误。 同样的命令在windows环境的git bash窗口中执行是好的。git bash可以模拟linux环境下一些命令的输入效果。 windows环境中,curl命令中的双引号需要使用""来进行转义。 例如,curl -v...

Linux下Redis的安装和部署

一、Redis介绍 Redis是当前比较热门的NOSQL系统之一,它是一个key-value存储系统。和Memcache类似,但很大程度补偿了Memcache的不足,它支持存储的value类型相对更多,包括string、list、set、zset和hash。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作。在此基础上...

Linux服务器---流量监控MRTG

MRTG        MRTG可以分析网络流量,但是它必须依赖SNMP协议。将收集到的数据生成HTML文件,以图片的形式展示出来 1、安装一些依赖软件 [root@localhost bandwidthd-2.0.1]# yum install -y net-snmp 2、配置snmp,编辑配置文件“/etc/snmp/snmpd.conf” [roo...

Linux下测试CPU性能

一、安装stress服务 1、下载stress_1.0.1.orig.tar.gz安装包 2、解压tar xvf stress_1.0.1.orig.tar.gz 3、进入解压目录执行./configure 4、make 5、makecheck 6、make install 7、make clean 二、安装sysstat服务 1、下载sysstat-11...

Linux 环境使用 lsof 命令查询端口占用

最近发现一个 Linux 环境中比较有用的查看系统网络连接的命令 lsof ,这里记录下 lsof 命令的网络连接查询功能(其主要原理是通过查询与网络连接相关的文件信息来获取连接信息)。本文主要内容来自 lsof 命令的 manpage。 lsof 命令 lsof 命令的 -i 参数用于指定进行查询的网络连接的参数,其形式如下所示。 lsof -i...

【Linux】2 安装 Linux 操作系统(超级详细版)

CentOS 系统官网下载:http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1810.iso 点击创建新的虚拟机,选择 自定义(高级),然后点击下一步; 默认设置就好,点击"下一步"; 选择 "稍后安装操作系统",点击"下一步"; 选择"Linux", 版本选...