一、课程导学与开发环境准备
大家好,我是你们的嵌入式系统讲师。做嵌入式Linux开发这么多年,我见过太多人卡在第一步——环境没搭好,后面全白费。今天咱们就从零开始,把地基打牢。
1.1 嵌入式Linux系统组成
一个完整的嵌入式Linux系统,说白了就三块:
- Bootloader:负责初始化硬件,加载内核。我常用的就是U-Boot。
- Linux内核:操作系统的核心,管理进程、内存、设备驱动。
- Rootfs(根文件系统):这是今天的主角。它包含了系统运行所需的所有文件、库、配置、应用程序。
你想想看,内核启动后,如果没有Rootfs,系统就卡在“VFS: Cannot open root device”的报错上。嗯,我当年第一次编译内核时就遇到过,折腾了一整天才明白是文件系统没挂上。
核心概念: Rootfs就是Linux的“家”。/bin、/lib、/etc、/usr……所有用户空间的东西都在这里。没有它,内核就是个光杆司令。
1.2 Rootfs到底是什么?
Rootfs,全称Root Filesystem。它不只是一个目录结构,更是一整套运行环境。我个人习惯把它分成三层:
- 基础层:/bin(基本命令)、/sbin(系统管理命令)、/lib(动态库)
- 配置层:/etc(配置文件)、/var(运行时数据)
- 应用层:/usr(用户程序)、/opt(第三方软件)
我在项目中遇到过,有人把Rootfs做得特别大,结果Flash装不下。也有人做得太小,连ls命令都没有,调试时抓瞎。所以,Rootfs的裁剪是一门艺术。
避坑指南: 我曾经因为忘记添加ld-linux.so.2这个动态链接器,导致所有编译好的程序都报“No such file or directory”。其实文件在,但加载器找不到。这种坑,踩一次就记住了。
1.3 课程目标
这门课的目标很明确:让你亲手从零构建一个可运行的嵌入式Rootfs。不是用Buildroot或Yocto一键生成,而是手动搭建,理解每一层的作用。
具体来说,你会学到:
- 如何选择交叉编译工具链
- 如何编译Busybox生成基础命令
- 如何构建glibc或musl libc运行环境
- 如何配置inittab和启动脚本
- 如何制作根文件系统镜像(ext4、squashfs、initramfs)
说白了,学完这门课,你就能自己“拼”出一个能跑Linux的根文件系统。以后不管是做产品原型,还是调试内核,心里都有底。
1.4 虚拟机与Ubuntu安装
开发环境我推荐用虚拟机。为什么?因为交叉编译环境很容易搞乱宿主机。我在一台Ubuntu上装过三个不同版本的GCC,最后系统库都冲突了。从那以后,我坚持用虚拟机隔离。
步骤很简单:
- 下载并安装VMware Workstation或VirtualBox(我习惯用VMware,稳定)
- 下载Ubuntu 20.04 LTS镜像(长期支持版,省心)
- 创建虚拟机,分配至少2核CPU、4GB内存、40GB硬盘
- 安装系统,选择“最小安装”即可
注意: 虚拟机网络建议选择“桥接模式”,这样方便后续用NFS挂载根文件系统进行调试。NAT模式有时候会出奇怪的问题。
1.5 交叉编译工具链配置
交叉编译,就是在PC上编译出能在ARM(或其他架构)上运行的程序。我们用的工具链是arm-linux-gnueabihf-系列。
我个人推荐两种方式:
- 方式一:下载Linaro预编译工具链(省事,我常用)
- 方式二:用crosstool-NG自己编译(灵活,但耗时)
这里用方式一演示:
# 下载工具链
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
# 解压到 /opt
sudo tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz -C /opt
# 添加环境变量
echo 'export PATH=$PATH:/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin' >> ~/.bashrc
source ~/.bashrc
# 验证
arm-linux-gnueabihf-gcc --version
看到版本信息就说明配置成功了。嗯,这里要注意:工具链的版本要和内核版本匹配。我曾经用太新的GCC编译老内核,结果编译不过去。后来老老实实查了内核文档里的“Recommended compiler versions”。
小技巧: 配置完环境变量后,可以用which arm-linux-gnueabihf-gcc确认路径是否正确。如果显示“not found”,检查一下PATH里有没有拼写错误。
1.6 本章知识体系
下面这张图,是我自己梳理的本章核心逻辑。你可以把它当作一张地图,后面每章都会在这张图上添砖加瓦。
这张图把本章内容串起来了。左边是理论,中间是环境,右边是工具。三者缺一不可。我每次带新人,都让他们先对着这张图把概念理清楚,再动手操作。
1.7 本章小结
这一章我们做了三件事:
- 搞清楚了嵌入式Linux系统的三个组成部分,重点理解了Rootfs的角色
- 搭建了虚拟机开发环境,安装了Ubuntu 20.04
- 配置了交叉编译工具链,验证了arm-linux-gnueabihf-gcc可用
环境搭好了,后面的事就好办了。下一章,我们会开始动手编译Busybox,生成第一个可运行的根文件系统命令集。到时候你会发现,原来Rootfs离你并不远。
课后练习: 在虚拟机中执行arm-linux-gnueabihf-gcc -v,把输出结果截图保存。后面编译出问题时,这个信息能帮你快速定位工具链版本问题。
可可精品资料库