飞腾 FT-2000/4 Ubuntu 内存卡 / NVMe SSD 系统制作完整指南
本文基于飞腾 FT-2000/4 嵌入式平台,详细介绍如何制作 SD 卡启动系统以及 NVMe SSD 启动系统,涵盖分区、格式化、根文件系统制作、U-Boot 环境变量配置、网口自启动等完整流程,并记录了实际开发中遇到的各种坑点。
目录
- 一、环境准备
- [二、方案一:SD 卡制作 Ubuntu 系统](#二、方案一:SD 卡制作 Ubuntu 系统)
- [三、方案二:NVMe SSD 烧写系统(U-Boot 方式)](#三、方案二:NVMe SSD 烧写系统(U-Boot 方式))
- [四、U-Boot 环境变量详解](#四、U-Boot 环境变量详解)
- 五、网口自启动配置
- [六、Image 与 uImage 的区别](#六、Image 与 uImage 的区别)
- 七、常见问题与踩坑记录
- 八、附录:常用命令速查
一、环境准备
硬件环境
| 项目 | 说明 |
|---|---|
| 处理器 | 飞腾 FT-2000/4(ARMv8 架构) |
| 存储介质 | SD 卡 / NVMe SSD(如 AXD 512SSD) |
| 调试工具 | 串口线、读卡器 |
| 网络 | 支持 TFTP 烧写 U-Boot(可选) |
软件环境
- 主机系统:Ubuntu(推荐,SD 卡格式化务必在 Ubuntu 下操作)
- 必备文件 :
- 内核镜像:
Image - 设备树:
ft2004-devboard-d4-dsk.dtb - 根文件系统:
ipu_rootfs_ubuntu16.tar.gz - U-Boot 固件:
fip-all-nvme.bin(NVMe 版本)
- 内核镜像:
- 权限:操作需要 root 权限
飞腾嵌入式平台软件栈
┌─────────────────────┐
│ 应用层 │
├─────────────────────┤
│ 嵌入式操作系统 │
├─────────────────────┤
│ 通用固件(U-Boot) │ ← Non-Secure EL2
├─────────────────────┤
│ 飞腾基础固件(PBF) │ ← EL3
└─────────────────────┘
PBF 层由飞腾公司提供,负责处理器基本引导初始化;U-Boot 层负责外设驱动和操作系统引导。
二、方案一:SD 卡制作 Ubuntu 系统
步骤 1:确认 SD 卡设备
插入 SD 卡后,使用以下命令查看设备名:
bash
sudo fdisk -l
⚠️ 注意 :确认设备名为
/dev/sdb(或 sda/sdc,根据实际情况调整),切勿选错设备以免数据丢失。⚠️ 重要:SD 卡格式化操作务必在 Ubuntu 系统下进行!
步骤 2:分区操作
使用 fdisk 对 SD 卡进行分区:
bash
sudo fdisk /dev/sdb
分区方案:
| 分区 | 大小 | 格式 | 用途 |
|---|---|---|---|
| /dev/sdb1 | 256MB | FAT32 | 存放内核镜像和设备树 |
| /dev/sdb2 | 剩余空间 | ext4 | 存放根文件系统 |
fdisk 交互操作步骤:
- 输入
n新建分区 - 连续按 3 次回车(使用默认主分区、分区号、起始扇区)
- 输入
+256M设置第一个分区大小 - 输入
n新建第二个分区 - 连续按 4 次回车(使用全部剩余空间,不要手动输入容量)
- 输入
w保存分区表并退出
💡 提示:第二个分区不要输入具体容量,直接回车使用剩余全部空间。
步骤 3:格式化分区
bash
# 格式化第一个分区为 FAT32
sudo mkfs.vfat /dev/sdb1
# 格式化第二个分区为 ext4
sudo mkfs.ext4 /dev/sdb2
步骤 4:制作根文件系统
bash
# 挂载第二个分区
sudo mount /dev/sdb2 /mnt/
# 解压根文件系统(根据实际路径调整)
sudo tar xaf ipu_rootfs_ubuntu16.tar.gz -C /mnt/
# 同步数据(非常重要!)
sudo sync
# 卸载分区
sudo umount /mnt/
步骤 5:拷贝内核镜像和设备树
bash
# 挂载第一个分区
sudo mount /dev/sdb1 /mnt/
# 创建 ft 目录
sudo mkdir /mnt/ft
# 拷贝内核镜像
sudo cp Image /mnt/ft/Image
# 拷贝设备树
sudo cp ft2004-devboard-d4-dsk.dtb /mnt/ft/ft2004-devboard-d4-dsk.dtb
# 同步数据
sudo sync
# 卸载分区
sudo umount /mnt/
✅ 至此 SD 卡系统制作完成。下面是 U-Boot 启动配置。
步骤 6:U-Boot 环境变量配置
启动开发板,在 U-Boot 启动倒计时内按任意键进入命令行,依次输入以下命令:
bash
# 设置加载设备树的命令
setenv sd_load_fdt 'fatload mmc 0:1 0x90000000 ft/ft2004-devboard-d4-dsk.dtb'
# 设置加载内核的命令
setenv sd_load_kernel 'fatload mmc 0:1 0x90100000 ft/Image'
# 设置启动参数(控制台、根文件系统分区)
setenv bootargs 'console=ttyAMA1,115200 earlycon=pl011,0x28001000 root=/dev/mmcblk0p2 rw rootwait'
# 设置 SD 启动命令
setenv sd_boot 'run sd_load_fdt;run sd_load_kernel;booti 0x90100000 -:- 0x90000000'
# 设置默认启动命令为 SD 启动
setenv bootcmd 'run sd_boot'
# 保存环境变量
saveenv
# 启动系统
boot
💡
booti用于启动 Image 格式内核,如果是 uImage 则使用bootm。
三、方案二:NVMe SSD 烧写系统(U-Boot 方式)
前置条件
- 内核和设备树需要支持 NVMe 设备
- U-Boot 需要支持 NVMe 命令(需使用
fip-all-nvme.bin版本)
步骤 1:确认 NVMe 设备
bash
fdisk -l
确认 NVMe 设备名为 /dev/nvme0n1。
步骤 2:分区操作
bash
fdisk /dev/nvme0n1
分区方案与 SD 卡相同:
| 分区 | 大小 | 格式 | 用途 |
|---|---|---|---|
| /dev/nvme0n1p1 | 256MB | FAT32 | 内核 + 设备树 |
| /dev/nvme0n1p2 | 剩余空间 | ext4 | 根文件系统 |
操作同 SD 卡分区步骤(n → 回车 → +256M → n → 回车 × 4 → w)。
步骤 3:格式化分区
bash
mkfs.vfat /dev/nvme0n1p1
mkfs.ext4 /dev/nvme0n1p2
步骤 4:制作根文件系统
bash
# 挂载根文件系统分区
mount /dev/nvme0n1p2 /mnt/
# 解压根文件系统
cd /home
tar xaf ipu_rootfs_ubuntu16.tar.gz -C /mnt/
# 同步并卸载
sync
umount /mnt/
步骤 5:拷贝内核和设备树
bash
# 挂载 boot 分区
mount /dev/nvme0n1p1 /mnt/
# 创建 ft 目录
mkdir /mnt/ft
# 拷贝内核和设备树
cp Image /mnt/ft/Image
cp ft2004-devboard-d4-dsk.dtb /mnt/ft/ft2004-devboard-d4-dsk.dtb
# 同步并卸载
sync
umount /mnt/
步骤 6:烧录支持 NVMe 的 U-Boot
如果当前 U-Boot 不支持 NVMe 命令,需要通过 TFTP 烧写新的 U-Boot 固件。
准备工作:
- 电脑端搭建 TFTP 服务器,IP 设为
192.168.0.100 - 将
fip-all-nvme.bin放入 TFTP 服务器目录 - 用网线连接开发板和电脑
- U-Boot 模式下设置网口为 100M 全双工
烧写命令:
bash
# 设置网络(如果未设置)
setenv ipaddr 192.168.0.133
setenv serverip 192.168.0.100
# 通过 TFTP 下载固件到内存
tftpboot 0x90000000 fip-all-nvme.bin
# 擦除 flash
flashe 0x0 0x500000
# 写入 flash
flashw 0x90000000 0x0 0x500000
⚠️ 注意 :使用
mtd_debug烧写可能会报error open()错误,此时应改用 TFTP 方式。
步骤 7:U-Boot 环境变量配置(NVMe 启动)
重启进入 U-Boot 命令行,配置 NVMe 启动相关环境变量:
bash
# 先扫描 NVMe 设备(必须先执行 scan!)
nvme scan
# 确认识别到 NVMe 盘
nvme info
# 设置加载设备树(从 NVMe 加载)
setenv sd_load_fdt 'fatload nvme 0:1 0x90100000 ft/ft2004-devboard-d4-dsk.dtb'
# 设置加载内核(从 NVMe 加载)
setenv sd_load_kernel 'fatload nvme 0:1 0x90200000 ft/Image'
# 设置启动参数
setenv sd_bootargs 'setenv bootargs console=ttyAMA1,115200 earlycon=pl011,0x28001000 root=/dev/nvme0n1p2 rootwait rw'
# 设置启动命令
setenv sd_boot 'booti 0x90200000 -:- 0x90100000'
# 设置 bootcmd(整合启动流程)
setenv bootcmd 'run sd_bootargs;run sd_load_fdt;run sd_load_kernel;run sd_boot'
# 保存环境变量
saveenv
# 启动
boot
⚠️ 关键 :
nvme scan必须在nvme info和加载命令之前执行,否则 U-Boot 无法识别 NVMe 设备。💡 可以将
nvme scan加到 bootcmd 中确保每次启动都扫描。
四、U-Boot 环境变量详解
完整环境变量参考
arch=arm
baudrate=115200
board=FT2004C
bootargs=console=ttyAMA1,115200 earlycon=pl011,0x28001000 root=/dev/mmcblk0p2 rootwait rw
bootcmd=run sd_cmd
bootdelay=1
cpu=armv8
ethact=ethernet1@28210000
ipaddr=192.168.0.222
serverip=192.168.0.100
netmask=255.255.255.0
gatewayip=192.168.0.1
sd_boot=booti 0x90200000 -:- 0x90100000
sd_bootargs=setenv bootargs 'console=ttyAMA1,115200 earlycon=pl011,0x28001000 root=/dev/mmcblk0p2 rootwait rw'
sd_cmd=run sd_bootargs;run sd_load_fdt;run sd_load_kernel;run sd_boot
sd_load_fdt=fatload mmc 0:1 0x90100000 ft/ft2004-devboard-d4-dsk.dtb
sd_load_kernel=fatload mmc 0:1 0x90200000 ft/Image
vendor=phytium
内存地址说明
| 地址 | 用途 |
|---|---|
| 0x90000000 | 设备树加载地址 |
| 0x90100000 | 内核加载地址 |
| 0x90200000 | (备用)内核加载地址 |
| 0x93000000 | ramdisk 加载地址 |
查看环境变量
bash
# 查看所有环境变量
printenv
# 或简写
pri
五、网口自启动配置
进入系统后,配置网口开机自启动和 SSH 服务。
创建自启动脚本
bash
vi /etc/init.d/ipustart.sh
写入以下内容:
bash
#!/bin/sh
# 配置网口 IP
ifconfig eth0 192.168.3.133
ifconfig eth1 192.168.0.133
# 创建 SSH 运行目录
mkdir /var/run/sshd
exit 0
配置开机自启动
bash
# 添加执行权限
chmod +x /etc/init.d/ipustart.sh
# 注册为开机启动服务(优先级10,运行级别2345)
update-rc.d ipustart.sh start 10 2 3 4 5 .
💡 如需关闭自启动,使用
update-rc.d -f ipustart.sh remove。
六、Image 与 uImage 的区别
| 特性 | Image | uImage |
|---|---|---|
| 格式 | 原始二进制内核映像 | U-Boot 专用格式,带 64 字节头部 |
| 头部信息 | 无 | 包含加载地址、入口点、校验和、映像类型 |
| 启动命令 | booti |
bootm |
| 适用场景 | 通用引导加载器 | 专为 U-Boot 设计 |
| 大小 | 较小 | 比 Image 多 64 字节头部 |
uImage 头部包含:
- 头部大小:通常 64 字节
- 数据校验:头部 + 映像数据校验和
- 映像类型:内核 / 设备树 / ramdisk 等
- 加载地址:映像应加载到的内存地址
- 入口点:执行开始的地址
💡 本文使用的是
Image格式,所以 U-Boot 中使用booti命令启动。
七、常见问题与踩坑记录
❌ 问题 1:无法加载内核和设备树
现象:U-Boot 报文件找不到或加载失败。
解决:
- 检查环境变量中的路径是否与 SD 卡 / SSD 上的实际路径一致
- 使用
fatls mmc 0:1 ft或fatls nvme 0:1 ft查看文件列表 - 确认文件名大小写是否匹配
❌ 问题 2:内核启动或挂载文件系统时卡死
现象:内核启动到一半卡住,或挂载 rootfs 失败。
解决:
- 确保制作系统时执行了
sync命令,保证数据完全写入 - 检查
bootargs中的root=/dev/xxx设备名是否正确- SD 卡:
root=/dev/mmcblk0p2 - NVMe:
root=/dev/nvme0n1p2
- SD 卡:
- 检查根文件系统是否完整
❌ 问题 3:Kernel Panic 崩溃
现象:启动时内核崩溃。
解决:
- 通常是根文件系统版本太旧,更换较新的 rootfs
- 确认内核版本与 rootfs 版本匹配
❌ 问题 4:nvme list 没反应
现象 :系统中 nvme list 无输出。
解决:需要在内核配置中开启 NVMe 支持。
❌ 问题 5:U-Boot 没有 nvme 命令
现象 :输入 nvme info 提示命令不存在。
解决:
- 重新编译支持 NVMe 的 U-Boot
- 使用 TFTP 方式烧写
fip-all-nvme.bin - 注意:
mtd_debug烧写可能报error open(),改用 TFTP
❌ 问题 6:U-Boot 下 nvme info 无响应
现象 :nvme info 没有输出。
解决 :必须先执行 nvme scan 扫描设备!
bash
nvme scan # 先扫描
nvme info # 再查看信息
❌ 问题 7:SD 卡格式化后无法使用
解决 :务必在 Ubuntu 系统下使用 mkfs.ext4 格式化,不要在 Windows 下操作。
❌ 问题 8:启动速度慢
优化:关闭不必要的系统服务
bash
# 禁用某个服务
systemctl disable [service_name]
# 查看开机启动服务
systemctl list-unit-files --type=service | grep enabled
八、附录:常用命令速查
磁盘操作
bash
fdisk -l # 查看所有磁盘信息
fdisk /dev/sdb # 对磁盘进行分区操作
mkfs.vfat /dev/sdb1 # 格式化为 FAT32
mkfs.ext4 /dev/sdb2 # 格式化为 ext4
mount /dev/sdb1 /mnt # 挂载分区
umount /mnt # 卸载分区
sync # 同步缓存到磁盘
U-Boot 常用命令
bash
printenv / pri # 查看环境变量
setenv 变量名 值 # 设置环境变量
saveenv # 保存环境变量
fatls mmc 0:1 ft # 列出 SD 卡 ft 目录文件
fatls nvme 0:1 ft # 列出 NVMe ft 目录文件
fatload mmc 0:1 地址 路径 # 从 SD 加载文件
fatload nvme 0:1 地址 路径 # 从 NVMe 加载文件
booti 内核地址 -:- 设备树地址 # 启动 Image 内核
bootm 内核地址 -:- 设备树地址 # 启动 uImage 内核
nvme scan # 扫描 NVMe 设备
nvme info # 查看 NVMe 设备信息
tftpboot 地址 文件名 # 从 TFTP 下载文件
NVMe 完整操作命令汇总
bash
# 1. 分区格式化
fdisk -l
fdisk /dev/nvme0n1
mkfs.vfat /dev/nvme0n1p1
mkfs.ext4 /dev/nvme0n1p2
# 2. 拷贝根文件系统
mount /dev/nvme0n1p2 /mnt/
tar xaf ipu_rootfs_ubuntu16.tar.gz -C /mnt/
sync
umount /mnt/
# 3. 拷贝内核和设备树
mount /dev/nvme0n1p1 /mnt/
mkdir /mnt/ft
cp Image /mnt/ft/Image
cp ft2004-devboard-d4-dsk.dtb /mnt/ft/ft2004-devboard-d4-dsk.dtb
sync
umount /mnt/
# 4. U-Boot 烧写(TFTP 方式)
tftpboot 0x90000000 fip-all-nvme.bin
flashe 0x0 0x500000
flashw 0x90000000 0x0 0x500000
# 5. U-Boot 环境变量(NVMe 启动)
nvme scan
nvme info
setenv sd_load_fdt 'fatload nvme 0:1 0x90100000 ft/ft2004-devboard-d4-dsk.dtb'
setenv sd_load_kernel 'fatload nvme 0:1 0x90200000 ft/Image'
setenv sd_bootargs 'setenv bootargs console=ttyAMA1,115200 earlycon=pl011,0x28001000 root=/dev/nvme0n1p2 rootwait rw'
setenv sd_boot 'booti 0x90200000 -:- 0x90100000'
setenv bootcmd 'run sd_bootargs;run sd_load_fdt;run sd_load_kernel;run sd_boot'
saveenv
boot
参考资料
- 飞腾 FT-2000/4 SD 使用说明(v1.1),天津飞腾信息技术有限公司
- U-Boot 官方文档:www.denx.de/wiki/U-Boot
- Phytium Base Firmware 接口规范
- 飞腾 FT-2000 四核处理器软件编程手册