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卡为例)

  1. 准备镜像:从开发板厂商官网下载系统镜像,通常是.img或.raw格式。
  2. 插入SD卡:用读卡器连到电脑。注意:SD卡容量建议16GB以上,Class 10或UHS-I级别。
  3. 打开烧录工具:选择镜像文件,选择目标SD卡。
  4. 开始烧录:点击Flash,等待完成。
  5. 校验:烧录完成后,工具会自动校验。如果失败,换一张SD卡重试。
注意:烧录过程中不要拔掉SD卡或断电。我曾经有一次烧录到一半断电,结果SD卡直接报废。嗯,从那以后我都是插着UPS干活。

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
小技巧:我习惯把工具链路径加到~/.bashrc里,这样每次打开终端都能直接用。另外,建议用软链接把工具链名简化一下,省得每次敲一长串。

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,然后输入密码。搞定。

推荐配置:我习惯在~/.ssh/config里配置主机别名,这样每次只用敲ssh myboard就行。另外,用SSH密钥登录比密码更安全,也更快。

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
注意:performance模式会提高功耗和发热。如果板子散热不好,建议用ondemand模式,兼顾性能和温度。

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 本章知识体系总览

下面这张图把系统搭建的完整流程串起来了。你可以把它贴在工位上,每一步都对照着来。

嵌入式Linux系统搭建流程 嵌入式Linux系统搭建流程 ① 系统烧录 选择镜像 烧录工具(Etcher/dd) 首次启动配置 验证系统启动 ② 交叉编译环境 安装工具链 编写测试程序 验证ARM二进制 解决ABI/库依赖 ③ SSH远程连接 开启SSH服务 密钥登录配置 scp/rsync传输 远程调试 ④ 系统基础优化 优化项 关闭无用服务 CPU性能模式 内存/swappiness 文件系统优化 释放CPU/RAM 提升推理速度 防止OOM 延长SD卡寿命 💡 建议顺序:烧录 → 交叉编译 → SSH → 优化,每一步验证通过后再继续

核心要点:

  • 系统烧录是基础,选对工具和镜像,一次成功
  • 交叉编译环境配好后,开发效率翻倍
  • SSH+rsync是远程开发的黄金组合
  • 系统优化要针对AI场景做取舍,别盲目追求极致

系统搭建这块,说白了就是打好地基。地基稳了,后面做模型部署、图像识别才能顺风顺水。我见过太多人急着跑模型,结果系统环境一塌糊涂,最后排查问题的时间比写代码还多。

嗯,这一章的内容就到这儿。把上面几步走完,你的开发板就已经是一个合格的AI开发平台了。