第一章:课程导学与环境准备

大家好,我是你们的嵌入式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 本章知识体系

下面这张图是我画的,把本章的核心逻辑串起来了。你一看就明白:

第一章:课程导学与环境准备 - 知识体系 rootfs自动化管理 rootfs概念解析 自动化管理价值 开发环境搭建 内核启动后第一个FS 包含命令/库/配置 一致性/可追溯 效率提升/减少错误 适合团队协作 虚拟机(VirtualBox) 交叉编译链(Linaro) QEMU模拟器 打好基础,后面章节才能顺利推进 环境搭建是嵌入式开发的第一步,也是最关键的一步

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自动化管理了。记住,今天搭的环境,后面每一章都会用到。

可可精品资料库