2. 嵌入式Linux系统搭建:系统烧录、交叉编译环境配置、SSH远程连接与文件传输、系统基础优化
做嵌入式AI开发,第一步就是把Linux系统跑起来。这一步看似基础,但很多人在这里栽跟头。我见过不少同学拿着开发板,烧录完系统就以为万事大吉,结果后面编译模型时才发现环境一塌糊涂。
这一章,咱们就把系统搭建的每个环节掰开揉碎。从烧录到优化,一条龙搞定。
2.1 系统烧录:让开发板“活”过来
拿到一块空白的开发板,第一件事就是给它装上操作系统。嵌入式Linux的烧录方式和PC不太一样,说白了就是把系统镜像写到板载的存储介质里——通常是SD卡、eMMC或者NAND Flash。
我个人习惯用SD卡做开发阶段的主力。原因很简单:坏了就换一张,成本低,调试方便。
2.1.1 烧录工具选择
| 工具 | 适用平台 | 特点 |
|---|---|---|
| balenaEtcher | Windows / macOS / Linux | 图形化,操作简单,支持校验 |
| Rufus | Windows | 轻量,速度快,支持多种格式 |
| dd命令 | Linux / macOS | 命令行,灵活,适合脚本化 |
| Win32DiskImager | Windows | 老牌工具,稳定可靠 |
我推荐初学者用balenaEtcher。它跨平台,界面直观,烧录完还会自动校验。我在项目中用过不下百次,没出过问题。
2.1.2 烧录步骤(以SD卡为例)
- 准备镜像:从开发板厂商官网下载系统镜像,通常是.img或.raw格式。
- 插入SD卡:用读卡器连到电脑。注意:SD卡容量建议16GB以上,Class 10或UHS-I级别。
- 打开烧录工具:选择镜像文件,选择目标SD卡。
- 开始烧录:点击Flash,等待完成。
- 校验:烧录完成后,工具会自动校验。如果失败,换一张SD卡重试。
2.1.3 首次启动与配置
烧录完成后,把SD卡插入开发板,上电。第一次启动通常需要做一些基础配置:
- 设置root密码
- 配置网络(有线或Wi-Fi)
- 扩展文件系统(有些镜像默认只用了部分空间)
- 更新软件源
我建议你第一次启动时,用串口线连接开发板。这样能看到完整的启动日志,万一卡住了也能及时排查。
2.2 交叉编译环境配置:在PC上编译,在ARM上运行
嵌入式设备的算力有限,直接在开发板上编译大型项目——比如OpenCV、TensorFlow Lite——那得等到天荒地老。所以我们需要交叉编译:在性能强劲的PC上编译出ARM架构的可执行文件,然后传到开发板上运行。
说白了,就是让PC“假装”自己是ARM处理器。
2.2.1 安装交叉编译工具链
以ARM Cortex-A系列为例,常用的工具链是gcc-arm-linux-gnueabihf。安装命令:
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install gcc-arm-linux-gnueabihf
# 验证安装
arm-linux-gnueabihf-gcc --version
如果你用的是aarch64(64位ARM),那就装这个:
sudo apt-get install gcc-aarch64-linux-gnu
2.2.2 编写第一个交叉编译程序
写一个简单的Hello World,验证环境是否正常:
// hello.c
#include <stdio.h>
int main() {
printf("Hello from ARM Linux!\n");
return 0;
}
编译:
arm-linux-gnueabihf-gcc -o hello hello.c
用file命令查看生成的文件:
file hello
# 输出:ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV)
看到ARM字样,说明编译成功了。把这个文件传到开发板上,运行一下,应该能正常输出。
2.2.3 交叉编译的常见坑
- 动态链接库不匹配:PC上编译时链接的库,开发板上可能没有。解决方案:用静态链接,或者把库一起传过去。
- 浮点运算ABI不一致:有的工具链用hard float,有的用soft float。选错了,程序直接崩溃。我遇到过一回,排查了半天才发现是ABI不匹配。
- 编译器版本差异:GCC版本太新,生成的二进制在旧内核上跑不了。建议用厂商提供的工具链。
2.3 SSH远程连接与文件传输:告别串口线
串口调试虽然可靠,但速度慢,还不能传文件。一旦网络配好,我立马切换到SSH。你想想看,坐在工位上就能操作开发板,多舒服。
2.3.1 开启SSH服务
大多数嵌入式Linux镜像默认没开SSH。手动开启:
# 安装SSH服务
sudo apt-get install openssh-server
# 启动服务
sudo systemctl start sshd
# 设置开机自启
sudo systemctl enable sshd
查看开发板的IP地址:
ip addr show
2.3.2 从PC连接开发板
ssh root@192.168.1.100
第一次连接会提示确认指纹,输入yes,然后输入密码。搞定。
2.3.3 文件传输:scp与rsync
传文件用scp:
# 从PC传到开发板
scp hello root@192.168.1.100:/home/root/
# 从开发板传到PC
scp root@192.168.1.100:/home/root/log.txt .
如果文件多、改动频繁,用rsync更高效:
rsync -avz ./build/ root@192.168.1.100:/home/root/app/
rsync只传差异部分,第二次以后快得飞起。我在项目里每天要传几十次文件,rsync是救命工具。
2.4 系统基础优化:让开发板跑得更稳
系统能跑起来只是第一步。做AI图像识别,对性能和稳定性要求高。下面这几个优化点,我建议你拿到板子后立刻做。
2.4.1 关闭不必要的服务
嵌入式设备资源有限,跑一堆没用的服务纯属浪费。关掉它们:
# 查看运行中的服务
systemctl list-units --type=service --state=running
# 禁用不需要的服务
sudo systemctl disable bluetooth.service
sudo systemctl disable avahi-daemon.service
2.4.2 调整CPU频率策略
默认的CPU调度策略可能偏保守。做AI推理时,我建议改成performance模式:
# 查看当前策略
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
# 改为performance
echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
2.4.3 优化内存管理
嵌入式Linux默认的swappiness值(倾向于使用交换分区)可能太高。调低它:
# 查看当前值
cat /proc/sys/vm/swappiness
# 临时修改
sudo sysctl vm.swappiness=10
# 永久修改
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf
另外,如果你的AI模型需要大块连续内存,可以调整CMA(Contiguous Memory Allocator)的大小。这个需要在内核启动参数里改,具体数值看你的模型需求。
2.4.4 文件系统优化
SD卡的读写速度是瓶颈。我建议:
- 挂载时加上noatime选项,减少写操作
- 日志文件放到tmpfs(内存文件系统)里
- 频繁读写的临时文件也放到tmpfs
# 在/etc/fstab中修改
/dev/mmcblk0p1 / ext4 defaults,noatime 0 1
tmpfs /tmp tmpfs defaults,size=64M 0 0
2.5 本章知识体系总览
下面这张图把系统搭建的完整流程串起来了。你可以把它贴在工位上,每一步都对照着来。
核心要点:
- 系统烧录是基础,选对工具和镜像,一次成功
- 交叉编译环境配好后,开发效率翻倍
- SSH+rsync是远程开发的黄金组合
- 系统优化要针对AI场景做取舍,别盲目追求极致
系统搭建这块,说白了就是打好地基。地基稳了,后面做模型部署、图像识别才能顺风顺水。我见过太多人急着跑模型,结果系统环境一塌糊涂,最后排查问题的时间比写代码还多。
嗯,这一章的内容就到这儿。把上面几步走完,你的开发板就已经是一个合格的AI开发平台了。