首页>>科技 >>内容

嵌入式linux启动过程详解,嵌入式Linux启动时间优化的秘密之二文件系统

发布时间:2023-09-09 18:18:41编辑:温柔的背包来源:

很多朋友对嵌入式linux启动过程详解,嵌入式Linux启动时间优化的秘密之二文件系统不是很了解,每日小编刚好整理了这方面的知识,今天就来带大家一探究竟。

嵌入式linux启动过程详解,嵌入式Linux启动时间优化的秘密之二文件系统

我们继续上一篇文章没有讲完的嵌入式Linux启动时间的优化方法。本文将主要讨论文件系统。上一篇文章,请查看本文末尾的链接。1.文件系统不同的存储介质会采用不同的文件系统:1)块存储介质(包括内存卡,EMMC): EXT2,ext3,ext4xfs,jfs,reiserfsbtrfsf2fsSquashFS2)原始闪存:jffs 2 yaffs 2 Ubifsubblock SquashFS对于块文件系统来说,特点是不同的:ext4:最适合大分区,读写性好。

Xfs、jfs、reiserfs:在一些阅读或写作场景中可能也不错。Btrfs,f2fs:利用闪存块设备的特性,可以达到最佳的读写性能。SquashFS:对于只读分区,最佳的挂载时间和读取性能。非常适合需要只读的根文件系统。每个文件系统的详细特性如下所述。1.1.JFFS2用于原始闪存:挂载时间取决于文件系统的大小:内核在挂载时必须扫描整个文件系统,以读取属于每个文件的块。

您需要使用CONFIG_JFFS2_SUMMARY内核选项将这些信息存储在Flash中。这大大减少了安装时间。ARM基准:对于128 MB分区,从16 s到0.8 s,相比YAFFS2和UBIFS,读写性能相当差。1.3 YAFFS2 for RAW Flash:安装时间好,读写性能好缺点:不压缩,不在主线Linux内核1.4中。RAW Flash的UBIFS:优点:读写性能好(类似YAFFS2)。

其他优点:更好的磨损平衡(不仅在单个分区,在整个UBI空间也是如此)。缺点:不适合小分区(元数据开销太大)。请改用JFFS2或JAFFS2。挂载时间不是很好,因为初始化UBI (UBI Attach:在引导时或者在用户空间运行ubi_attach)需要时间。由Linux 3.7引入的UBI Fastmap解决。1.5.ubi快速地图是如何工作的?

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=1UBI Fastmap。性能测试示例:在Linux 3.10的Microchip sama 5d 3 Xplained board(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来启动关键应用程序,然后切换到最终的根文件系统。Initramfs机制:根文件系统集成在内核镜像中,所以和内核一起加载到内存中;它将文件系统的压缩档案集成到内核映像中;压缩的initramfs固件也可以由引导加载程序单独加载。Initramfs在两种情况下非常有用:

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

使用CONFIG_INITRAMFS_SOURCE选项在内核配置级别定义INITRAMFS的内容。包含根文件系统内容的目录的路径可以是cpio档案文件的路径。它可以是描述initramfs内容的文本文件。内核构建过程会自动获取CONFIG_INITRAMFS_SOURCE选项配置的内容。并将根文件系统集成到内核镜像细节中(在内核源文件中):documentation/file systems/ram fs-root fs-initramfs . txt documentation/early-user space/readme。

2.3使用initramfs启动进程2.4使用init ramfs减少启动时间,创建尽可能小的最小初始化文件,足够启动关键应用,然后使用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启动时间优化的秘密之一工具链/应用程序优化

以上知识分享希望能够帮助到大家!