嵌入式Linux啟動時間優化的秘密之二檔案系統

2022-07-24 10:09:06 字數 3902 閱讀 3538

0我們繼續上篇沒有講完的嵌入式linux

1. 檔案系統

介質會採用不同的檔案系統:

1)塊儲存介質 (包括儲存卡, emmc):

ext2, ext3,ext4

sbtrfs

f2fs

squashfs

2)raw 快閃儲存器:

jffs2

yaffs2

subiblock +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演講:

使用步驟:

使用config_ubi_fastmap配置編譯核心

使用ubi.fm_autoconvert = 1核心引數至少引導一次系統。

以乾淨的方式重啟系統

保證如上啟動一次後可以刪除ubi.fm_autoconvert = 1

ubi fastmap效能測試

舉例:在linux 3.10的microchip

sama5d3 xplai

ned板(arm)上測得

ubi空間:216 mb

根檔案系統:已使用80 mb(yocto)

可見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 initram

fs乙個很好的方案是使用非常小的initramfs,以啟動關鍵應用程式,然後切換到最終的根檔案系統。

initramfs機制:將根檔案系統整合到核心映像中,因此它與核心一起被載入到記憶體中:

它將檔案系統的壓縮存檔整合到核心映像中

變種:壓縮的initramfs韌體也可以由bootloader單獨載入。

initramfs在下面兩種情況下非常有用:

快速啟動且非常小的根檔案系統。由於檔案系統在啟動時已完全載入,因此應用程式啟動也非常快。

作為切換到實際根檔案系統之前的中間步驟,該檔案位於需要其驅動程式不屬於核心映像的裝置(儲存驅動程式,檔案系統驅動程式,網路驅動程式)上。始終在桌面/伺服器發行版的核心上使用此選項,以保持核心映像大小合理。

2.2 記憶體中的initramfs

使用config_initramfs_source選項在核心配置級別定義initramfs的內容

可以是包含根檔案系統內容的目錄的路徑

可以是cpi

o歸檔檔案的路徑

可以是描述initramfs內容的文字檔案

核心構建過程將自動獲取config_initramfs_source選項配置的內容,並將根檔案系統整合到核心映像中

詳細資訊(在核心原始檔中):

documentati

on/filesyste

ms/ramfs-rootfs-initramfs.txt

documentation/early-users

pace/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的啟動時間之核心

1.2 使用核心啟 進行有目的的優化 使用initcall debug可以生成啟 從而輕鬆檢視哪些核心初始化函式需要最多時間來執行。1.3 減小核心尺寸 首先,我們專注於在不刪除功能的情況下縮小尺寸 然後考慮核心壓縮的方式 根據儲存讀取速度和cpu解壓縮核心之間的平衡,需要對不同的壓縮演算法進行測試...

優化嵌入式Linux的啟動時間之檔案系統

1.檔案系統 不同的儲存介質會採用不同的檔案系統 2 raw 快閃儲存器 jffs2 yaffs2 ubifs ubiblock squashfs 對於塊檔案系統,特性各異 1.1.jffs2 用於raw flash 1.3 yaffs2 用於raw flash 1.4.ubifs 用於raw fl...

嵌入式 Linux 與linux啟動時自動載入模組

一 在arm linux 下,一般而言,產品在啟動的過程中應該載入模組,最簡單的方法是修改啟動過程的rc指令碼 etc init.d rcs 增加ismod ko這個命令。例如 載入 lib modules 2.6.26.5 s3c2410 buttons cd lib modules 2.6.26...