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内核就是个光杆司令,啥也干不了。
根文件系统的作用,我归纳为三点:
- 提供系统初始化流程:从内核态切换到用户态,启动第一个进程。
- 提供用户交互环境:让你能通过Shell操作设备。
- 提供应用程序运行环境:库、配置、设备接口,缺一不可。
我曾经遇到一个坑:自己做的根文件系统,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在嵌入式系统中的位置,我用一张图来说明。
从这张图可以清楚看到:BusyBox位于根文件系统内部,是用户态的核心组件。它既提供Shell让你交互,也提供init进程完成系统初始化,还提供各种命令供你使用。
注意:BusyBox的init与桌面Linux的systemd完全不同。BusyBox init基于/etc/inittab配置,功能简单但稳定可靠。在资源受限的嵌入式设备上,这反而是优势。
1.4 本章小结
这一章,咱们把嵌入式Linux、根文件系统、BusyBox这三个核心概念串了一遍。你记住三句话就行:
- 嵌入式Linux = 裁剪定制的Linux,跑在资源受限的设备上。
- 根文件系统 = 系统的根基,提供init、Shell、库、配置。
- BusyBox = 一个二进制文件,搞定几百个命令,是嵌入式系统的标配。