1 Busybox介紹
BusyBox 是一個開源的、輕量級的 Unix 工具箱,它集成了許多標準 Unix 工具的精簡版本。它被設計用來運行在資源受限的環境中,例如嵌入式系統或者啟動盤。BusyBox 將多個標準 Unix 實用工具整合到一個可執行文件中,這些工具包括文件操作、進程管理、網絡配置、文本處理等。
BusyBox 的主要特點包括:
- 精簡性:BusyBox 的設計理念是在小型的可執行文件中集成盡可能多的功能,以節省系統資源。
- 可配置性:可以根據需要選擇性地編譯包含或排除特定功能,以滿足不同系統的要求。
- 可移植性:BusyBox 可以運行在各種不同的 POSIX 系統上,包括 Linux、BSD、Solaris 等。
- 開源性:BusyBox 是自由開源軟件,采用 GPL 授權協議發布。
在嵌入式 Linux 系統中,BusyBox 被廣泛應用于構建小型和高效的根文件系統。通過將多個功能整合到一個可執行文件中,BusyBox 可以顯著減小系統的磁盤占用和內存占用。此外,BusyBox 也被用作啟動腳本或者系統初始化腳本的工具箱,用于配置系統和啟動服務。
總的來說,BusyBox 是一個功能強大、高效且靈活的工具箱,適用于各種嵌入式和資源受限的環境,為系統提供了基本的 Unix 命令行工具和腳本功能。
2 Yocto與busybox
嵌入式軟件開發中,BusyBox 是一個輕量級的 Unix 工具箱,它集成了許多標準 Unix 實用工具的精簡版本。通過在 Yocto 中配置 BusyBox,可以在嵌入式 Linux 系統中實現更小的文件系統和更低的資源消耗。
要在 Yocto 中使用 BusyBox,需要在 Yocto 的配置文件中將其包含到系統中,并指定要包含的 BusyBox 工具。下面是一些配置 BusyBox 的一般步驟:
- 打開 local.conf 或者其他配置文件,通常位于 /build/conf/ 目錄下。
- 確保 busybox 被添加到 CORE_IMAGE_EXTRA_INSTALL 變量中,以確保 BusyBox 被包含在根文件系統中。
- 確保 BusyBox 中包含所需的工具。可以通過設置 BUSYBOX_FEATURES 變量來指定要包含的功能。例如,BUSYBOX_FEATURES 可以包含 “feature1 feature2 …” 的字符串。
- 重新構建你的 Yocto 映像,以包含 BusyBox。
在 BusyBox 配置中,你可以指定要包含的特定工具,以及在編譯時要啟用的功能。通過精心選擇這些選項,可以確保 BusyBox 在系統中提供所需的功能,同時保持最小的系統資源占用。
3 Yocto配置busybox
使用busybox作為linux系統啟動管理器,在distro/poky-customized.conf
中添加如下代碼將busybox作為默認的系統啟動管理器,這樣我們就可以通過編輯rcS,rcK文件來決定系統啟動后和關機前執行的操作
# Use busybox as default init manager, config customized rcS, rcK
VIRTUAL-RUNTIME_init_manager = "busybox"
自定義的metalayer下的recipes-core
文件夾中有images
和busybox
兩個文件夾,在busybox文件夾中添加busybox_%.bbappend
和busybox-inittab_%.bbappend
文件,files中添加busybox-initutils.cfg
,busybox-mdev.cfg
,inittab
,rcK
,rcS
文件
.
├── busybox
│ ├── busybox_%.bbappend
│ ├── busybox-inittab_%.bbappend
│ └── files
│ ├── busybox-initutils.cfg
│ ├── busybox-mdev.cfg
│ ├── inittab
│ ├── rcK
│ └── rcS
└── images
└── core-image-customized.bb
其中,files就是我們需要自定義配置的一些文件,用他們替代poky中busybox中的默認配置文件,因此在bbappend文件中,只需要在SRC_URI
中添加這些文件即可,如下:
SRC_URI += " \file://busybox-initutils.cfg \file://busybox-mdev.cfg \file://rcS \file://rcK \"SRC_URI += " \file://inittab \"
3.1 inittab文件
inittab 是 Unix 和類 Unix 操作系統中的一個配置文件,用于指定系統引導時初始化進程(init)啟動時應該執行的程序。該文件通常位于 /etc 目錄下。
在 Linux 系統中,inittab 文件的作用是定義系統啟動時要執行的初始化任務和服務,以及控制系統如何處理不同的運行級別(runlevel)。
inittab 文件的內容通常以行為單位組織,每行定義了一個任務或者服務的啟動方式。每行的格式通常為:
id : runlevels : action : process
其中:
- id 是一個唯一的標識符,用于表示要執行的任務或服務。
- runlevels 指定了在哪些運行級別下要執行該任務或服務。運行級別是指系統的不同狀態,通常用數字表示(如0、1、2、…、6),每個運行級別對應一組系統服務的狀態。可以使用單個運行級別或者運行級別范圍來指定,用逗號分隔。
- action 指定了當系統運行到指定的運行級別時要執行的動作,常見的動作包括:
○ respawn:表示如果進程意外終止,則立即重新啟動。
○ wait:表示等待指定的進程結束后再執行后續操作。
○ once:表示只執行一次,不會自動重新啟動。
○ boot:表示在系統引導時執行。 - process 是要執行的進程或者命令。
例如,一個簡單的 inittab 文件可能如下所示:
::sysinit:/etc/init.d/rcS
::respawn:/sbin/getty -L tty1 9600 vt100
::shutdown:/etc/init.d/rcK
這個文件表示在系統啟動時執行/etc/init.d/rcS
腳本(sysinit 動作),并在終端 tty1 上啟動一個 getty 進程(respawn 動作),在系統結束時執行/etc/init.d/rcK
腳本
inittab
文件的內容可以根據需要進行自定義和調整,以滿足特定系統的要求。
3.2 rcS文件
rcS 是一個用于系統初始化的腳本文件,在許多 Linux 系統中都可以找到。它通常位于 /etc/init.d
目錄下,是在系統引導過程中被執行的一個重要的初始化腳本。
rcS 腳本的作用包括但不限于以下幾個方面:
- 系統初始化任務的執行:rcS 腳本負責執行系統引導時需要進行的初始化任務,例如加載驅動程序、掛載文件系統、啟動網絡等。這些任務是在系統引導過程中必須要完成的操作,確保系統能夠正常運行起來。
- 啟動和管理系統服務:在一些 Linux 發行版中,rcS 腳本也負責啟動和管理系統的各種服務。它可能會根據配置文件中的設置,啟動指定的服務進程,并在需要時監控和重新啟動這些服務。
- 設置環境變量和系統參數:rcS 腳本可能會設置一些系統級的環境變量和參數,以確保系統在運行時具有正確的配置和環境。
- 執行其他初始化任務:根據具體的系統配置和需求,rcS 腳本可能還會執行一些其他的初始化任務,例如清理臨時文件、設置時鐘等。
rcS 腳本在系統引導過程中是在早期階段被執行的,它的作用是確保系統能夠順利啟動并達到基本可用狀態。因此,rcS 腳本的編寫和配置非常重要,直接關系到系統的啟動過程和穩定性。rcS的例子如下:
#!/bin/sh# Start all init scripts in /etc/rcS.d and /etc/rc5.d
# executing them in numerical order.
#
echo "<< rcS running scripts in /etc/rcS.d >>"for i in /etc/rcS.d/S??* /etc/rc5.d/S??* ;do# Ignore dangling symlinks (if any).[ ! -f "$i" ] && continuecase "$i" in*.sh)# Source shell script for speed.(trap - INT QUIT TSTPset start. $i);;*)# No sh extension, so fork subprocess.$i start;;esac
doneifconfig usb0 192.168.8.88start-stop-daemon -S -b -n your-app -a /usr/bin/your-appstart-debug-tools
3.3rcK文件
rcK 文件通常是 Linux 系統中的一個腳本文件,用于在系統關機或者重啟時執行一些操作。它位于 /etc/init.d
目錄下,是系統引導過程中的一個重要組成部分。
在 Linux 中,rcK 腳本的作用主要包括以下幾個方面:
- 停止系統服務:rcK 腳本負責停止系統中正在運行的服務。在系統關機或者重啟時,需要確保所有的服務都能夠正常停止,以避免數據丟失或者系統資源泄露等問題。
- 卸載文件系統:rcK 腳本可能會卸載一些臨時掛載的文件系統,釋放系統資源并確保數據的完整性。
- 執行其他關機前的清理操作:根據系統的配置和需求,rcK 腳本可能會執行一些其他的關機前的清理操作,例如關閉網絡連接、保存系統狀態等。
rcK 腳本在系統關機或者重啟時是在最后階段被執行的,它的作用是確保系統能夠安全地關閉并保存狀態。因此,rcK 腳本的編寫和配置非常重要,直接關系到系統的關機過程和數據的完整性。rcK的一個例子如下:
#!/bin/sh# Stop all init scripts in /etc/rc6.d
# executing them in numerical order.
#
echo "<< rcK stop all init scripts in /etc/rd6.d >>"for i in /etc/rc6.d/K??*; do# Ignore dangling symlinks (if any).[ ! -f "$i" ] && continuecase "$i" in*.sh)# Source shell script for speed.(trap - INT QUIT TSTPset stop. $i);;*)# No sh extension, so fork subprocess.$i stop;;esac
done