概述
嵌入式 Linux 设备多种多样,因 Linux 系统内核、驱动、应用等的自由裁剪和组合,导致不同设备上的软件系统,开发和测试人员在面对一个新设备时难免会感到困惑,在此总结一些通用知识,介绍几个主流嵌入式 Linux 系统之间的异同点,及其跟桌面 Linux 发行版之间的差别,方便熟悉和掌握各种不同的嵌入式 Linux 系统操作方法。
准备工作
本文档大部分情况下采用 QEMU 来模拟嵌入式设备,如果你已经有嵌入式开发板或设备,则可以结合本文档来实操,而不一定需要安装 QEMU;
QEMU 是一个开源的硬件模拟器和虚拟器,当用作硬件模拟器时,QEMU 可以在一台机器(例如 PC)上运行为另一台机器(例如 ARM 开发板)制作的操作系统和程序;本文档使用 Buildroot、OpenWrt、Yocto 等构建系统来制作嵌入式 Linux 操作系统及程序,以下在桌面版 Ubuntu 20.4 系统中分别说明其制作方法;
请先确保系统安装了 QEMU,执行以下命令:
sudo apt install qemu
使用 Buildroot 构建系统
Buildroot 是一个简单、高效、易用的构建工具,通过交叉编译生成嵌入式 Linux 系统,支持多种嵌入式 Linux 开发板,同时也支持一些 QEMU 板级;以下使用 Buildroot 板级 qemu_arm_vexpress_defconfig
来构建固件,对应 qemu 机器 vexpress-a9
;
安装必要的软件(参考链接: The Buildroot user manual):
sudo apt install which sed make binutils build-essential gcc g++ bash patch gzip bzip2 perl tar cpio unzip rsync file bc wget git
下载 Buildroot 源码并更新到需要的版本:
# 使用git下载源码库
# git clone https://git.busybox.net/buildroot
# 镜像下载
git clone https://gitee.com/mirrors/buildroot.git
cd buildroot
git reset --hard 2021.02.2
执行默认配置的编译对应板级的固件:
# cd buildroot
make qemu_arm_vexpress_defconfig
make
编译成功后固件在 output/images/
目录下,如图:
执行脚本 output/images/start-qemu.sh serial-only
以终端方式(无显示屏)运行编译后的固件,如图:
使用 OpenWrt 构建系统
OpenWrt 是一个面向嵌入式设备的 Linux 操作系统,最初是针对路由器设备,拥有强大的网络组件和扩展性,具有良好的模块化和可定制性,现在也常用做其他嵌入式设备的 Linux 发行版;
因 OpenWrt 源码 编译时间较长,且编译过程中可能碰到各种各样的问题,为方便起见,在此使用 官方提供 的 QEMU arm 镜像文件;
下载镜像文件:
mkdir -p openwrt-bin
cd openwrt-bin
# 下载内核镜像
wget https://downloads.openwrt.org/snapshots/targets/armvirt/32/openwrt-armvirt-32-zImage
# 下载根文件系统镜像并解压
wget https://downloads.openwrt.org/snapshots/targets/armvirt/32/openwrt-armvirt-32-rootfs-ext4.img.gz
gunzip -kv openwrt-armvirt-32-rootfs-ext4.img.gz
如图:
使用以下命令运行镜像:
# run-qemu-arm_openwrt.sh
qemu-system-arm -nographic -cpu cortex-a7 -smp 1 -M virt -m 256 \
-kernel openwrt-armvirt-32-zImage -append "console=ttyAMA0,115200 rootwait root=fe00" \
-blockdev driver=raw,node-name=hd0,cache.direct=on,file.driver=file,file.filename=openwrt-armvirt-32-rootfs-ext4.img \
-device virtio-blk-pci,drive=hd0
运行后如图:
使用 Yocto 构建系统
Yocto 是一个开源协作项目,提供了一些列模板、工具和方法,旨在帮助用户创建自定义的基于 Linux 的系统,可用于任何架构的硬件,例如:嵌入式设备、服务器或虚拟环境等;以下使用 beaglebone-yocto 板级来作演示;
参考链接:Yocto Project Quick Build — The Yocto Project ® 3.4 documentation, 4 Using the Quick EMUlator (QEMU) — The Yocto Project ® 3.4 documentation
安装必要的软件:
sudo apt install gawk wget git diffstat unzip texinfo gcc build-essential chrpath socat cpio python3 python3-pip python3-pexpect xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev pylint3 xterm python3-subunit mesa-common-dev zstd liblz4-tool
下载源码并更新到需要的版本:
# 使用git下载源码库
# git clone git://git.yoctoproject.org/poky
# cd poky
# git reset --hard dunfell-23.0.12
# 若git下载较慢,可直接下载源码包并解压
wget http://downloads.yoctoproject.org/releases/yocto/yocto-3.1.12/poky-dunfell-23.0.12.tar.bz2
tar -xvf poky-dunfell-23.0.12.tar.bz2
设置环境变量:
cd poky-dunfell-23.0.12
source oe-init-build-env
# 执行上一条命令后,终端将进入build目录,下面的内容都以该目录为基础
修改编译配置文件 build/conf/local.conf
,修改板级为 beaglebone-yocto
,将第 31 行:
#MACHINE ?= "beaglebone-yocto"
改为:
MACHINE ?= "beaglebone-yocto"
启用并行编译并节省磁盘空间,在文件末尾加入:
INHERIT += "rm_work"
BB_NUMBER_THREADS = "2"
PARALLEL_MAKE = "-j 2"
如图:
然后开始编译:
bitbake -k core-image-minimal
编译时间较长,若编译失败,可删除 sstate-cache
, cache
, tmp
目录下的所有文件重新编译,编译成功后的固件在 tmp/deploy/images/beaglebone-yocto/
目录下,如图:
修改 QEMU 运行配置文件 tmp/deploy/images/beaglebone-yocto/core-image-minimal-beaglebone-yocto.qemuboot.conf
,加入选项 -nographic
,如图:
最后执行以下命令运行编译的镜像:
runqemu beaglebone-yocto
运行后如图:
内容简介
认识和操作嵌入式 Linux 系统
从使用者角度介绍嵌入式 Linux 系统基础知识和操作方法;
系统初始化
介绍用户空间初始化流程;
命令行 - vi 和 shell
介绍常见命令行使用方法和shell脚本基本语法;
系统资源及其配置
介绍系统级资源及其配置方法;
交叉编译
介绍开源软件交叉编译方法;
硬件设备操作
介绍常用硬件操作和使用方法;
网络操作
介绍网络操作方法;