2. 构建边缘网关的Linux系统环境

任务说明

本案例目标是为工业IoT边缘网关搭建可运行的Linux系统环境。边缘网关通常基于ARM或x86平台,需要承载数据采集、协议转换、边缘计算等任务。我们采用最小化根文件系统方案,使用BusyBox提供核心用户态工具,通过内核模块加载支撑硬件驱动,并配置网络与启动流程,最终生成一个可通过QEMU启动验证的完整系统镜像。

系统架构与组成

应用层 边缘采集程序 / MQTT Broker / 协议转换服务 用户态核心 BusyBox (sh, ifconfig, modprobe, init) / glibc Linux 内核 设备驱动 / 网络协议栈 / 文件系统 / 内存管理 硬件平台 ARM Cortex-A9 (vexpress-a9) / 串口 / 网卡 / GPIO 交叉编译 arm-linux-gnueabihf-gcc make menuconfig zImage + dtb QEMU 验证 -M vexpress-a9

构建步骤与实现

1. 准备交叉编译工具链

边缘网关通常资源受限,需在x86主机上交叉编译ARM目标代码。使用Linaro提供的ARM交叉工具链:

# 下载并解压工具链(约200MB)
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 -xf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz
export PATH=$PWD/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin:$PATH
# 验证工具链
arm-linux-gnueabihf-gcc --version

2. 编译Linux内核

# 下载内核源码
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.4.284.tar.xz
tar -xf linux-5.4.284.tar.xz
cd linux-5.4.284

# 使用vexpress开发板默认配置(包含网络、GPIO、串口驱动)
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- vexpress_defconfig

# 启用devtmpfs支持(自动创建设备节点)
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
# 进入 Device Drivers → Generic Driver Options → 勾选 [*] Maintain a devtmpfs filesystem to mount at /dev

# 编译内核与设备树
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4 zImage
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4 dtbs

3. 构建BusyBox根文件系统

# 下载BusyBox
wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2
tar -xf busybox-1.36.1.tar.bz2
cd busybox-1.36.1

# 静态编译配置(避免动态库依赖)
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
# 进入 Settings → Build Options → 勾选 [*] Build static binary (no shared libs)

# 编译并安装到临时目录
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- CONFIG_PREFIX=$PWD/_install install

4. 组装根文件系统目录结构

# 创建必要目录
cd _install
mkdir -p proc sys dev etc/init.d lib/modules

# 创建init脚本(PID 1进程)
cat > etc/init.d/rcS << 'EOF'
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
mount -t devtmpfs none /dev
echo "Edge Gateway Linux System Ready"
hostname edge-gw-01
ifconfig eth0 192.168.1.100 netmask 255.255.255.0 up
EOF
chmod +x etc/init.d/rcS

# 创建inittab
cat > etc/inittab << 'EOF'
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh
::ctrlaltdel:/sbin/reboot
EOF

# 打包为cpio归档
find . | cpio -H newc -o | gzip > ../rootfs.cpio.gz

5. 内核模块编译与集成

# 在内核源码目录编译模块
cd linux-5.4.284
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules -j4

# 安装模块到根文件系统目录
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=$PWD/../busybox-1.36.1/_install modules_install

验证方法

使用QEMU模拟vexpress-a9开发板,验证系统能否完整启动并进入shell:

# 启动QEMU(需提前安装:sudo apt install qemu-system-arm)
qemu-system-arm \
  -M vexpress-a9 \
  -m 256M \
  -kernel linux-5.4.284/arch/arm/boot/zImage \
  -dtb linux-5.4.284/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
  -initrd rootfs.cpio.gz \
  -append "console=ttyAMA0 rdinit=/bin/sh" \
  -nographic

判定标准:

  1. QEMU启动后串口输出内核日志,无panic错误;
  2. 进入shell提示符后,执行cat /proc/cpuinfo能看到ARMv7 Processor信息;
  3. 执行ifconfig能看到eth0接口已配置IP 192.168.1.100;
  4. 执行ls /dev能看到ttyAMA0、mmcblk0等设备节点自动创建;
  5. 执行lsmod能列出已加载的内核模块。

关键文件清单

文件说明
linux-5.4.284/arch/arm/boot/zImageARM内核镜像
linux-5.4.284/arch/arm/boot/dts/vexpress-v2p-ca9.dtb设备树二进制
rootfs.cpio.gzBusyBox根文件系统归档
busybox-1.36.1/_install/etc/init.d/rcS系统初始化脚本

本案例构建的Linux系统环境为边缘网关提供了基础运行平台,后续案例可在此环境上部署采集程序、协议栈和远程管理服务。系统镜像约8MB,可烧录至SD卡或Flash运行于真实硬件。