场景四:Windows PC + Ubuntu 服务器内置 Docker
本场景适用于有一台独立的 Ubuntu 服务器的开发者:在 Ubuntu 服务器上安装 Docker,使用预置好开发工具的 wukun 镜像容器进行编译,Windows PC 通过 SSH 远程连接容器进行开发。
开发板的串口线与网线都接在开发者自己的 Windows PC 上:把串口放进容器需要
--device设备映射,把 TFTP 服务放进容器需要-p 69:69/udp端口映射,且开发板与容器网络不在同一网段、tftpboot无法直达。因此本场景不在容器内使用 picocom 与 tftpd-hpa(镜像中虽已预装),烧写相关操作全部放在 Windows PC 上完成(部署方式见文末两个可选章节)。

镜像说明(wukun:docker-v1.2.0-rc2)
| 项目 | 内容 |
|---|---|
| 托管地址 | swr.cn-north-4.myhuaweicloud.com/hi_spark/wukun:docker-v1.2.0-rc2 |
| 基础系统 | Ubuntu 22.04.4 LTS |
| ARM 工具链 | arm-v01c02-linux-musleabi-gcc |
| 预装工具 | git、repo、curl、wget、picocom、tftpd-hpa、Rust 1.94、Python 3.10、CMake 3.22 |
容器创建仅映射 SSH 端口
2200:22,便于 Windows PC 远程连接。镜像预装的 picocom 与 tftpd-hpa 在本场景中不使用,烧写相关操作见文末两个可选章节。
前置要求
- Ubuntu 服务器:已安装 Ubuntu 22.04,需要 root 权限(
sudo -i或su -切换)。 - Windows PC:安装 VS Code(配合 Remote-SSH 插件)或 MobaXterm、XShell 等 SSH 客户端,用于远程连接容器。
- 文末两个可选章节需在 Windows PC 上以管理员身份运行 PowerShell(安装 OpenSSH Server、放行防火墙端口)。
第一步:在 Ubuntu 服务器上安装 Docker CE
Ubuntu 服务器终端(root)
已安装 Docker 可跳过此步。
sudo -i
apt-get install -y ca-certificates curl gnupg lsb-release
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://mirrors.huaweicloud.com/docker-ce/linux/ubuntu/gpg \
| gpg --dearmor -o /etc/apt/keyrings/docker.gpg
chmod a+r /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://mirrors.huaweicloud.com/docker-ce/linux/ubuntu \
$(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list
apt-get update -qq
apt-get install -y docker-ce docker-ce-cli containerd.io
systemctl enable docker && systemctl start docker
验证:docker info 能看到服务信息即成功。
第二步:获取镜像,创建容器
获取镜像有两种方式,任选其一:
- 方式一(推荐):直接拉取预构建镜像,开箱即用,速度快。
- 方式二:使用 Dockerfile 本地构建镜像,适用于需要定制或无法访问远程镜像仓库的场景。
方式一:拉取预构建镜像(推荐)
Ubuntu 服务器终端(root)
方式二:使用 Dockerfile 本地构建镜像
无需完整源码仓库,只需下载两个文件即可本地构建开发镜像。构建脚本会自动从华为云下载 ARM 交叉编译器和 Rust 工具链,Dockerfile 内所有网络资源均已配置国内镜像源。
Ubuntu 服务器终端(root)
# 创建构建目录
mkdir -p /root/make_docker_image && cd /root/make_docker_image
# 下载 Dockerfile 和构建脚本
curl -fSL -o Dockerfile \
"https://api.gitcode.com/api/v5/repos/HiSpark/hi_aiot_solution/raw/tools/make_docker_image/Dockerfile?ref=master"
curl -fSL -o build_docker_image.sh \
"https://api.gitcode.com/api/v5/repos/HiSpark/hi_aiot_solution/raw/tools/make_docker_image/build_docker_image.sh?ref=master"
chmod +x build_docker_image.sh
# (可选)根据需要裁剪软件包,减小镜像体积
# vi Dockerfile
# 构建镜像(默认名称 wukun:1.1.0,约需 10-20 分钟)
# 也可指定名称和版本:bash build_docker_image.sh wukun 1.1.0
bash build_docker_image.sh
构建完成后,脚本会自动在当前目录生成 wukun-1.1.0.tar 导出文件,可通过 docker load -i wukun-1.1.0.tar 导入到其他机器。
构建前提:磁盘剩余空间 30 GB 以上。
创建容器
无论使用哪种方式获取镜像,创建容器的命令相同。
Ubuntu 服务器终端(root)
# 创建开发容器(仅映射 SSH 端口 2200:22)
# 方式一用户:
docker run -d --name wukun1 --privileged \
-p 2200:22 \
swr.cn-north-4.myhuaweicloud.com/hi_spark/wukun:docker-v1.2.0-rc2
# 方式二用户(镜像名不同):
# docker run -d --name wukun1 --privileged \
# -p 2200:22 \
# wukun:1.1.0
# 放行 SSH 端口(需要 sudo 权限,按实际防火墙选择其一)
sudo ufw allow 2200/tcp
# iptables -A INPUT -p tcp --dport 2200 -j ACCEPT
第三步:Windows PC 连接容器
方式一:直接 SSH 连接容器(推荐)
容器创建后,先在服务器上进入容器开启 root 登录并设置密码:
Ubuntu 服务器终端(root)
容器内执行:
sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config
passwd root # 自行设定 root 密码
service ssh restart
exit
随后在 Windows PC 上用 SSH 工具直连容器,连接信息:
| 配置项 | 值 |
|---|---|
| 主机 / Host | Ubuntu 服务器 IP(如 192.168.81.182) |
| 端口 / Port | 2200 |
| 用户名 | root |
| 密码 | 上一步设置的 root 密码 |
VS Code Remote-SSH(推荐)
- 在 VS Code 扩展市场搜索并安装 Remote - SSH 插件。
- 按
Ctrl+Shift+P,输入Remote-SSH: Connect to Host,回车。 -
输入连接命令:
-
输入 root 密码,连接成功后点击左侧「打开文件夹」即可开始开发。
VS Code 首次连接会在容器内自动安装 VS Code Server,需要几分钟,保持网络畅通。
MobaXterm / XShell
新建 SSH 会话,主机填 <服务器IP>,端口 2200,用户名 root,输入密码即可连接。
方式二:先 SSH 到服务器再进入容器
也可先用 SSH 连到 Ubuntu 服务器(ssh root@<服务器IP>),再执行:
常用命令
Ubuntu 服务器终端(root)
| 操作 | 命令 |
|---|---|
| 进入容器 | docker exec -it wukun1 bash |
| 启动容器 | docker start wukun1 |
| 停止容器 | docker stop wukun1 |
| 重启容器 | docker restart wukun1 |
| 查看容器状态 | docker ps |
| 查看容器日志 | docker logs wukun1 |
| 重启 Docker 守护进程 | systemctl restart docker |
可选:在 Windows PC 上部署 TFTP server(tftpd64)
为开发板提供烧写镜像:把编译产物(U-Boot / 内核 / 根文件系统等)放入 Windows PC 的 TFTP 目录,开发板 U-Boot 通过网线用 tftpboot 命令直接下载并烧写,免去 TF 卡来回插拔或串口传文件。仅基础编译不需要本章,可在需要网络烧写时再配置。
对后续在服务器上使用 Agent 的帮助:TFTP 就绪后,烧写镜像只需出现在 Windows PC 的 TFTP 目录即可供开发板 tftpboot 下载烧写;配合下一章的 OpenSSH Server,运行在容器内的 AI Agent 可在编译完成后自动把镜像下发到该目录,实现「编译 → 下发镜像 → 烧写 → 串口观察 → 修复」的自动化闭环。
1. 安装并配置 tftpd64
在 Windows PC 上:
- 从 tftpd64 官网 下载 tftpd64 portable edition(zip 免安装版),解压到任意目录(如
D:\tftpd64)。 - 运行
tftpd64.exe,点击 Settings,在 GLOBAL 页签将 Base Directory 设为镜像存放目录(本文以D:\tftp为例)。 -
在 PowerShell(管理员) 中放行 UDP 69 端口:
portable 版不会开机自启,每次使用前需确认 tftpd64 正在运行。开发板需与 Windows PC 同网段(网线直连或接同一交换机),PC 的有线网卡 IP 可用
ipconfig查看。
2. 放置镜像
从容器把编译产物复制到 Windows PC 的 TFTP 目录(需先按下一章开启 OpenSSH Server),在 容器内 执行:
也可用 U 盘、共享目录等任意方式把文件放进 D:\tftp。
3. 开发板下载烧写
重启开发板(按复位键后 1~2s 内按回车进入 U-Boot 命令行):
setenv ethaddr 00:5e:4d:0e:d2:b1
setenv serverip 192.168.1.2 # 本地PC IP,根据实际填写
setenv ipaddr 192.168.1.10 # 开发板 IP,与 PC 同网段即可
tftpboot <加载地址> <镜像文件>
出现 # 递增的传输进度并提示传输成功,即表示 TFTP server 工作正常,随后即可按 U-Boot 流程烧写(加载地址、文件名按芯片手册与实际产物调整)。
开发板已进入 Linux 时,也可在开发板命令行执行
tftp -g -r <文件名> <Windows PC IP>验证 TFTP 连通性。
可选:在 Windows PC 上开启 OpenSSH Server(供容器 Agent 远程烧写)
开启后,容器(以及运行其内的 AI Agent)可通过 ssh / scp 远程操作 Windows PC:下发编译产物到 TFTP 目录、向开发板串口发送 U-Boot 命令并观察输出,无需人工在两台机器间搬运文件。
对后续在服务器上使用 Agent 的帮助:与上一章的 TFTP server 配合,运行在容器内的 AI Agent 可直接完成「编译 → scp 下发镜像到 D:\tftp → 远程串口触发 tftpboot → 观察烧写结果 → 修复」的全流程闭环,全程无需人工中转。
1. 安装并启动 OpenSSH Server
在 PowerShell(管理员) 中执行(Windows 10 1809+ / Windows 11 内置该可选功能):
# 安装 OpenSSH Server
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
# 启动并设为开机自启
Start-Service sshd
Set-Service -Name sshd -StartupType Automatic
若
Add-WindowsCapability卡住或下载失败,改用 DISM 命令:安装时通常会自动创建防火墙规则
OpenSSH-Server-In-TCP(放行 TCP 22)。若无法连接,手动放行:
2. 从容器验证
在 容器内 执行(<Windows用户名> 为 Windows 登录账户名,密码为该账户的登录密码):
ssh <Windows用户名>@<Windows PC IP>
# 首次连接输入 yes 确认主机指纹,再输入 Windows 账户密码,出现 Windows 命令提示符即成功
exit
# 验证镜像下发(写入 TFTP 目录)
scp <编译输出目录>/<镜像文件> <Windows用户名>@<Windows PC IP>:"D:/tftp/"
3. Agent 远程触发烧写(串口命令)
开发板 USB 串口线插在 Windows PC 上,在设备管理器「端口 (COM 和 LPT)」中确认 COM 号(如 COM3,CH340 / CH343 / CP210x 芯片需先安装对应驱动;官方板 J1318 调试口为 CH343P,Win10/11 自带 USB CDC 驱动通常无需额外安装)。
在 Windows PC 上把以下内容保存为 C:\tools\uboot_cmd.ps1(向串口发送一条 U-Boot 命令并等待返回输出,PowerShell 内置 .NET SerialPort 实现,无需安装额外工具):
param([string]$Cmd = "help", [string]$ComPort = "COM3", [int]$WaitSec = 10)
$p = New-Object System.IO.Ports.SerialPort($ComPort, 115200)
$p.Open()
$p.WriteLine("setenv ethaddr 12:34:56:78:9A:BC") # 临时 MAC 地址
Start-Sleep -Seconds 1
$p.WriteLine("setenv ipaddr 192.168.137.10") # 填写实际板端ip
Start-Sleep -Seconds 1
$p.WriteLine("setenv serverip 192.168.137.1") # 填写实际主机PC ip
Start-Sleep -Seconds 1
$p.WriteLine($Cmd)
Start-Sleep -Seconds $WaitSec
$p.ReadExisting()
$p.Close()
之后,运行在容器内的 Agent 即可通过 SSH 远程触发烧写并观察输出,注意,需要先进入板端的uboot命令行(重启开发板,按复位键后 1~2s 内按回车进入 U-Boot 命令行):
ssh <Windows用户名>@<Windows PC IP> "powershell -ExecutionPolicy Bypass -File C:\tools\uboot_cmd.ps1 -Cmd 'tftpboot <加载地址> <镜像文件>' -WaitSec 30"
人工观察串口可直接在 Windows PC 上使用 PuTTY 图形界面连接对应 COM 口;脚本与 PuTTY 不能同时占用同一串口,请错开使用。
常见问题
| 现象 | 原因 / 解决 |
|---|---|
| Docker 未启动 | systemctl start docker && docker info |
SSH 连接报 REMOTE HOST IDENTIFICATION HAS CHANGED / 密码框不弹出直接 Permission denied |
容器重建过(或该端口之前连接过别的主机),sshd 主机密钥变了;在 Windows PowerShell 执行 ssh-keygen -R "[<服务器IP>]:2200" 清除旧记录后重连 |
连接超时 / Connection refused |
按顺序检查:容器正在运行(docker ps)、端口映射(docker port wukun1 应包含 0.0.0.0:2200 -> 22/tcp)、容器内 sshd 已启动(docker exec wukun1 service ssh start)、服务器防火墙放行 2200(ufw status) |
| 密码错误 | 在服务器上执行 docker exec -it wukun1 passwd root 重新设置 |
ssh <Windows PC IP> 连接失败 |
在 Windows 上执行 Get-Service sshd 确认服务已启动;防火墙放行 TCP 22(见「Windows PC 开启 OpenSSH Server」一节) |
开发板 tftpboot 一直超时(T T T) |
按顺序检查:tftpd64 是否正在运行、Windows 防火墙是否放行 UDP 69、开发板与 PC 是否同网段、serverip 是否为 Windows PC 的 IP(见「Windows PC 上部署 TFTP server」一节) |
| Windows 设备管理器看不到串口 | 安装 USB 转串口驱动(CH340 / CH343 / CP210x 等;官方板 J1318 调试口为 CH343P,Win10/11 自带 USB CDC 驱动),重新插拔后确认 COM 号 |
U-Boot tftp 报 ethaddr not set |
执行 setenv ethaddr 00:11:22:33:44:55; saveenv |