在嵌入式Linux系统移植过程中,BusyBox构建的根文件系统往往只是起点。上一期我们完成了初步搭建,但系统启动时仍会出现服务未加载、文件系统未挂载等问题。本文将深入讲解如何通过配置/etc/init.d/rcS、/etc/fstab和/etc/inittab三大核心文件,打造一个功能完善的根文件系统。无论你使用C++、Java还是Python进行嵌入式开发,这些底层配置都是绕不开的基础设施。

一、rcS脚本:系统启动的指挥官

Linux内核启动完成后,需要一套机制来初始化各项服务。rcS就是BusyBox init程序读取的启动脚本,它定义了系统启动时应该执行哪些初始化操作。这个文件位于/etc/init.d/目录下,是根文件系统启动流程的第一道关卡。

首先在rootfs目录中创建/etc/init.d/rcS文件:

rcS本质上是一个shell脚本,内容虽然精简但每一行都至关重要:

#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
export PATH LD_LIBRARY_PATH
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

逐行解析这段脚本的关键作用:

  • 第1行:声明脚本解释器为shell,确保脚本能被正确执行
  • 第3行:设置PATH环境变量,避免执行命令时出现“找不到文件”的错误
  • 第4行:配置LD_LIBRARY_PATH,指定动态库搜索路径
  • 第5行:通过export导出环境变量,使其成为全局变量
  • 第7行:调用mount -a挂载/etc/fstab中定义的所有文件系统
  • 第8-9行:创建/dev/pts目录并挂载devpts伪文件系统
  • 第11-12行:启用mdev管理热插拔设备,内核可自动在/dev下创建设备节点

实践建议:上述脚本是最精简版本,适合初学者理解启动流程。实际项目中,你可能需要根据具体硬件平台添加更多初始化命令。mdev的详细用法可参考BusyBox源码中的docs/mdev.txt文档。

创建完成后,必须赋予rcS可执行权限,否则系统无法运行该脚本:

chmod 777 rcS

设置权限后重启内核(在secure中执行reboot命令),你会看到如下提示:

系统提示找不到/etc/fstab文件——这是因为mount -a需要读取该文件来确定挂载规则。这正是我们下一步要解决的问题。

[AFFILIATE_SLOT_1]

二、fstab文件:自动挂载的配置中心 ⚙️

/etc/fstab是Linux系统中定义开机自动挂载分区的配置文件。当系统启动执行mount -a时,会逐行读取该文件并按照指定参数挂载对应的文件系统。

fstab文件的每一行由6个字段组成,格式如下:

     

各字段含义详解:

  • <file system>:要挂载的设备,可以是块设备(如/dev/sda)或特殊文件系统
  • <mount point>:挂载点目录
  • <type>:文件系统类型,如ext2、ext3、proc、romfs、tmpfs等
  • <options>:挂载选项,通常使用defaults(包含rw、suid、dev、exec、auto、nouser、async)
  • <dump>:是否允许备份,0表示不备份,1表示备份
  • <pass>:磁盘检查顺序,0表示不检查,根目录设为1,其他分区从2开始

⚠️ 注意事项:一般不在fstab中挂载根目录,因此<pass>字段通常设为0。在Ubuntu终端中输入man mount可查看所有可用挂载选项。

根据上述格式,在fstab文件中写入以下内容:

#                
proc            /proc           proc     defaults        0       0
tmpfs           /tmp            tmpfs    defaults        0       0
sysfs           /sys            sysfs    defaults        0       0

创建完成后重新启动Linux系统,你将看到启动成功且无任何错误提示:

✅ 至此,文件系统挂载问题已解决。但还有一个关键文件需要配置——/etc/inittab。

三、inittab文件:init进程的行为准则

/etc/inittab是BusyBox init程序的核心配置文件,决定了系统启动后各进程的启动方式和行为。详细参考可查看BusyBox源码中的examples/inittab文件。

inittab由若干条指令组成,每条指令格式相同,由冒号分隔为4个字段:

:::

各字段含义:

  • <id>:指令标识符,对BusyBox而言用于指定控制tty(如串口或LCD屏幕)
  • <runlevels>:对BusyBox无效,留空即可
  • <action>:指定进程的触发动作,BusyBox支持的动作见下表
  • <process>:具体执行的程序、脚本或命令

BusyBox支持的主要action动作如下:

创建/etc/inittab文件并写入以下内容:

#/etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a

各行配置的作用解析:

  1. 第2行:系统启动后执行/etc/init.d/rcS脚本
  2. 第3行:将console作为控制台终端(ttymxc0)
  3. 第4行:重启时运行/sbin/init
  4. 第5行:按下Ctrl+Alt+Del组合键时执行/sbin/reboot重启系统
  5. 第6行:关机时执行/bin/umount卸载各文件系统
  6. 第7行:关机时执行/sbin/swapoff关闭交换分区

重要提示:/etc/inittab创建完成后重启开发板即可生效。至此,根文件系统所需的核心文件已全部创建完毕。

四、后续测试与验证方向

根文件系统的基础配置完成后,还需要进行一系列功能测试来验证系统的完整性:

  • 软件运行测试:验证自行编写的程序(无论是C++、Python还是JavaScript运行时)能否正常运行
  • 开机自启动:检查是否支持软件随系统启动自动运行
  • 中文支持:确认系统能否正确显示和处理中文字符
  • 链接功能:测试动态链接库的加载是否正常

这些测试内容将在下一期博客中详细介绍。对于使用TypeScript或Java进行上层应用开发的读者,建议特别关注库文件路径和运行时环境的配置。

[AFFILIATE_SLOT_2]

总结

本文系统性地完善了BusyBox根文件系统的三大核心配置文件:rcS负责系统启动初始化,fstab管理文件系统自动挂载,inittab定义init进程行为。三者协同工作,构成了嵌入式Linux系统启动的基础框架。掌握这些配置不仅有助于理解Linux启动流程,也为后续的应用开发和系统调试奠定了坚实基础。