第一章:课程导学与环境准备
大家好,我是你们的嵌入式Linux讲师。做嵌入式这行十几年了,我见过太多人在rootfs上栽跟头。说实话,rootfs这东西,看着简单,真上手了全是坑。今天咱们就从根儿上把它捋清楚。
1.1 什么是rootfs?
rootfs,全称是root filesystem,中文叫根文件系统。说白了,它就是Linux系统启动后挂载的第一个文件系统。内核启动完,第一件事就是找它。
我打个比方你就明白了:内核就像一个人的骨架,rootfs就是血肉和器官。没有骨架人立不起来,但没有血肉,那就是个骷髅架子,啥也干不了。
rootfs里装的是啥?
- 系统命令:ls、cp、mv这些你天天用的
- 库文件:程序运行依赖的.so动态库
- 配置文件:/etc目录下那一堆
- 设备节点:/dev下的各种设备文件
- 挂载点:/proc、/sys这些虚拟文件系统的挂载目录
核心要点:没有rootfs,Linux内核启动后就会panic,直接死给你看。我当年第一次自己编译内核,忘了做rootfs,看着屏幕上"Kernel panic - not syncing: VFS: Unable to mount root fs"那行字,愣是查了两天资料才搞明白。
1.2 为什么需要自动化管理?
你想想看,一个嵌入式产品从开发到量产,rootfs可能要改几十次。加个驱动要改,换个库要改,调个参数还要改。手动搞?我试过,真的会疯。
我记得有一次给客户做项目,他们的rootfs有300多个文件,每次发布都要手动打包、校验、烧录。结果有一次漏了一个.so文件,整批设备启动不了,差点造成重大事故。从那以后,我下定决心搞自动化。
自动化管理能带来什么?
- 一致性:每次构建出来的rootfs一模一样,不会出现"在我机器上能跑"的尴尬
- 可追溯:改了啥、为啥改,都有记录
- 效率提升:原来改一次要半小时,现在一键搞定
- 减少人为错误:机器不会像人一样犯低级错误
我的建议:哪怕你只是自己学习,也建议从一开始就用自动化工具。养成好习惯,后面做项目会省很多事。
1.3 开发环境搭建
好,理论说完了,咱们动手。环境搭建这块,我踩过的坑比你们走过的路还多。下面我一步步带你搭。
1.3.1 虚拟机安装
我习惯用VirtualBox + Ubuntu 20.04 LTS。为什么选这个组合?稳定,社区活跃,遇到问题好搜答案。
# 安装VirtualBox
# 去官网下载对应系统的安装包,一路下一步就行
# 创建虚拟机
# 内存建议给4GB以上,硬盘至少40GB
# 安装Ubuntu 20.04 LTS
# 下载ISO镜像,挂载安装,过程很简单
注意:虚拟机网络要选"桥接模式",不然后面QEMU的网络配置会让你头疼。我曾经在这上面浪费了一整天。
1.3.2 交叉编译链
交叉编译链是嵌入式开发的灵魂。你的开发机是x86架构,但目标板可能是ARM、RISC-V或者MIPS。没有交叉编译链,你写的程序跑不到目标板上去。
我推荐用Linaro提供的工具链,省心。
# 下载ARM交叉编译链
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
# 解压
tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
# 配置环境变量
export PATH=$PATH:/path/to/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin
# 验证安装
arm-linux-gnueabihf-gcc --version
验证一下能不能用:
# 写个简单的hello world
echo '#include <stdio.h>
int main() {
printf("Hello, Embedded Linux!\n");
return 0;
}' > hello.c
# 交叉编译
arm-linux-gnueabihf-gcc -o hello hello.c
# 查看生成的文件类型
file hello
# 输出应该是:ELF 32-bit LSB executable, ARM, ...
小技巧:把交叉编译链的路径加到~/.bashrc里,这样每次打开终端就不用重新export了。
1.3.3 QEMU模拟器
QEMU是个好东西。没有开发板?没关系,QEMU能模拟出各种硬件平台。我经常用它来做原型验证,等代码调通了再烧到真板子上。
# 安装QEMU
sudo apt-get install qemu-system-arm
# 验证安装
qemu-system-arm --version
# 下载一个现成的ARM内核和rootfs测试
wget https://releases.linaro.org/components/kernel/uefi-linaro/latest/arm64/Image
wget https://releases.linaro.org/components/kernel/uefi-linaro/latest/arm64/grub-aa64.efi
# 启动QEMU
qemu-system-aarch64 -machine virt -cpu cortex-a57 -m 1G -kernel Image -append "console=ttyAMA0" -nographic
看到内核启动日志了吗?那就是你的嵌入式Linux在QEMU里跑起来了。
1.4 本章知识体系
下面这张图是我画的,把本章的核心逻辑串起来了。你一看就明白:
1.5 环境验证
环境搭好了,咱们验证一下。写个简单的脚本,确保所有工具都能正常工作:
#!/bin/bash
# 环境验证脚本
echo "=== 环境验证开始 ==="
# 检查VirtualBox
if command -v VBoxManage &> /dev/null; then
echo "[OK] VirtualBox 已安装"
else
echo "[WARN] VirtualBox 未安装"
fi
# 检查交叉编译链
if arm-linux-gnueabihf-gcc --version &> /dev/null; then
echo "[OK] 交叉编译链已安装"
else
echo "[FAIL] 交叉编译链未安装"
fi
# 检查QEMU
if qemu-system-arm --version &> /dev/null; then
echo "[OK] QEMU已安装"
else
echo "[FAIL] QEMU未安装"
fi
echo "=== 环境验证结束 ==="
把这段脚本保存为check_env.sh,运行一下。如果全部显示OK,恭喜你,环境搭好了。如果有FAIL的,回去检查一下哪一步漏了。
我的经验:环境搭建这一步,宁可多花点时间也要确保每个工具都验证通过。我见过太多学员后面课程跑不起来,最后发现是环境没搭好。磨刀不误砍柴工,真的。
好,第一章就到这里。环境搭好了,后面咱们就可以真正开始搞rootfs自动化管理了。记住,今天搭的环境,后面每一章都会用到。