跳转至

场景二:Windows PC + Ubuntu 服务器(无 Docker)

本场景适用于有一台独立的 Ubuntu 服务器的开发者:编译环境直接装在 Ubuntu 服务器上,Windows PC 仅作远程客户端,通过 SSH 连接服务器进行开发。

Ubuntu 服务器通常为团队共享环境,并非每个开发者都有 root 权限,因此本场景不在服务器上部署 picocom 串口工具与 TFTP server:串口连接、镜像下发等烧写相关操作全部放在开发者自己的 Windows PC 上完成(部署方式见文末两个可选章节)。

场景二架构


开发环境说明

本场景最终提供(安装在 Ubuntu 服务器上):

  • ARM 交叉编译器(arm-v01c02-linux-musleabi-gcc,GCC 10.3.0)
  • 嵌入式辅助工具(device-tree-compiler、mtd-utils、fw_printenv/fw_setenv)
  • Python 工具包(含 openpyxl、pdfplumber 等文档解析库,PyGObject/dbus-python)
  • 可选:Rust 工具链(编译 zeroclaw 案例时需要,见文末可选章节)
  • 可选:Windows PC 侧 TFTP server(tftpd64,为开发板提供网络烧写镜像,见文末可选章节)
  • 可选:Windows PC 侧 OpenSSH Server(供运行在服务器上的 AI Agent 通过 SSH 远程操作 Windows PC 完成烧写,见文末可选章节)

后两项配合使用,可让运行在 Ubuntu 服务器上的 AI Agent 在编译完成后自动把镜像下发到 Windows PC 并远程触发烧写,实现「编译 → 下发镜像 → 烧写 → 串口观察 → 修复」的自动化闭环(详见文末两章)。


前置要求

  1. Ubuntu 服务器:已安装 Ubuntu 22.04,需要 root 权限(sudo -isu - 切换)。
  2. Windows PC:安装 VS Code(配合 Remote-SSH 插件)或 MobaXterm、XShell 等 SSH 客户端,用于远程连接服务器。
  3. ARM 交叉编译器在步骤二中由命令自动从 gitcode 下载,无需手动准备。
  4. 文末两个可选章节需在 Windows PC 上以管理员身份运行 PowerShell(安装 OpenSSH Server、放行防火墙端口)。

第一步:Windows PC 远程连接服务器

在 Windows PC 上用任意 SSH 工具连接 Ubuntu 服务器:

VS Code Remote-SSH(推荐)

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

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

MobaXterm / XShell

  • 新建 SSH 会话,主机填 <服务器IP>,用户名 root,端口 22,连接即可。

后续所有标注「Ubuntu 服务器终端(root)」的命令,均在远程 SSH 连接后的终端中执行。


第二步:在 Ubuntu 服务器上配置开发环境(5 步)

切换到 root 身份后,以下命令均在 Ubuntu 服务器终端(root) 内执行,逐段复制粘贴运行。耗时约 20~40 分钟(主要为 apt 下载),请勿关闭窗口。

sudo -i

第 1 步:配置华为云 apt 源

cp /etc/apt/sources.list /etc/apt/sources.list.bak 2>/dev/null || true
sed -i "s@http://archive.ubuntu.com@http://mirrors.huaweicloud.com@g"  /etc/apt/sources.list
sed -i "s@http://security.ubuntu.com@http://mirrors.huaweicloud.com@g" /etc/apt/sources.list
apt-get update -q

若 apt-get update 报 DNS 错误,先执行:

rm -f /etc/resolv.conf
printf 'nameserver 8.8.8.8\nnameserver 114.114.114.114\n' > /etc/resolv.conf
再重新运行上面的 apt-get update

第 2 步:安装系统依赖(约 1~2 GB,耗时较长)

export DEBIAN_FRONTEND=noninteractive
apt-get install -y \
    apt-utils make \
    libc6-i386 lib32z1 lib32stdc++6 \
    zlib1g-dev liblzo2-dev rename pigz \
    libncurses5-dev libncursesw5-dev ncurses-term \
    ffmpeg autopoint g++ u-boot-tools texinfo gawk \
    libssl-dev openssl bc p7zip-full gperf \
    bison flex diffutils git git-lfs openssh-client unzip \
    libffi-dev libtool libfreetype6 dos2unix \
    uuid-dev pkg-config automake texlive unrar \
    vim sudo curl wget po4a fakeroot \
    python3-pip cmake ninja-build meson \
    libmpc-dev net-tools iputils-ping \
    device-tree-compiler mtd-utils libubootenv-tool \
    python3-gi python3-dbus gir1.2-glib-2.0
apt-get clean
git lfs install --system

第 3 步:基础系统配置

echo "dash dash/sh boolean false" | debconf-set-selections
dpkg-reconfigure dash -u 2>/dev/null || true
printf '' > /etc/ld.so.preload
ln -sf /usr/bin/python3 /usr/bin/python 2>/dev/null || true

第 4 步:安装 Python 工具包

pip3 install -q -i https://repo.huaweicloud.com/repository/pypi/simple \
    wheel pycryptodome pyelftools cryptography kconfiglib requests \
    openpyxl pdfplumber

第 5 步:下载并安装 ARM 交叉编译器(arm-v01c02,GCC 10.3.0)

工具链托管在 gitcode LFS,需先取 LFS 指针再经 batch API 拿临时下载链接(约 88 MB),解压后执行官方安装脚本即可:

# 1. 下载工具链压缩包(约 88 MB)
POINTER=$(curl -sL "https://gitcode.com/api/v5/repos/HiSpark/Hi3516CV610/raw/prebuilts/gcc-10.3-arm-musl-x86-linux-26.06.1-codesize.tgz?ref=main")
OID=$(echo "$POINTER" | grep -oE 'oid sha256:[a-f0-9]+' | cut -d: -f2)
SIZE=$(echo "$POINTER" | grep -oE 'size [0-9]+' | awk '{print $2}')
DL_URL=$(curl -s -X POST 'https://gitcode.com/HiSpark/Hi3516CV610.git/info/lfs/objects/batch' \
    -H 'Content-Type: application/vnd.git-lfs+json' \
    -d "{\"operation\":\"download\",\"objects\":[{\"oid\":\"$OID\",\"size\":$SIZE}]}" \
    | grep -oE '"href":"[^"]*"' | head -1 | sed 's/"href":"//;s/"$//' | sed 's/\\u0026/\&/g')
wget -O /tmp/gcc-toolchain.tgz "$DL_URL"

# 2. 解压并执行官方安装脚本(安装到 /opt/linux/x86-arm,自动配置 PATH 到 /etc/profile)
mkdir -p /opt/toolchains
tar -xzf /tmp/gcc-toolchain.tgz -C /opt/toolchains/
cd /opt/toolchains/gcc-10.3-arm-musl-x86-linux-26.06.1
bash install_gcc_toolchain.sh
cd ~ && rm -f /tmp/gcc-toolchain.tgz
source /etc/profile

# 验证(应输出 arm-v01c02-linux-musleabi-gcc 10.3.0)
arm-v01c02-linux-musleabi-gcc --version

可选:安装 Rust 工具链

编译 zeroclaw 案例时需要 Rust。linker 指向已安装的 arm-v01c02 gcc,在 Ubuntu 服务器终端(root) 内执行:

export CARGO_HOME=/root/.cargo
export RUSTUP_HOME=/root/.rustup
export RUSTUP_DIST_SERVER=https://repo.huaweicloud.com/rustup
export RUSTUP_UPDATE_ROOT=https://repo.huaweicloud.com/rustup/rustup
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | \
    sh -s -- -y --no-modify-path --default-toolchain stable
source /root/.cargo/env
rustup target add armv7-unknown-linux-musleabi

# toolchain 安装路径由 install_gcc_toolchain.sh 决定,默认 /opt/linux/x86-arm
TOOLCHAIN_BIN="/opt/linux/x86-arm/gcc-10.3-arm-musl-x86-linux-26.06.1/arm-v01c02-linux-musleabi-gcc/bin"
TOOLCHAIN_GCC="${TOOLCHAIN_BIN}/arm-v01c02-linux-musleabi-gcc"
cat > /root/.cargo/config.toml << EOF
[target.arm-unknown-linux-musleabi]
linker = "${TOOLCHAIN_GCC}"

[target.armv7-unknown-linux-musleabi]
linker = "${TOOLCHAIN_GCC}"
EOF

# rustup --no-modify-path 安装,需手动加 PATH
cat > /etc/profile.d/rust-path.sh << 'EOF'
export PATH=/root/.cargo/bin:$PATH
EOF
chmod 755 /etc/profile.d/rust-path.sh

grep -qF 'source /etc/profile' /root/.bashrc 2>/dev/null || \
    echo 'if [ -f /etc/profile ]; then source /etc/profile; fi' >> /root/.bashrc

若华为云镜像不可用导致安装超时,改用官方源:unset RUSTUP_DIST_SERVER RUSTUP_UPDATE_ROOT


可选:在 Windows PC 上部署 TFTP server(tftpd64)

为开发板提供烧写镜像:把编译产物(U-Boot / 内核 / 根文件系统等)放入 Windows PC 的 TFTP 目录,开发板 U-Boot 通过网线用 tftpboot 命令直接下载并烧写,免去 TF 卡来回插拔或串口传文件。仅基础编译不需要本章,可在需要网络烧写时再配置。

对后续在服务器上使用 Agent 的帮助:TFTP 就绪后,烧写镜像只需出现在 Windows PC 的 TFTP 目录即可供开发板 tftpboot 下载烧写;配合下一章的 OpenSSH Server,运行在 Ubuntu 服务器上的 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. 放置镜像

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

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       # Windows 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 远程烧写)

开启后,Ubuntu 服务器(以及运行其上的 AI Agent)可通过 ssh / scp 远程操作 Windows PC:下发编译产物到 TFTP 目录、向开发板串口发送 U-Boot 命令并观察输出,无需人工在两台机器间搬运文件。

对后续在服务器上使用 Agent 的帮助:与上一章的 TFTP server 配合,运行在 Ubuntu 服务器上的 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

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

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

备选方案一:Add-WindowsCapability 需联网获取组件失败,改走图形界面:设置 → 应用 → 可选功能 → 添加功能 → 勾选「OpenSSH 服务器」。

备选方案二:Add-WindowsCapability 卡住或失败,改用 DISM 命令:

dism /Online /Add-Capability /CapabilityName:OpenSSH.Server~~~~0.0.1.0
Start-Service sshd
Set-Service -Name sshd -StartupType Automatic

2. 从 Ubuntu 服务器验证

Ubuntu 服务器终端(root) 内执行(<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($Cmd)
Start-Sleep -Seconds $WaitSec
$p.ReadExisting()
$p.Close()

之后,运行在 Ubuntu 服务器上的 Agent 即可通过 SSH 远程触发烧写并观察输出:

ssh <Windows用户名>@<Windows PC IP> "powershell -ExecutionPolicy Bypass -File C:\tools\uboot_cmd.ps1 -Cmd 'tftpboot <加载地址> <镜像文件>' -WaitSec 30"

人工观察串口可直接在 Windows PC 上使用 PuTTY 图形界面连接对应 COM 口;脚本与 PuTTY 不能同时占用同一串口,请错开使用。


常见问题

现象 原因 / 解决
apt-get update 报 SSL 错误 系统时钟不准;执行 hwclock -s 同步时间后重试
apt-get update 报 DNS 错误 见第 1 步说明,手动写入 /etc/resolv.conf
Rust 安装超时 若华为云镜像暂不可用,改用官方源:unset RUSTUP_DIST_SERVER RUSTUP_UPDATE_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