我們繼續(xù)上篇沒有講完的嵌入式Linux啟動時間優(yōu)化方法,本文主要會講文件系統(tǒng)。想看上一篇的請查看本文結(jié)尾的鏈接。
1. 文件系統(tǒng)
不同的存儲介質(zhì)會采用不同的文件系統(tǒng):
1)塊存儲介質(zhì) (包括存儲卡, eMMC):
ext2, ext3,ext4
xfs, jfs,reiserfs
btrfs
f2fs
SquashFS
2)Raw 閃存:
JFFS2
YAFFS2
UBIFS
ubiblock +SquashFS
對于塊文件系統(tǒng),特性各異:
ext4:最適合較大的分區(qū),良好的讀寫性能。
xfs,jfs,reiserfs:在某些讀或?qū)憟鼍爸幸部赡芎芎谩?/p>
btrfs,f2fs:利用閃存塊設(shè)備的特性,可以實現(xiàn)最佳的讀寫性能。
SquashFS:對于只讀分區(qū),最佳掛載時間和讀取性能。非常適合需要只讀的根文件系統(tǒng)。
下面分別介紹各文件系統(tǒng)的詳細(xì)特性。
1.1. JFFS2
用于RAW Flash:
掛載時間取決于文件系統(tǒng)的大小:內(nèi)核必須在掛載時掃描整個文件系統(tǒng),以讀取屬于每個文件的塊。
需要使用CONFIG_JFFS2_SUMMARY內(nèi)核選項將此類信息存儲在Flash中。這大大減少了安裝時間。
ARM基準(zhǔn):對于128 MB分區(qū),從16 s到0.8 s。
與YAFFS2和UBIFS相比,讀寫性能相當(dāng)差。
1.3 YAFFS2
用于RAW Flash:
良好的安裝時間
良好的讀寫性能
缺點:不壓縮,不在主線Linux內(nèi)核中
1.4. UBIFS
用于RAW Flash:
優(yōu)勢:
良好的讀寫性能(類似于YAFFS2)
其他優(yōu)點:更好的磨損均衡(不僅可以在單個分區(qū)內(nèi),而且可以在整個UBI空間中使用)。
缺點:
不適用于小型分區(qū)(元數(shù)據(jù)開銷過多)。請改用JFFS2或JAFFS2。
掛載時間不是很好,因為初始化UBI需要時間(UBI Attach:在引導(dǎo)時或在用戶空間中運行ubi_attach)。
由Linux 3.7中引入的UBI Fastmap解決。
1.5. UBI Fastmap如何工作
UBI 加載:需要通過掃描所有擦除塊來讀取UBI元數(shù)據(jù)。時間與存儲空間成正比。
UBI Fastmap將此類信息存儲在幾個閃存塊中(通常在系統(tǒng)關(guān)閉期間在UBI分離時),并在引導(dǎo)時找到該信息。
這樣可使UBI附加時間恒定。
如果Fastmap信息無效(例如,不正常的系統(tǒng)關(guān)閉),它將退回到掃描狀態(tài)(速度較慢,但能保證正確,F(xiàn)astmap在下次啟動時將恢復(fù))。
詳細(xì)信息:Thomas Gleixner的ELCE 2012演講:
http://elinux.org/images/a/ab/UBI_Fastmap.pdf
使用步驟:
使用CONFIG_UBI_FASTMAP配置編譯內(nèi)核
使用ubi.fm_autoconvert = 1內(nèi)核參數(shù)至少引導(dǎo)一次系統(tǒng)。
以干凈的方式重啟系統(tǒng)
保證如上啟動一次后可以刪除ubi.fm_autoconvert = 1
UBI Fastmap性能測試舉例:
在Linux 3.10的Microchip SAMA5D3 Xplained板(ARM)上測得
UBI空間:216 MB
根文件系統(tǒng):已使用80 MB(Yocto)
平均加載時間:
無UBI Fastmap,加載時間:968ms
有UBI Fastmap,加載時間:238 ms
可見UBI Fastmap 改善非常顯著!
1.6. ubiblock + SquashFS
對RAW Flash :
ubiblock:位于UBI頂部的只讀塊設(shè)備
利用CONFIG_MTD_UBI_BLOCK配置編譯。
允許將SquashFS放在UBI卷上。
引導(dǎo)時間和讀取性能不錯。非常適合于只讀根文件系統(tǒng)。
2. 選取合適的文件系統(tǒng)
RAW Flash :帶有CONFIG_UBI_FASTMAP的UBIFS可能是最佳解決方案。
塊存儲:SquashFS是根文件系統(tǒng)的最佳解決方案,它可以是只讀的。Btrfs和f2fs可能是讀/寫文件系統(tǒng)的最佳解決方案。
更改文件系統(tǒng)類型非常容易,并且對應(yīng)用程序完全透明。只需嘗試幾個文件系統(tǒng)選項,看看哪個最適合!
不要只關(guān)注啟動時間。
對于讀寫性能至關(guān)重要的系統(tǒng),我們建議使用單獨的根文件系統(tǒng)(以加快啟動時間)和數(shù)據(jù)分區(qū)(以實現(xiàn)良好的運行時性能)。
2.1 Initramfs
一個很好的方案是使用非常小的initramfs,以啟動關(guān)鍵應(yīng)用程序,然后切換到最終的根文件系統(tǒng)。
?
initramfs機(jī)制:將根文件系統(tǒng)集成到內(nèi)核映像中,因此它與內(nèi)核一起被加載到內(nèi)存中:
它將文件系統(tǒng)的壓縮存檔集成到內(nèi)核映像中
變種:壓縮的initramfs固件也可以由bootloader單獨加載。
initramfs在下面兩種情況下非常有用:
快速啟動且非常小的根文件系統(tǒng)。由于文件系統(tǒng)在啟動時已完全加載,因此應(yīng)用程序啟動也非常快。
作為切換到實際根文件系統(tǒng)之前的中間步驟,該文件位于需要其驅(qū)動程序不屬于內(nèi)核映像的設(shè)備(存儲驅(qū)動程序,文件系統(tǒng)驅(qū)動程序,網(wǎng)絡(luò)驅(qū)動程序)上。始終在桌面/服務(wù)器發(fā)行版的內(nèi)核上使用此選項,以保持內(nèi)核映像大小合理。
? 2.2 內(nèi)存中的initramfs
?
使用CONFIG_INITRAMFS_SOURCE選項在內(nèi)核配置級別定義initramfs的內(nèi)容
可以是包含根文件系統(tǒng)內(nèi)容的目錄的路徑
可以是cpio歸檔文件的路徑
可以是描述initramfs內(nèi)容的文本文件
內(nèi)核構(gòu)建過程將自動獲取CONFIG_INITRAMFS_SOURCE選項配置的內(nèi)容,并將根文件系統(tǒng)集成到內(nèi)核映像中
詳細(xì)信息(在內(nèi)核源文件中):
Documentation/filesystems/ramfs-rootfs-initramfs.txt
Documentation/early-userspace/README
2.3 用initramfs啟動過程
?
2.4 initramfs 降低啟動時間
創(chuàng)建盡可能小的最小初始化文件,足以啟動關(guān)鍵應(yīng)用程序,然后使用switch_root切換到最終根文件系統(tǒng):
使用輕量級的C庫以減小固件大小,建議使用uClibc。
將BusyBox裁剪到最小。甚至可以不用BusyBox直接在C中實現(xiàn)/init。
使用靜態(tài)鏈接的應(yīng)用程序(較少的CPU開銷,較少的庫加載,較小的initramfs(如果根本沒有庫))。Buildroot中用BR2_STATIC_LIBS配置。
2.5 靜態(tài)鏈接可執(zhí)行文件
靜態(tài)鏈接的可執(zhí)行文件對于減小大小(特別是在小型initramfs中)非常有用,并且啟動工作量較少。
如果您將initramfs放在壓縮的內(nèi)核映像中,請不要對其進(jìn)行壓縮(啟用CONFIG_INITRAMFS_COMPRESSION_NONE)。
否則默認(rèn)情況下,您的initramfs數(shù)據(jù)將被壓縮兩次,內(nèi)核將更大,并且將花費更多的時間來加載和解壓縮。
在Linux 5.1上的示例在Beagle Bone Black上具有1.60 MB的initramfs(tar存檔大小):這可以將內(nèi)核大小從4.94 MB減少到4.74 MB(-200 KB),并節(jié)省大約170毫秒的啟動時間。
? ? ? 編輯連載推薦:嵌入式Linux啟動時間優(yōu)化的秘密之一工具鏈/應(yīng)用程序優(yōu)化
評論
查看更多