<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Kvaser Edge归档 - Kvaser</title>
	<atom:link href="https://www.kvaser.cn/support/developer-blog/tag/kvaser-edge/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.kvaser.cn/support/developer-blog/tag/kvaser-edge/</link>
	<description>先进的CAN总线解决方案专家</description>
	<lastBuildDate>Fri, 14 Aug 2026 09:16:34 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://www.kvaser.cn/wp-content/uploads/2024/06/favicon-3.ico</url>
	<title>Kvaser Edge归档 - Kvaser</title>
	<link>https://www.kvaser.cn/support/developer-blog/tag/kvaser-edge/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Kvaser Edge嵌入式系统开发｜如何复用容器快速构建开发工作流</title>
		<link>https://www.kvaser.cn/developer-blog/edge-the-hello-world-application/</link>
		
		<dc:creator><![CDATA[Kvaser Marketing]]></dc:creator>
		<pubDate>Mon, 30 Mar 2026 07:44:11 +0000</pubDate>
				<guid isPermaLink="false">https://www.kvaser.cn/?post_type=developer_blog&#038;p=1011707718</guid>

					<description><![CDATA[<p>The post <a href="https://www.kvaser.cn/developer-blog/edge-the-hello-world-application/">Kvaser Edge嵌入式系统开发｜如何复用容器快速构建开发工作流</a> appeared first on <a href="https://www.kvaser.cn">Kvaser</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wpb-content-wrapper"><div class="vc_row wpb_row vc_row-fluid"><div class="wpb_column vc_column_container vc_col-sm-12"><div class="vc_column-inner"><div class="wpb_wrapper">
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<h4>背景：</h4>
<p>Kvaser Edge是一款嵌入式Linux平台，集成了CAN硬件及以太网、Wi-Fi、USB等接口。设备硬件与核心软件均由Kvaser开发，为开发者提供稳定安全的嵌入式应用开发基础，开发门槛低、拓展灵活性强。</p>
<p>KEOS软件栈以LXC容器为核心构建。在本文中，我们将介绍从入门到在Kvaser Edge上运行工作应用程序的过程。</p>
<p>本文面向所有初次接触该设备，并希望通过部署容器开始开发应用程序的用户。同时说明如何规避设备恢复出厂设置后本地开发成果被清空的问题。</p>

		</div>
	</div>

	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<h4>容器与根文件系统：</h4>
<p>容器是系统运行的基础。在LXC架构中，容器是运行于隔离环境中的完整Linux系统。对于开发者而言，容器提供了完整的根文件系统（rootfs），拥有极高的开发自由度。根文件系统是Linux系统的核心组成部分，它具有高度的可定制性，但也更容易因配置不当导致系统损坏。网上已有多种容器镜像可供下载，<a href="https://kvaser.com/keos-webhelp/latest/">KEOS在线帮助文档</a>介绍了如何使用这类镜像配置设备。当下载容器、完成部署并进入串口终端后，只需完成SSH配置，即可开始应用开发。此时，开发者需要确定适合自身需求的应用开发方案。</p>

		</div>
	</div>

	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<h4>容器与恢复出厂设置：</h4>
<p>Kvaser Edge提供恢复出厂设置（Factory Reset）功能，该功能强大但不可逆。与Linux统多数机制一致，恢复出厂仅执行指令，不会增加额外安全确认步骤。即删除当前容器及其中存储的全部数据，并将设备恢复至出厂状态。如果仅在设备本地完成代码编写与参数配置，所有工作成果会永久丢失。该功能在需要整机重置时十分便捷，但如果花费数周开发的应用仅存于设备本地，重置后损失极大。因此，应提前制定合理的开发策略，下面将介绍一种基础可行的开发方案。</p>

		</div>
	</div>

	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<h4>更新rootfs.tar.xz：</h4>
<p>将应用程序集成到容器中，这样，无论执行恢复出厂设置，还是将应用部署到另一台设备，仅需通过USB导入容器镜像即可完成部署。构建自定义容器有多种方式，我们建议使用适合该任务的专用构建工具链，MKOSI是我们常用工具，功能强大、逻辑清晰，不过仍需一定学习成本。</p>
<p>简单来说，自定义容器以标准基础镜像为基础（例如适用于ARM64的Debian Bookworm），再通过MKOSI等工具进行修改，工具所做的修改最终都会更新到根文件系统。如果仅需向容器中添加文件，可以不使用专用工具，只需解压rootfs.tar.xz，添加所需文件后重新打包即可。这是更新容器最简单、最直接的方法，多数场景下完全能够满足需求。不过，该过程仍存在一些需要注意的细节，下面结合实操案例完整演示。</p>

		</div>
	</div>

	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<h4>解压与重新打包：</h4>
<p>常规压缩工具解压rootfs.tar.xz时，会丢失Linux文件权限、文件属主、软链接等系统关键属性，直接导致根文件系统失效。通用准则：不支持Linux权限属性的解压工具，禁止用于处理Linux根文件系统镜像。</p>
<p>所以本文示例将使用WSL（Windows Linux子系统）和tar来处理解压和打包。</p>

		</div>
	</div>

	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<h4>什么是WSL？</h4>
<p>WSL（Windows Linux子系统）是Windows提供的一项功能，可在Windows系统中直接运行完整的Linux环境，而无需安装虚拟机或配置双系统。可以将WSL理解为Windows与Linux之间的桥梁。借助WSL，无需单独安装Linux，即可：</p>
<ul>
<li>在Windows中打开Linux终端（例如Ubuntu）</li>
<li>使用常见的Linux工具，如bash、ssh、grep、git等</li>
<li>运行基于Linux的开发环境和工作流。</li>
</ul>
<p>例如，在安装WSL和Ubuntu后，可以打开Linux Shell并执行以下命令：</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-c">ls
</code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>该命令用于列出当前目录中的文件，与标准Linux系统中的用法一致。</p>
<p>WSL特别适用于以下场景：</p>
<ul>
<li>使用Linux服务器的开发人员</li>
<li>主要针对Linux构建的开源工具</li>
<li>嵌入式开发、后端开发以及DevOps工作流。</li>
</ul>
<p>简而言之，WSL使Windows用户能够直接在本机完成Linux开发。</p>
<p>本文示例使用WSL2。安装教程可查阅微软官方文档：<a href="https://learn.microsoft.com/en-us/windows/wsl/install"><strong>https://learn.microsoft.com/en-us/windows/wsl/install</strong></a>.</p>

		</div>
	</div>

	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<h4>什么是tar？</h4>
<p>tar是Linux通用归档命令，用于将多个文件和文件夹打包为单个归档文件。其名称来源于Tape Archive（磁带归档），最初用于磁带设备的数据备份。</p>
<p>可以将.tar文件类比为Windows的zip压缩包，是Linux生态主流的归档格式。</p>
<p>大多数Linux发行版均默认提供tar工具，安装WSL后即可直接使用。</p>

		</div>
	</div>

	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<h4>示例代码及存放位置：</h4>
<p>在开始示例之前，先说明需要添加的文件及其存放位置。本示例仅向系统添加脚本和应用代码，这些文件均存放于/opt目录。该目录专门用于存放第三方附加软件。</p>

		</div>
	</div>

	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<h4>示例：</h4>
<p>本示例将在Kvaser Edge上部署一个简单的CAN日志记录应用（CAN Logger）。</p>
<p>为了降低依赖并简化示例，本次采用Shell脚本实现，共两份脚本，内容如下：</p>

		</div>
	</div>

	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p><strong>setup-can-logger.sh</strong></p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-c">#!/bin/sh

# Update package list
apt update

# Install CAN tools
apt install -y can-utils

echo &quot;Setup complete.&quot;
echo &quot;You can now run the CAN logger script.&quot;</code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>该脚本用于完成设备首次启动时的初始化配置。首先更新软件包，然后安装can-utils工具集，以提供一系列CAN总线交互指令。本次示例中使用SocketCAN，该组件已内置在选用的基础容器镜像中。</p>
<p>在此之后，我们还需要真正执行日志采集的脚本，以下是要在设备上运行的程序代码：</p>

		</div>
	</div>

	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p><strong>can-logger.sh</strong></p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-c">#!/bin/sh

# CAN interface and bitrate
IFACE=&quot;can0&quot;
BITRATE=&quot;250000&quot;

# Log file location
LOG_FILE=&quot;/var/can_log.txt&quot;

# Configure CAN interface
ip link set &quot;$IFACE&quot; down 2&gt;/dev/null
ip link set &quot;$IFACE&quot; type can bitrate &quot;$BITRATE&quot;
ip link set &quot;$IFACE&quot; up

# Log CAN frames (one frame per line)
candump &quot;$IFACE&quot; &gt;&gt; &quot;$LOG_FILE&quot;</code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>该脚本功能较为简单，可实现：</p>
<ul>
<li>将CAN接口初始化为250 kbit/s</li>
<li>将接收到的CAN报文持续写入日志文件</li>
</ul>
<p>完成上述两个脚本后，即可将其添加至容器中。</p>
<p>在电脑打开WSL终端。WSL<a href="https://learn.microsoft.com/en-us/windows/wsl/install">安装指南</a></p>
<p>创建专用工作目录，用于镜像解压、打包操作。</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-c">mkdir kvaser-edge-container
cd kvaser-edge-container</code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>创建一个目录结构，保证文件结构整洁：</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-c">mkdir base out overlay work
</code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>完成后，目录结构如下所示：</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-c">.
├── base
├── out
├── overlay
└── work</code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>接下来下载基础容器镜像。本文使用Kvaser Edge文档中提供的基础镜像，并通过<strong>wget</strong>命令完成下载。新的容器镜像版本会持续发布，因此下载时可能看到不同发布日期的版本。下载时，请选择对应的<strong>rootfs.tar.xz</strong>文件。</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-c">wget -P base https://images.linuxcontainers.org/images/debian/bookworm/arm64/default/20260107_05:24/rootfs.tar.xz
</code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>接下来，在overlay目录创建两份脚本文件。本文示例通过终端完成该操作，您也可以使用其他文本编辑器创建文件。如使用其他编辑器，可直接跳至目录结构部分。</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-c">touch overlay/setup-can-logger.sh overlay/can-logger.sh
</code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>打开文件并添加脚本代码。本文示例使用nano终端编辑器。</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-c">nano overlay/setup-can-logger.sh
</code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>可以直接复制脚本内容，终端内右键完成粘贴。</p>
<p>按<strong>Ctrl + X</strong>，输入<strong>Y</strong>，再按<strong>Enter</strong>保存并退出<strong>nano</strong>。</p>
<p>另一份脚本重复相同操作。</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-c">nano overlay/can-logger.sh
</code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<h4>目录结构</h4>
<p>完成上述操作后，目录结构应如下所示：</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-c">.
├── base
│	└── rootfs.tar.xz
├── out
├── overlay
│	├── can-logger.sh
│	└── setup-can-logger.sh
└── work</code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>现在可开始生成修改后的Linux Root文件系统。首先，将基础rootfs解压到work目录。</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-c">mkdir work/rootfs
tar -xJf base/rootfs.tar.xz -C work/rootfs</code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>解压完成后（该过程可能需要一些时间），根文件系统的目录结构应如下所示：</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-c">.
├── base
│	└── rootfs.tar.xz
├── out
├── overlay
│	├── can-logger.sh
│	└── setup-can-logger.sh
└── work
    └── rootfs
         ├── bin -&gt; usr/bin
         ├── boot
         ├── dev
         ├── etc
         ├── home
         ├── lib -&gt; usr/lib
         ├── media
         ├── mnt
         ├── opt
         ├── proc
         ├── root
         ├── run
         ├── sbin -&gt; usr/sbin
         ├── srv
         ├── sys
         ├── tmp
         ├── usr
         └── var</code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>接下来，将脚本文件复制到根文件系统中。</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-c">mkdir -p work/rootfs/opt/can-logger
cp -a overlay/. work/rootfs/opt/can-logger/</code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>最后，将根文件系统重新打包，输出至目录。</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-c">tar -C work/rootfs -cJf out/rootfs.tar.xz .
</code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>打包完成后，out目录中将生成新的rootfs.tar.xz文件。</p>
<p>根据文档说明，一个完整的Edge容器除rootfs.tar.xz外，还需要meta.tar.xz和container-config.yaml两个文件。</p>
<p>其中，meta.tar.xz可从与rootfs.tar.xz相同的下载页面获取。</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-c">wget -P out https://images.linuxcontainers.org/images/debian/bookworm/arm64/default/20260107_05:24/meta.tar.xz
</code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>随后，创建container-config.yaml文件</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-c">touch out/container-config.yaml
nano out/container-config.yaml</code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>将以下内容复制到文件中</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-c">name: kvaser-edge-%S
interfaces:
       - eth0
       - mlan0
       - mmlan0
users:
     root:
         password: root</code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>按Ctrl + X，输入Y，再按Enter保存并退出nano。</p>
<p>这是一个最小化的容器配置示例。如需了解容器配置文件的详细内容，请参阅<a href="https://kvaser.com/keos-webhelp/latest/guides/getting_started/#container-definition"><strong>WebHelp</strong></a>文档。</p>
<p>完成后，out目录的结构如下所示：</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-c">.
├── container-config.yaml
├── meta.tar.xz
└── rootfs.tar.xz</code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>现在，自定义容器已准备完成，可以开始部署到Kvaser Edge。</p>
<ul>
<li>对Edge设备执行恢复出厂设置。<strong>该操作将删除设备上的所有数据。</strong>请确保已将所有希望保留的文件从设备中复制出来。有关文件导出方法，请参阅附录“备份”。</li>
<li>将Edge设备通过USB连接至计算机。</li>
<li>将<strong>out/</strong>目录中的所有文件复制到Edge设备的<strong>container/</strong>目录。</li>
<li>使用“安全移除硬件和弹出媒体”功能，从计算机中安全移除设备。</li>
<li>将设备断电重启</li>
</ul>
<p>KEOS系统校验并激活容器后，设备将启动进入我们创建的自定义容器。通过串口终端登录设备，执行<strong>ls /opt/can-logger</strong>，能查看到<strong>can-logger.sh、setup-can-logger.sh</strong>两份脚本即代表配置成功。</p>
<p>首次运行应用程序时，请运行：</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-c">bash /opt/can-logger/setup-can-logger.sh
</code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>该命令用于初始化应用程序，并安装运行所需的软件包。</p>
<p><strong>说明：Edge设备需要连接网络才能下载所需的软件包。由于此时尚未配置Wi-Fi，因此默认通过以太网连接网络。</strong></p>
<p>脚本执行完成后，请运行：</p>

		</div>
	</div>
<pre class="code-toolbar1 code-wrapper line-numbers"><code class="language-c">bash opt/can-logger/can-logger.sh
</code></pre>
	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>此时，对应CAN通道的LED指示灯应保持点亮。当CAN总线上有报文传输时，LED将持续闪烁，代表脚本正常采集报文并写入<strong>/var/can_log.txt</strong>日志文件。</p>
<p>至此，内置CAN日志采集程序的自定义容器制作完成，该程序可将接收到的CAN报文保存至设备本地文件。</p>
<p>应用进阶优化的后续步骤包括：</p>
<ul>
<li>实现文件轮转与数据分块存储</li>
<li>创建并配置系统服务，实现脚本开机自启与进程管理</li>
<li>拓展初始化脚本，添加更多配置与依赖下载，简化启动流程</li>
<li>通过设备上的按键实现日志记录的启动与停止控制</li>
<li>利用设备上的自定义LED指示灯增加状态显示功能</li>
<li>配置Wi-Fi远程连接，支持日志文件远程上传/下载</li>
</ul>

		</div>
	</div>

	<div class="wpb_text_column wpb_content_element" >
		<div class="wpb_wrapper">
			<p>若后续需要复杂容器定制，单纯解压打包镜像的方式易损坏文件系统，此时推荐使用MKOSI等专业构建工具链。</p>
<h4><strong>附录：备份</strong></h4>
<p>可通过SSH连接设备，使用<strong>scp、rsync</strong>等终端命令备份文件。也可使用GUI（图形界面）应用程序，例如WinSCP或MobaXterm。通过这些工具，用户可以直观地浏览设备上的文件，并查找与复制所需文件。</p>

		</div>
	</div>
</div></div></div></div>
</div><p>The post <a href="https://www.kvaser.cn/developer-blog/edge-the-hello-world-application/">Kvaser Edge嵌入式系统开发｜如何复用容器快速构建开发工作流</a> appeared first on <a href="https://www.kvaser.cn">Kvaser</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
