跳到主要内容

Ubuntu 20 开发环境与源码准备

本章目标

本章只准备开发主机和源码,不编译固件,也不写入开发板。完成后应具备以下条件:

  • Ubuntu 20.04 LTS x86_64 运行正常;
  • Buildroot、Linux、U-Boot 和 OpenixCLI 所需主机工具可用;
  • Rust 工具链满足 OpenixCLI 最低版本要求;
  • 当前用户能够访问 UART 和 Allwinner FEL USB;
  • 两个功能分支放在约定的兄弟目录中;
  • 主机、源码提交和硬件连接都有可复查记录。

默认环境

项目默认或建议值
开发主机Ubuntu 20.04 LTS 64 位
架构x86_64
CPU至少 4 核
内存至少 8 GiB,推荐 16 GiB
可用磁盘至少 100 GiB
工作区文件系统ext4 等 Linux 原生文件系统
目标板100ASK T113S3 Pro SPI NAND 版本
主机连接OTG/FEL USB + 独立 UART3

构建目录不要放在 NTFS、FAT、VMware Shared Folders、VirtualBox Shared Folders 或网络共享目录中。这些文件系统可能破坏符号链接、权限、大小写或时间戳,导致 Buildroot 出现难以复现的错误。

选择开发主机形式

场景建议方案说明
有独立 Linux 电脑实体机安装 Ubuntu 20.04编译和 USB 重连最稳定
Windows 主机VMware 中安装 Ubuntu 20.04使用方便,但必须处理 USB 直通
VirtualBox 用户Ubuntu 20.04 虚拟机可用,同样需要 USB 过滤器
只有 WSL2不作为本文默认方案USB FEL、串口和 Linux 文件系统处理更复杂

本文后续命令均在 Ubuntu 终端执行。Windows PowerShell、CMD 和 WSL2 不是默认命令环境。

获取并安装 Ubuntu 20.04

对供应链和可复现性有要求时,建议从 Ubuntu 20.04 LTS 官方发布页下载 AMD64 ISO,自行安装并核对官方公布的校验值。

使用虚拟机时:

  1. 在 VMware 或 VirtualBox 中创建 64 位 Ubuntu 虚拟机;
  2. 分配至少 4 个 CPU、8 GiB 内存和 120 GiB 虚拟磁盘;
  3. 使用 Ubuntu 20.04 AMD64 ISO 完成安装;
  4. 网络选择 NAT 或桥接均可,但 Ubuntu 必须能访问 GitHub 和源码下载站;
  5. 启用 USB 控制器,确保 Allwinner FEL 和 USB 转串口可以连接到 guest;
  6. 安装完成后先创建快照,再开始配置开发环境。

VMware 打开已有虚拟机

如使用已经准备好的 Ubuntu 20.04 VMware 镜像,在 VMware 中选择 文件 > 打开,再选择镜像中的 .vmx 文件。

VMware 中打开虚拟机配置

操作截图来源于 100askTeam/linuxboard-docs。截图只说明 VMware 的“打开”入口;本文要求导入的是 Ubuntu 20.04,而不是旧教程中的 Ubuntu 18.04 镜像。

如果 VMware 询问虚拟机是移动还是复制而来,首次导入副本时选择“我已复制该虚拟机”。进入 Ubuntu 后检查实际磁盘空间,不要只看虚拟磁盘的最大容量。

检查系统和资源

打开 Ubuntu 终端:

uname -m
lsb_release -ds
nproc
free -h
df -h "$HOME"

预期至少满足:

架构:x86_64
系统:Ubuntu 20.04.x LTS
CPU:4 核或更多
内存:8 GiB 或更多
HOME 所在分区:100 GiB 或更多可用空间

补丁版本不同通常不影响构建,但系统大版本不是 20.04 时,应在构建记录中明确写出实际版本,不能继续声称使用默认环境。

安装主机依赖

先更新软件包索引:

sudo apt update

安装主线构建、镜像处理、USB 和串口工具:

sudo apt install -y \
build-essential gcc g++ make git \
python3 python3-dev \
bc bison flex cpio rsync file \
wget curl unzip tar gzip bzip2 xz-utils zstd patch perl \
libncurses-dev libssl-dev libelf-dev \
libusb-1.0-0-dev pkg-config \
device-tree-compiler picocom usbutils udev

这些软件包分别覆盖 Buildroot 主机构建、Linux/U-Boot 配置、FIT/设备树、UBI 打包、OpenixCLI 的 libusb 依赖以及板卡调试。不要照抄 Tina4/Tina5 教程中的 Python 2、Android 或 32 位兼容包,除非其他独立项目确实需要。

安装完成后执行:

gcc --version
make --version
python3 --version
git --version
dtc --version
pkg-config --modversion libusb-1.0

每条命令都必须成功输出版本号。apt 没有报错不等于工具已经全部可用。

安装 Rust 工具链

OpenixCLI 要求 Rust 1.70 或更新版本。Ubuntu 20.04 软件源中的 Rust 可能过旧,因此本文使用 Rustup 管理当前稳定工具链。

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs -o /tmp/rustup-init.sh
less /tmp/rustup-init.sh
sh /tmp/rustup-init.sh -y --profile minimal --default-toolchain stable
source "$HOME/.cargo/env"

下载后先查看脚本,再执行安装。检查版本:

rustc --version
cargo --version

新开终端后如果找不到 cargo,执行:

source "$HOME/.cargo/env"

并确认 shell 启动文件中已经加载 Cargo 环境。

配置串口权限

将当前用户加入串口和 USB 常用用户组:

sudo usermod -aG dialout,plugdev "$USER"

注销 Ubuntu 会话并重新登录,然后执行:

id
ls -l /dev/ttyUSB* /dev/ttyACM* 2>/dev/null

id 输出应包含 dialoutplugdev。找到实际串口后可先验证 UART3:

picocom -b 115200 --flow n /dev/ttyUSB0

/dev/ttyUSB0 替换为实际设备节点。按 Ctrl+A,再按 Ctrl+X 退出。

配置 FEL USB 权限

先创建 Allwinner FEL 的 udev 规则:

sudo tee /etc/udev/rules.d/99-allwinner-fel.rules >/dev/null <<'EOF'
SUBSYSTEM=="usb", ATTR{idVendor}=="1f3a", ATTR{idProduct}=="efe8", MODE="0660", GROUP="plugdev"
EOF

sudo udevadm control --reload-rules
sudo udevadm trigger

让开发板重新进入 BootROM FEL,再检查:

lsusb -d 1f3a:efe8

预期能够看到 Allwinner 设备。虚拟机里设备每次重新枚举后都可能回到宿主机;如果命令突然看不到设备,先检查 VMware/VirtualBox 的 USB 归属,不要立即修改 OpenixCLI。

创建工作目录

mkdir -p "$HOME/workspace/t113-mainline-work"
cd "$HOME/workspace/t113-mainline-work"
pwd

推荐目录如下:

$HOME/workspace/t113-mainline-work/
├── OpenixCLI/
└── DshanPI-T113xMainlineLinux/

两个仓库默认必须互为兄弟目录。不要把其中一个仓库克隆到另一个仓库内部。

软件与源码基线

组件固定值
主线系统仓库分支feat/t113s3pro-mainline
本文核对提交1f28a1ca10d7887560c56350bc87cf56137b1010
OpenixCLI 分支feat/mainline-fel-ram-installer
OpenixCLI 硬件验证实现f10ff48cf938d5a85e45e2a78f241f6602baff06
Buildroot86102dd8279ac6c4c0244f3e490af98dc7460d5e
Linux6.18.8
U-Boot2026.07
libefex revision3752e38ff8e69190c53cd43290a8102beab55e73

Linux 和 U-Boot 源码归档的 SHA-256 保存在主线仓库的 manifests/sources.lock 中。构建脚本会启用 Buildroot 下载哈希检查。

获取两个功能分支

cd "$HOME/workspace/t113-mainline-work"

git clone -b feat/mainline-fel-ram-installer \
https://github.com/100askTeam/OpenixCLI.git

git clone -b feat/t113s3pro-mainline \
https://github.com/dshanpi/DshanPI-T113xMainlineLinux.git

记录实际分支、提交和工作区状态:

git -C OpenixCLI status --short --branch
git -C OpenixCLI rev-parse HEAD

git -C DshanPI-T113xMainlineLinux status --short --branch
git -C DshanPI-T113xMainlineLinux rev-parse HEAD

功能分支可能继续产生新提交,因此必须保存实际 HEAD。不要为了匹配文档提交而对已有工作区执行强制 reset。

主线仓库目录职责

DshanPI-T113xMainlineLinux/
├── board/dshanpi/t113s3pro/ # DTS、补丁、FIT、安装器和封装脚本
├── configs/ # Buildroot 板级 defconfig
├── docs/ # 英文设计与开发记录
├── logs/ # 净化后的硬件和任务证据
├── manifests/ # 固定源码与历史产物哈希
├── scripts/ # 构建、打包、烧写和验收入口
├── Makefile
└── out/ # 本地生成,不作为源码提交

环境验收

执行一次集中检查:

for tool in git make gcc python3 cpio zstd rsync cargo; do
command -v "$tool" || exit 1
done

pkg-config --exists libusb-1.0
test "$(uname -m)" = x86_64
test -f DshanPI-T113xMainlineLinux/manifests/sources.lock
test -f OpenixCLI/Cargo.lock

硬件已连接时再检查:

lsusb -d 1f3a:efe8
ls -l /dev/ttyUSB* /dev/ttyACM* 2>/dev/null

满足以下条件才能进入编译阶段:

  • Ubuntu 版本、架构、CPU、内存和磁盘空间已经记录;
  • 所有必需命令可执行;
  • cargo 满足 OpenixCLI 的最低 Rust 版本;
  • pkg-config 能找到 libusb 1.0;
  • 两个仓库分支正确、状态可解释;
  • FEL USB 和 UART3 均能由 Ubuntu 访问。

常见问题

现象处理方法
cargo: command not found重新加载 $HOME/.cargo/env,检查 Rustup 是否安装完成
libusb-1.0 not found安装 libusb-1.0-0-devpkg-config
Ubuntu 中没有 1f3a:efe8检查 FEL 操作和虚拟机 USB 直通
串口提示 Permission denied重新登录后确认用户属于 dialout
Buildroot 出现符号链接或权限错误把工作区移到 Ubuntu 内部的 ext4 分区
磁盘在构建中耗尽扩容文件系统并保留失败日志,不删除源码证据
分支或提交不一致记录实际提交并判断是否需要重新完成硬件验收

需要保存的证据

Ubuntu 版本:
主机架构:
CPU/内存:
工作区文件系统与剩余空间:
Rust/Cargo 版本:
OpenixCLI commit:
主线系统仓库 commit:
UART 设备节点:
FEL USB 与 libusb 位置:

本章的主机搭建顺序参考 100askTeam/linuxboard-docs 的既有开发环境文档,并按 Ubuntu 20.04、主线 Buildroot 和 OpenixCLI 的实际要求重新整理。环境验收通过后,先阅读主线系统构建与打包总览,建立全局流程,再进入各组件适配章节。