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