
在嵌入式 ARM Linux 系统的构建中,根文件系统(Root File System,简称根文件系统)扮演着至关重要的角色。它是整个系统运行的基础,承载着系统运行所需的各种文件和目录,如同大树的根系,为系统的正常运转提供必要的支持。
根文件系统是 Linux 系统中所有其他文件系统和目录的起源。在 Linux 中,所有文件、目录、设备和驱动都被组织为一个树型结构,根文件系统就是这个结构的根节点。它是 Linux 内核启动后挂载的第一个文件系统,内核代码映像文件保存在根文件系统中,系统引导程序会在其挂载之后将一些初始化脚本和服务加载到内存中去运行。
一套完整的 Linux 系统,只有内核本身是无法正常工作的。内核需要 rootfs 上的 etc 目录下的配置文件、/bin /sbin 等目录下的 shell 命令,以及 /lib 目录下的库文件等相配合才能工作。如果没有根文件系统,Linux 内核在启动时会提示内核崩溃(Kernel panic)。
其主要作用包括:
嵌入式 ARM Linux 系统的根文件系统通常由以下几个关键部分组成:
目录 | 核心内容 | 典型示例文件/工具 |
|---|---|---|
/bin | 基础用户命令(所有用户可用) | ls, cp, sh, mount |
/sbin | 系统管理员命令(需root权限) | ifconfig, reboot, fsck |
/etc | 系统配置文件 | fstab, passwd, network/ |
/lib | 动态链接库(如glibc、内核模块) | libc.so, ld-linux-armhf.so.3 |
/dev | 设备节点文件(由内核或udev生成) | ttyS0, mmcblk0p1, gpiochip0 |
/proc | 内核和进程信息的虚拟文件系统(运行时生成) | cpuinfo, meminfo |
/sys | 内核对象和硬件控制的虚拟文件系统 | 电源管理、GPIO控制接口 |
/usr | 用户级程序和非关键库(可挂载为独立分区) | /usr/bin, /usr/lib |
/var | 可变数据(日志、缓存等) | /var/log/messages |
/tmp | 临时文件(通常挂载为tmpfs以提高性能) | - |
/root | root用户的家目录 | - |
/home | 普通用户的家目录(嵌入式系统可能省略) | - |
虽然设备驱动通常包含在内核中,但某些特定设备或外设的驱动可能以用户空间程序的形式存在,并位于根文件系统的某个目录中。
如 SSH、Telnet、FTP、HTTP、DHCP、DNS 等。这些工具和协议提供了系统连接其他网络设备、数据交换和网络管理的能力。
如 gdb、strace、top 等。这些工具能够帮助开发者定位和解决系统中的各种问题和异常。
制作根文件系统的方法有多种,下面介绍一种常用的基于 BusyBox 的方法:

①准备开发环境:
②配置 BusyBox:
make menuconfig 进入配置界面。③编译 BusyBox:
make 进行编译。make install 将编译结果安装到指定的目录(如 rootfs)。④创建根文件系统目录结构:
⑤添加必要的文件:
⑥制作根文件系统镜像:使用专用工具(如 mke2fs)将文件夹形式的根文件系统制作成可供烧录的镜像文件。
制作完成后,需要对根文件系统进行测试以确保其能够正常工作。常用的测试方法包括:
①使用 NFS 挂载测试:
②烧录到块设备测试:
ls, ifconfig, init等),替代GNU Coreutils
# 编译BusyBox示例
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- defconfig
make menuconfig # 选择所需工具
make install # 输出到_install目录::sysinit:/etc/init.d/rcS
ttyS0::respawn:/sbin/getty -L ttyS0 115200 vt100proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults,size=64M 0 0arm-linux-gnueabihf-strip裁剪调试符号
ldd检查依赖:
arm-linux-gnueabihf-ldd /bin/busybox类型 | 特点 | 适用场景 |
|---|---|---|
initramfs | 压缩的CPIO归档,直接嵌入内核镜像 | 早期启动/临时根文件系统 |
squashfs | 只读压缩文件系统(节省空间) | 固件升级(与可写分区配合使用) |
UBIFS | 专为NAND Flash设计(支持磨损均衡、坏块管理) | NAND Flash存储设备 |
ext4 | 经典日志文件系统(支持读写) | eMMC/SD卡等块设备 |
tmpfs | 内存文件系统(高速但易失) | /tmp目录或临时数据存储 |
在嵌入式系统中,资源有限,因此需要对根文件系统进行优化以提高性能和降低功耗。以下是一些优化建议:
①空间节省:
rm -rf /usr/share/locale/*
musl-libc替代glibc(更小的体积)
②只读优化:
# 挂载为只读(提高可靠性)
mount -o remount,ro / ③调试手段:
strace跟踪系统调用
df -h检查存储空间占用
④裁剪不必要的组件:移除根文件系统中不必要的程序和库文件,以减少系统的大小和复杂度。
⑤使用压缩文件系统:选择压缩文件系统(如 CRAMFS、SquashFS 等)来减少根文件系统的大小,同时提高读取速度。
⑥优化启动过程:使用轻量级的 init 系统(如 systemd 的简化版或 BusyBox 的 init)来加快系统启动速度。
⑦动态加载库文件:使用动态链接库(Shared Libraries)来减少程序占用的空间,并允许在运行时按需加载库文件。
⑧调整系统配置:根据实际需求调整系统配置文件(如 /etc/inittab、/etc/fstab 等),以减少不必要的启动服务和挂载点。
①启动失败:Kernel panic - not syncing: No init found
root=是否正确指定设备
/sbin/init或/bin/sh存在且有可执行权限
②动态库缺失
LD_LIBRARY_PATH指定库路径
readelf -d <binary>查看依赖库
③存储空间不足