背景:
Kvaser Edge是一款嵌入式Linux平台,集成了CAN硬件及以太网、Wi-Fi、USB等接口。设备硬件与核心软件均由Kvaser开发,为开发者提供稳定安全的嵌入式应用开发基础,开发门槛低、拓展灵活性强。
KEOS软件栈以LXC容器为核心构建。在本文中,我们将介绍从入门到在Kvaser Edge上运行工作应用程序的过程。
本文面向所有初次接触该设备,并希望通过部署容器开始开发应用程序的用户。同时说明如何规避设备恢复出厂设置后本地开发成果被清空的问题。
Kvaser Edge是一款嵌入式Linux平台,集成了CAN硬件及以太网、Wi-Fi、USB等接口。设备硬件与核心软件均由Kvaser开发,为开发者提供稳定安全的嵌入式应用开发基础,开发门槛低、拓展灵活性强。
KEOS软件栈以LXC容器为核心构建。在本文中,我们将介绍从入门到在Kvaser Edge上运行工作应用程序的过程。
本文面向所有初次接触该设备,并希望通过部署容器开始开发应用程序的用户。同时说明如何规避设备恢复出厂设置后本地开发成果被清空的问题。
容器是系统运行的基础。在LXC架构中,容器是运行于隔离环境中的完整Linux系统。对于开发者而言,容器提供了完整的根文件系统(rootfs),拥有极高的开发自由度。根文件系统是Linux系统的核心组成部分,它具有高度的可定制性,但也更容易因配置不当导致系统损坏。网上已有多种容器镜像可供下载,KEOS在线帮助文档介绍了如何使用这类镜像配置设备。当下载容器、完成部署并进入串口终端后,只需完成SSH配置,即可开始应用开发。此时,开发者需要确定适合自身需求的应用开发方案。
Kvaser Edge提供恢复出厂设置(Factory Reset)功能,该功能强大但不可逆。与Linux统多数机制一致,恢复出厂仅执行指令,不会增加额外安全确认步骤。即删除当前容器及其中存储的全部数据,并将设备恢复至出厂状态。如果仅在设备本地完成代码编写与参数配置,所有工作成果会永久丢失。该功能在需要整机重置时十分便捷,但如果花费数周开发的应用仅存于设备本地,重置后损失极大。因此,应提前制定合理的开发策略,下面将介绍一种基础可行的开发方案。
将应用程序集成到容器中,这样,无论执行恢复出厂设置,还是将应用部署到另一台设备,仅需通过USB导入容器镜像即可完成部署。构建自定义容器有多种方式,我们建议使用适合该任务的专用构建工具链,MKOSI是我们常用工具,功能强大、逻辑清晰,不过仍需一定学习成本。
简单来说,自定义容器以标准基础镜像为基础(例如适用于ARM64的Debian Bookworm),再通过MKOSI等工具进行修改,工具所做的修改最终都会更新到根文件系统。如果仅需向容器中添加文件,可以不使用专用工具,只需解压rootfs.tar.xz,添加所需文件后重新打包即可。这是更新容器最简单、最直接的方法,多数场景下完全能够满足需求。不过,该过程仍存在一些需要注意的细节,下面结合实操案例完整演示。
常规压缩工具解压rootfs.tar.xz时,会丢失Linux文件权限、文件属主、软链接等系统关键属性,直接导致根文件系统失效。通用准则:不支持Linux权限属性的解压工具,禁止用于处理Linux根文件系统镜像。
所以本文示例将使用WSL(Windows Linux子系统)和tar来处理解压和打包。
WSL(Windows Linux子系统)是Windows提供的一项功能,可在Windows系统中直接运行完整的Linux环境,而无需安装虚拟机或配置双系统。可以将WSL理解为Windows与Linux之间的桥梁。借助WSL,无需单独安装Linux,即可:
例如,在安装WSL和Ubuntu后,可以打开Linux Shell并执行以下命令:
ls
该命令用于列出当前目录中的文件,与标准Linux系统中的用法一致。
WSL特别适用于以下场景:
简而言之,WSL使Windows用户能够直接在本机完成Linux开发。
本文示例使用WSL2。安装教程可查阅微软官方文档:https://learn.microsoft.com/en-us/windows/wsl/install.
tar是Linux通用归档命令,用于将多个文件和文件夹打包为单个归档文件。其名称来源于Tape Archive(磁带归档),最初用于磁带设备的数据备份。
可以将.tar文件类比为Windows的zip压缩包,是Linux生态主流的归档格式。
大多数Linux发行版均默认提供tar工具,安装WSL后即可直接使用。
在开始示例之前,先说明需要添加的文件及其存放位置。本示例仅向系统添加脚本和应用代码,这些文件均存放于/opt目录。该目录专门用于存放第三方附加软件。
本示例将在Kvaser Edge上部署一个简单的CAN日志记录应用(CAN Logger)。
为了降低依赖并简化示例,本次采用Shell脚本实现,共两份脚本,内容如下:
setup-can-logger.sh
#!/bin/sh
# Update package list
apt update
# Install CAN tools
apt install -y can-utils
echo "Setup complete."
echo "You can now run the CAN logger script."
该脚本用于完成设备首次启动时的初始化配置。首先更新软件包,然后安装can-utils工具集,以提供一系列CAN总线交互指令。本次示例中使用SocketCAN,该组件已内置在选用的基础容器镜像中。
在此之后,我们还需要真正执行日志采集的脚本,以下是要在设备上运行的程序代码:
can-logger.sh
#!/bin/sh
# CAN interface and bitrate
IFACE="can0"
BITRATE="250000"
# Log file location
LOG_FILE="/var/can_log.txt"
# Configure CAN interface
ip link set "$IFACE" down 2>/dev/null
ip link set "$IFACE" type can bitrate "$BITRATE"
ip link set "$IFACE" up
# Log CAN frames (one frame per line)
candump "$IFACE" >> "$LOG_FILE"
该脚本功能较为简单,可实现:
完成上述两个脚本后,即可将其添加至容器中。
在电脑打开WSL终端。WSL安装指南
创建专用工作目录,用于镜像解压、打包操作。
mkdir kvaser-edge-container
cd kvaser-edge-container
创建一个目录结构,保证文件结构整洁:
mkdir base out overlay work
完成后,目录结构如下所示:
.
├── base
├── out
├── overlay
└── work
接下来下载基础容器镜像。本文使用Kvaser Edge文档中提供的基础镜像,并通过wget命令完成下载。新的容器镜像版本会持续发布,因此下载时可能看到不同发布日期的版本。下载时,请选择对应的rootfs.tar.xz文件。
wget -P base https://images.linuxcontainers.org/images/debian/bookworm/arm64/default/20260107_05:24/rootfs.tar.xz
接下来,在overlay目录创建两份脚本文件。本文示例通过终端完成该操作,您也可以使用其他文本编辑器创建文件。如使用其他编辑器,可直接跳至目录结构部分。
touch overlay/setup-can-logger.sh overlay/can-logger.sh
打开文件并添加脚本代码。本文示例使用nano终端编辑器。
nano overlay/setup-can-logger.sh
可以直接复制脚本内容,终端内右键完成粘贴。
按Ctrl + X,输入Y,再按Enter保存并退出nano。
另一份脚本重复相同操作。
nano overlay/can-logger.sh
完成上述操作后,目录结构应如下所示:
.
├── base
│ └── rootfs.tar.xz
├── out
├── overlay
│ ├── can-logger.sh
│ └── setup-can-logger.sh
└── work
现在可开始生成修改后的Linux Root文件系统。首先,将基础rootfs解压到work目录。
mkdir work/rootfs
tar -xJf base/rootfs.tar.xz -C work/rootfs
解压完成后(该过程可能需要一些时间),根文件系统的目录结构应如下所示:
.
├── base
│ └── rootfs.tar.xz
├── out
├── overlay
│ ├── can-logger.sh
│ └── setup-can-logger.sh
└── work
└── rootfs
├── bin -> usr/bin
├── boot
├── dev
├── etc
├── home
├── lib -> usr/lib
├── media
├── mnt
├── opt
├── proc
├── root
├── run
├── sbin -> usr/sbin
├── srv
├── sys
├── tmp
├── usr
└── var
接下来,将脚本文件复制到根文件系统中。
mkdir -p work/rootfs/opt/can-logger
cp -a overlay/. work/rootfs/opt/can-logger/
最后,将根文件系统重新打包,输出至目录。
tar -C work/rootfs -cJf out/rootfs.tar.xz .
打包完成后,out目录中将生成新的rootfs.tar.xz文件。
根据文档说明,一个完整的Edge容器除rootfs.tar.xz外,还需要meta.tar.xz和container-config.yaml两个文件。
其中,meta.tar.xz可从与rootfs.tar.xz相同的下载页面获取。
wget -P out https://images.linuxcontainers.org/images/debian/bookworm/arm64/default/20260107_05:24/meta.tar.xz
随后,创建container-config.yaml文件
touch out/container-config.yaml
nano out/container-config.yaml
将以下内容复制到文件中
name: kvaser-edge-%S
interfaces:
- eth0
- mlan0
- mmlan0
users:
root:
password: root
.
├── container-config.yaml
├── meta.tar.xz
└── rootfs.tar.xz
现在,自定义容器已准备完成,可以开始部署到Kvaser Edge。
KEOS系统校验并激活容器后,设备将启动进入我们创建的自定义容器。通过串口终端登录设备,执行ls /opt/can-logger,能查看到can-logger.sh、setup-can-logger.sh两份脚本即代表配置成功。
首次运行应用程序时,请运行:
bash /opt/can-logger/setup-can-logger.sh
该命令用于初始化应用程序,并安装运行所需的软件包。
说明:Edge设备需要连接网络才能下载所需的软件包。由于此时尚未配置Wi-Fi,因此默认通过以太网连接网络。
脚本执行完成后,请运行:
bash opt/can-logger/can-logger.sh
此时,对应CAN通道的LED指示灯应保持点亮。当CAN总线上有报文传输时,LED将持续闪烁,代表脚本正常采集报文并写入/var/can_log.txt日志文件。
至此,内置CAN日志采集程序的自定义容器制作完成,该程序可将接收到的CAN报文保存至设备本地文件。
应用进阶优化的后续步骤包括:
若后续需要复杂容器定制,单纯解压打包镜像的方式易损坏文件系统,此时推荐使用MKOSI等专业构建工具链。
可通过SSH连接设备,使用scp、rsync等终端命令备份文件。也可使用GUI(图形界面)应用程序,例如WinSCP或MobaXterm。通过这些工具,用户可以直观地浏览设备上的文件,并查找与复制所需文件。