咱们持续上篇没有讲完的嵌入式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,以发动要害应用程序,然后切换到终究的根文件体系。
initramfs机制:将根文件体系集成到内核映像中,因而它与内核一同被加载到内存中:
它将文件体系的紧缩存档集成到内核映像中
变种:紧缩的initramfs固件也能够由bootloader独自加载。
initramfs在下面两种情况下十分有用:
快速发动且十分小的根文件体系。因为文件体系在发动时已彻底加载,因而应用程序发动也十分快。
作为切换到实践根文件体系之前的中心进程,该文件坐落需求其驱动程序不归于内核映像的设备(存储驱动程序,文件体系驱动程序,网络驱动程序)上。一直在桌面/服务器发行版的内核上运用此选项,以坚持内核映像巨细合理。
2.2 内存中的initramfs
运用CONFIG_INITRAMFS_SOURCE选项在内核装备等级界说initramfs的内容
能够是包括根文件体系内容的目录的途径
能够是cpio归档文件的途径
能够是描绘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发动时刻优化的隐秘之一东西链/应用程序优化