跳转至

场景四: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 在本场景中不使用,烧写相关操作见文末两个可选章节。


前置要求

  1. Ubuntu 服务器:已安装 Ubuntu 22.04,需要 root 权限(sudo -isu - 切换)。
  2. Windows PC:安装 VS Code(配合 Remote-SSH 插件)或 MobaXterm、XShell 等 SSH 客户端,用于远程连接容器。
  3. 文末两个可选章节需在 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)

# 拉取镜像(需要几分钟,失败可重试)
docker pull swr.cn-north-4.myhuaweicloud.com/hi_spark/wukun:docker-v1.2.0-rc2

方式二:使用 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)

docker exec -it wukun1 bash

容器内执行:

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(推荐)

  1. 在 VS Code 扩展市场搜索并安装 Remote - SSH 插件。
  2. Ctrl+Shift+P,输入 Remote-SSH: Connect to Host,回车。
  3. 输入连接命令:

    ssh root@<服务器IP> -p 2200
    
  4. 输入 root 密码,连接成功后点击左侧「打开文件夹」即可开始开发。

VS Code 首次连接会在容器内自动安装 VS Code Server,需要几分钟,保持网络畅通。

MobaXterm / XShell

新建 SSH 会话,主机填 <服务器IP>,端口 2200,用户名 root,输入密码即可连接。

方式二:先 SSH 到服务器再进入容器

也可先用 SSH 连到 Ubuntu 服务器(ssh root@<服务器IP>),再执行:

docker exec -it wukun1 bash

常用命令

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 上:

  1. tftpd64 官网 下载 tftpd64 portable edition(zip 免安装版),解压到任意目录(如 D:\tftpd64)。
  2. 运行 tftpd64.exe,点击 Settings,在 GLOBAL 页签将 Base Directory 设为镜像存放目录(本文以 D:\tftp 为例)。
  3. PowerShell(管理员) 中放行 UDP 69 端口:

    New-NetFirewallRule -DisplayName "TFTP" -Direction Inbound -Protocol UDP -LocalPort 69 -Action Allow
    

portable 版不会开机自启,每次使用前需确认 tftpd64 正在运行。开发板需与 Windows PC 同网段(网线直连或接同一交换机),PC 的有线网卡 IP 可用 ipconfig 查看。

2. 放置镜像

从容器把编译产物复制到 Windows PC 的 TFTP 目录(需先按下一章开启 OpenSSH Server),在 容器内 执行:

scp <编译输出目录>/<镜像文件> <Windows用户名>@<Windows PC IP>:"D:/tftp/"
# 如 u-boot.bin、uImage 等,以实际产物为准

也可用 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 命令:

dism /Online /Add-Capability /CapabilityName:OpenSSH.Server~~~~0.0.1.0

安装时通常会自动创建防火墙规则 OpenSSH-Server-In-TCP(放行 TCP 22)。若无法连接,手动放行:

New-NetFirewallRule -DisplayName "OpenSSH Server (sshd)" -Direction Inbound -Protocol TCP -LocalPort 22 -Action Allow

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