飞腾 FT-2000/4 Ubuntu 内存卡 / NVMe SSD 系统制作完整指南

飞腾 FT-2000/4 Ubuntu 内存卡 / NVMe SSD 系统制作完整指南

本文基于飞腾 FT-2000/4 嵌入式平台,详细介绍如何制作 SD 卡启动系统以及 NVMe SSD 启动系统,涵盖分区、格式化、根文件系统制作、U-Boot 环境变量配置、网口自启动等完整流程,并记录了实际开发中遇到的各种坑点。


目录


一、环境准备

硬件环境

项目 说明
处理器 飞腾 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 交互操作步骤:

  1. 输入 n 新建分区
  2. 连续按 3 次回车(使用默认主分区、分区号、起始扇区)
  3. 输入 +256M 设置第一个分区大小
  4. 输入 n 新建第二个分区
  5. 连续按 4 次回车(使用全部剩余空间,不要手动输入容量)
  6. 输入 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
  • 检查根文件系统是否完整

❌ 问题 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

参考资料

  1. 飞腾 FT-2000/4 SD 使用说明(v1.1),天津飞腾信息技术有限公司
  2. U-Boot 官方文档:www.denx.de/wiki/U-Boot
  3. Phytium Base Firmware 接口规范
  4. 飞腾 FT-2000 四核处理器软件编程手册
相关推荐
pusheng20251 小时前
马年市场快报 | 阿尔及利亚政府推进2200万台家用CO报警器安装计划
大数据·人工智能
2601_965742221 小时前
布局GEO AI本地营销,我重点看这几个细节
大数据·人工智能·算法·ai·新媒体运营
EatFan1 小时前
AI Agent 上生产前先加三道闸门:审批、限权、可回放的工程实践
人工智能·python·算法·多智能体·ai agent·mcp·harness
遥感知识服务2 小时前
沙漠和洪水在SAR里都很黑,AI到底怎么分?
人工智能
小成很成2 小时前
Skills:AI 时代必备技能,让大模型从聊天工具变成专业助手
人工智能
yu_zhidun2 小时前
企业管理者看:员工上网行为管理软件,别再只靠网关“赌安全”
大数据·人工智能·安全·域智盾
-cywen-2 小时前
MaskCLIP
人工智能
努力的小雨2 小时前
被游戏虐烦后,我让 Seed-2.1-pro 帮我做了一款自己当王的 3D 游戏
人工智能
上海锝秉工控2 小时前
微米级精准捕捉,激光测振解锁产线新效率
人工智能