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文件来决定系统启动后和关机前执行的操作
bash
# 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
中添加这些文件即可,如下:
bash
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 文件的内容通常以行为单位组织,每行定义了一个任务或者服务的启动方式。每行的格式通常为:
bash
id : runlevels : action : process
其中:
- id 是一个唯一的标识符,用于表示要执行的任务或服务。
- runlevels 指定了在哪些运行级别下要执行该任务或服务。运行级别是指系统的不同状态,通常用数字表示(如0、1、2、...、6),每个运行级别对应一组系统服务的状态。可以使用单个运行级别或者运行级别范围来指定,用逗号分隔。
- action 指定了当系统运行到指定的运行级别时要执行的动作,常见的动作包括:
○ respawn:表示如果进程意外终止,则立即重新启动。
○ wait:表示等待指定的进程结束后再执行后续操作。
○ once:表示只执行一次,不会自动重新启动。
○ boot:表示在系统引导时执行。 - process 是要执行的进程或者命令。
例如,一个简单的 inittab 文件可能如下所示:
bash
::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的例子如下:
bash
#!/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" ] && continue
case "$i" in
*.sh)
# Source shell script for speed.
(
trap - INT QUIT TSTP
set start
. $i
)
;;
*)
# No sh extension, so fork subprocess.
$i start
;;
esac
done
ifconfig usb0 192.168.8.88
start-stop-daemon -S -b -n your-app -a /usr/bin/your-app
start-debug-tools
3.3rcK文件
rcK 文件通常是 Linux 系统中的一个脚本文件,用于在系统关机或者重启时执行一些操作。它位于 /etc/init.d
目录下,是系统引导过程中的一个重要组成部分。
在 Linux 中,rcK 脚本的作用主要包括以下几个方面:
- 停止系统服务:rcK 脚本负责停止系统中正在运行的服务。在系统关机或者重启时,需要确保所有的服务都能够正常停止,以避免数据丢失或者系统资源泄露等问题。
- 卸载文件系统:rcK 脚本可能会卸载一些临时挂载的文件系统,释放系统资源并确保数据的完整性。
- 执行其他关机前的清理操作:根据系统的配置和需求,rcK 脚本可能会执行一些其他的关机前的清理操作,例如关闭网络连接、保存系统状态等。
rcK 脚本在系统关机或者重启时是在最后阶段被执行的,它的作用是确保系统能够安全地关闭并保存状态。因此,rcK 脚本的编写和配置非常重要,直接关系到系统的关机过程和数据的完整性。rcK的一个例子如下:
bash
#!/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" ] && continue
case "$i" in
*.sh)
# Source shell script for speed.
(
trap - INT QUIT TSTP
set stop
. $i
)
;;
*)
# No sh extension, so fork subprocess.
$i stop
;;
esac
done