1、嵌入式系统概述:什么是嵌入式Linux、根文件系统的作用、BusyBox简介

各位同学,咱们今天正式开课。做嵌入式Linux开发这么多年,我见过不少新手一上来就急着敲命令、烧镜像,结果遇到问题完全摸不着头脑。其实,搞懂几个核心概念,比什么都重要。这一章,咱们就把地基打牢。

1.1 到底什么是嵌入式Linux?

说白了,嵌入式Linux就是把Linux操作系统裁剪、移植到非PC的设备上跑。你想想看,你的手机、路由器、智能电视、甚至汽车中控,里面很可能都跑着Linux。

它跟咱们桌面上的Ubuntu、CentOS有什么不同?我列个表,你一看就明白。

对比项 桌面Linux 嵌入式Linux
硬件资源 CPU强劲、内存大、硬盘大 CPU弱、内存小(几MB~几百MB)、Flash小
存储介质 机械硬盘/SSD NAND Flash、eMMC、SD卡
文件系统 ext4、XFS jffs2、yaffs2、ubifs、squashfs
启动方式 BIOS/UEFI → GRUB → 内核 BootROM → Bootloader → 内核
交互方式 键盘鼠标+显示器 串口、SSH、触摸屏
开发模式 直接在目标机上开发 交叉编译,宿主机→目标机

嵌入式Linux的核心,就是按需定制。不需要的功能,砍掉;不需要的驱动,不编译。我当年做第一个项目时,内核编译出来快20MB,结果板子Flash只有8MB,折腾了好几天才把内核瘦身到3MB以内。嗯,这里要注意,资源永远是第一约束。

1.2 根文件系统——系统的“根”

内核启动后,需要挂载一个文件系统作为根,这就是根文件系统(Root Filesystem,简称rootfs)。它可不是存点配置文件那么简单。

根文件系统至少包含以下几样东西:

  • init程序:内核启动后第一个用户态进程,PID为1。它挂了,系统就panic了。
  • Shell和基本命令:让你能敲ls、cd、cp、mv。
  • 库文件:比如libc、libm,应用程序依赖它们。
  • 设备节点:/dev目录下的各种设备文件。
  • 配置文件:/etc下的inittab、fstab、passwd等。
  • 挂载点:/proc、/sys、/tmp等空目录。

一句话总结:没有根文件系统,Linux内核就是个光杆司令,啥也干不了。

根文件系统的作用,我归纳为三点:

  1. 提供系统初始化流程:从内核态切换到用户态,启动第一个进程。
  2. 提供用户交互环境:让你能通过Shell操作设备。
  3. 提供应用程序运行环境:库、配置、设备接口,缺一不可。

我曾经遇到一个坑:自己做的根文件系统,init程序路径写错了,内核启动后直接报“Kernel panic - not syncing: No init found”。当时查了半天,才发现是/etc/inittab里指定了错误的init路径。所以,根文件系统的目录结构和关键文件路径,绝对不能搞错。

1.3 BusyBox——嵌入式系统的瑞士军刀

好,现在问题来了。桌面Linux有几百个命令,每个命令对应一个独立的二进制文件,比如/bin/ls、/bin/cp、/bin/mv。这些文件加起来,体积轻松上百MB。嵌入式设备那点Flash空间,根本装不下。

怎么办?BusyBox就是来解决这个问题的。

BusyBox是一个单一二进制文件,它把几百个常用Linux命令的实现集成在一起。通过符号链接,一个命令对应BusyBox的一个功能。比如:

# ls -l /bin/ls
lrwxrwxrwx 1 root root 7 /bin/ls -> /bin/busybox

# ls -l /bin/cp
lrwxrwxrwx 1 root root 7 /bin/cp -> /bin/busybox

你执行ls,实际上执行的是busybox ls。BusyBox根据argv[0]来判断要调用哪个功能。

BusyBox的特点,我总结如下:

特性 说明
体积小 一个完整的BusyBox二进制文件,通常只有几百KB到1MB左右
功能全 支持ls、cp、mv、cat、grep、sed、awk、vi、init、telnetd、httpd等400多个命令
可裁剪 通过编译配置,可以按需选择要支持的命令,进一步缩小体积
静态链接 可以编译成静态链接版本,不依赖外部库,部署更简单
兼容性好 命令选项和输出格式尽量与标准GNU工具集保持一致

个人建议:刚开始学BusyBox,先别急着裁剪。用默认配置编译一个全功能版本,跑起来看看效果。等熟悉了,再慢慢做减法。

BusyBox在嵌入式系统中的位置,我用一张图来说明。

嵌入式Linux系统分层结构 硬件层(CPU、内存、Flash、外设) Bootloader(U-Boot) Linux内核(Kernel + 驱动) 根文件系统(Root Filesystem) /bin/busybox /etc/inittab /lib/libc.so /dev/ttyS0 BusyBox(Shell + 命令 + init) 核心组件 BusyBox是根文件 系统的核心用户 态程序集合

从这张图可以清楚看到:BusyBox位于根文件系统内部,是用户态的核心组件。它既提供Shell让你交互,也提供init进程完成系统初始化,还提供各种命令供你使用。

注意:BusyBox的init与桌面Linux的systemd完全不同。BusyBox init基于/etc/inittab配置,功能简单但稳定可靠。在资源受限的嵌入式设备上,这反而是优势。

1.4 本章小结

这一章,咱们把嵌入式Linux、根文件系统、BusyBox这三个核心概念串了一遍。你记住三句话就行:

  • 嵌入式Linux = 裁剪定制的Linux,跑在资源受限的设备上。
  • 根文件系统 = 系统的根基,提供init、Shell、库、配置。
  • BusyBox = 一个二进制文件,搞定几百个命令,是嵌入式系统的标配。