适用正点原子 I.MX6ULL‑MINI/ALPHA(512MB DDR3L、eMMC 版本),完整覆盖环境准备、三大镜像、3 种烧录模式、U‑Boot、内核编译、rootfs、SD 卡分区布局、uboot 环境变量、常见错误排查,所有操作均标注风险点,防止配置错误。
一、系统移植基础概念
1、Linux 系统由 3 部分组成,缺一不可
| 组件 | 文件名称 | 作用 |
|---|---|---|
| U‑Boot(bootloader) | u‑boot.imx |
上电初始化硬件 DDR / 时钟,加载内核、传递启动参数,引导 Linux 内核启动 |
| Linux 内核 | zImage + xxx.dtb设备树 |
内核实现内存管理、进程调度、网络、虚拟文件系统;Linux3.0 以后硬件资源独立为设备树 dtb 文件,不再编译进 zImage |
| 根文件系统 rootfs | rootfs.tar.bz2 |
用户态程序、库、配置脚本,提供人机交互,内核挂载后才有 shell 终端 |
完整启动链路 :U‑Boot → zImage + dtb设备树 → rootfs根文件系统
2、开发板启动拨码开关(eMMC 版本,0 代表 OFF,1 代表 ON)
(1)USB 启动 (烧录模式):01000000:用于 mfgtool 通过 OTG 烧写系统
烧写 SD 卡:开发板先上电识别设备,之后再插入 SD 卡
烧写 EMMC:上电前拔掉 SD 卡,否则识别失败
(2)SD 卡启动 (开发调试):10000010:系统放在 SD 卡,开发阶段频繁调试使用
(3)EMMC 启动 (产品量产):10100110:系统固化板载 eMMC,脱离 SD 卡独立运行
硬件注意:OTG 口只负责数据通信,开发板必须外接 12V 电源适配器供电,不能依靠 USB 线供电
3、SD 卡存储布局(imx6mksdboot.sh 脚本生成)
| 位置 | 内容说明 |
|---|---|
| 0 扇区(512 字节) | MBR 分区表 |
| 1KB 偏移处开始 | 存放 U‑Boot(IVT/DCD/uboot 本体,最大 1MB),禁止改写 SD 卡前两个扇区,会破坏分区表 |
| 分区 1 FAT32(64MB) | 挂载 /boot;存放zImage、imx6ull‑alientek‑emmc.dtb |
| 分区 2 EXT3(剩余全部空间) | 挂载 /;完整 rootfs 根文件系统,包含 bin、etc、lib、usr、modules 内核模块 |
4、三种烧录模式对比
| 模式 | 使用场景 | 优缺点 |
|---|---|---|
| 模式 1:烧写至 SD 卡 | 前期开发、系统恢复、裸机后跑 Linux | 简单;SD 卡速度有限,不适合量产 |
| 模式 2:烧写至板载 eMMC | 产品量产,最终交付版本 | 固化到板载存储,脱离 SD 卡;烧录时间约 5 分钟 |
| 模式 3:SD 卡存 uboot + TFTP 下载 zImage/dtb + NFS 挂载 rootfs | 驱动开发高频调试(最推荐开发模式) | 不需要反复烧写存储介质;修改内核 / 设备树 / 根文件直接在 Ubuntu 服务器替换,重启板子即生效;依赖网络环境 |
二、前期 Ubuntu 开发环境搭建
1、双网卡虚拟机配置(重中之重,极易出错)
目标:网卡 1 NAT 模式,访问外网 apt 下载软件;网卡 2 桥接模式,直连开发板网线,作为 TFTP/NFS 服务器。
(1)VMware 添加 2 块网络适配器
- 适配器 1:NAT 模式,负责访问互联网
- 适配器 2:桥接模式,桥接到电脑有线网卡(不要桥接 WiFi) ,静态 IP:
192.168.1.100,子网掩码255.255.255.0,网关192.168.1.1


VMnet0必须桥接到以太网接口,后续才能与开发板通信
2、必须安装全套工具
#串口工具 minicom
sudo apt‑get install minicom
#TFTP服务器
sudo apt‑get install tftpd‑hpa tftp
#NFS服务器
sudo apt‑get install nfs‑kernel‑server
#编译uboot、内核依赖
sudo apt‑get install libncurses5‑dev bison flex lzop
#ctags代码阅读
sudo apt‑get install ctags cscope
① minicom 串口配置
sudo minicom -s
Serial port setup:
Serial Device:`/dev/ttyUSB0`
Bps/Par/Bits:`115200 8N1`
Hardware Flow Control:**No(关闭硬件流控!不关闭串口无输出)**
Save setup as dfl,保存默认配置。
退出:`Ctrl+A`,按下`Q`。
Windows 端可以使用 MobaXterm,COM 口,波特率 115200,流控 None。
② TFTP 服务器配置
配置文件 /etc/default/tftpd‑hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/home/linux/tftpboot"
TFTP_ADDRESS=":69"
TFTP_OPTIONS="--secure‑l‑c"
创建目录赋权限
mkdir /home/linux/tftpboot
chmod 0777 /home/linux/tftpboot
sudo service tftpd‑hpa restart
把
zImage、dtb放到该目录,开发板 uboot 通过 tftp 下载。
③ NFS 服务器配置
编辑/etc/exports
/home/linux/nfs/rootfs *(rw,sync,no_subtree_check,no_root_squash)
no_root_squash:开发板 root 用户拥有服务器目录权限,开发调试必须;生产环境不建议。
mkdir -p /home/linux/nfs/rootfs
chmod 0777 /home/linux/nfs /home/linux/nfs/rootfs
sudo service nfs‑kernel‑server restart
#验证共享目录是否生效
showmount -e
④ 交叉工具链配置
工具链:gcc‑linaro‑4.9.4‑2017.01‑x86_64_arm‑linux‑gnueabihf.tar.xz 解压,添加 PATH 环境变量,写入~/.bashrc末尾
export PATH=$PATH:/home/linux/tools/opt/gcc‑linaro‑4.9.4‑2017.01‑x86_64_arm‑linux‑gnueabihf/bin
生效:source ~/.bashrc 验证:arm‑linux‑gnueabihf‑gcc -v
三、模式一:烧写系统到 SD 卡(Windows MfgTool / Ubuntu 脚本两种方案)
Windows MfgTool 烧写 SD 卡
重要避坑清单
- mfgtool 解压路径绝对不能有中文、空格,推荐放在 D 盘根目录,使用 7‑zip/WinRAR 解压,不要 Windows 自带解压,长文件名会解压失败。
- 关闭 VMware 虚拟机!!! 防止 OTG 设备被虚拟机抢占,Windows 设备管理器识别到「符合 HID 标准的供应商定义设备」才算识别成功。
- 开发板拨码:USB 启动
01000000,12V 电源接好,OTG Type‑C 连接 PC;上电之后再插入 SD 卡!!! - 双击脚本:
Mfgtool2‑eMMC‑ddr512‑SDCard.vbs - 点击 Start,等待约 5 分钟烧录完成。
- 烧录完成断电,修改拨码为 SD 卡启动模式,重新上电,串口即可看到 Linux 启动日志。
Ubuntu 脚本烧写 SD 卡
-
SD 卡插入读卡器接入虚拟机,查看设备名:
sudo fdisk -l,确认 SD 卡为/dev/sdb(⚠️千万不要写成系统硬盘 /dev/sda!!!会销毁电脑系统) -
将 mfgtool 中
Profiles/Linux/OS Firmware/files文件夹拷贝到 Ubuntu。 -
修复脚本 bug:
imx6mksdboot.sh第 221 行变量名PARITION2修改为PARTITION2。 -
执行烧录脚本
sudo ./imx6mksdboot.sh -device /dev/sdb -flash emmc -ddrsize 512
脚本执行完毕,SD 卡拔出插到开发板,拨码切 SD 卡启动,上电启动。
四、模式二:烧写系统到 eMMC(量产模式)
Windows MfgTool 烧写 eMMC
- mfgtool 路径无中文,关闭虚拟机。
- 开发板:拨码 USB 启动
01000000,上电前拔掉 SD 卡,12V 供电,OTG 接 PC。 - 双击脚本
Mfgtool2‑eMMC‑ddr512‑eMMC.vbs - 识别设备后点击 Start,等待约 5 分钟烧录结束。
- 断电,拨码修改为 EMMC 启动模式,上电运行。
Ubuntu 下烧写 eMMC
⚠️不能直接脚本写 eMMC;需要先 SD 卡启动开发板,板子 Linux 系统运行后,再执行烧写脚本。
-
先把 SD 卡烧写出厂系统,SD 卡启动开发板。
-
网线连接虚拟机与开发板,minicom 串口连接。
-
开发板挂载 Ubuntu 的 NFS 共享目录
mount -o nolock,rw,nfsvers=3 192.168.1.100:/home/linux/nfs/rootfs /mnt
files 文件夹放到 nfs 共享目录;在开发板终端(minicom)进入 /mnt/files,给脚本增加执行权限,运行:
chmod +x imx6mkemmcboot.sh
./imx6mkemmcboot.sh -device /dev/mmcblk1 -ddrsize 512
烧录完成断电,拨码切换 EMMC 启动。
五、模式三:网络开发模式(SD 卡存 U‑Boot,TFTP 下载内核 DTB,NFS 挂载 rootfs)【驱动开发首选】
优势:修改 zImage、dtb、rootfs,直接替换 Ubuntu 服务器文件,重启板子即可生效,不需要反复烧写 Flash。
步骤
-
使用模式一把 uboot 烧写到 SD 卡,开发板拨码 SD 卡启动。
-
将编译得到
zImage、imx6ull‑alientek‑emmc.dtb拷贝到 Ubuntu 的/home/linux/tftpboot目录。 -
将
rootfs.tar.bz2解压到/home/linux/nfs/rootfs目录(解压务必加 sudo,权限不会出错)sudo tar -xvf rootfs.tar.bz2
-
开发板上电,串口按任意键进入 U‑Boot 命令行。
-
配置 uboot 环境变量(IP 地址按自己的实际网段修改!!!)
env default -a #恢复uboot默认环境变量
saveenv
#网络参数
setenv ipaddr 192.168.1.50 #开发板IP
setenv ethaddr 00:04:9f:04:d2:35 #MAC地址,不要重复
setenv gatewayip 192.168.1.1
setenv netmask 255.255.255.0
setenv serverip 192.168.1.100 #Ubuntu虚拟机IP
saveenv
#bootcmd:uboot倒计时自动执行,tftp下载zImage、dtb到DDR内存
setenv bootcmd 'tftp 80800000 zImage;tftp 83000000 imx6ull‑alientek‑emmc.dtb;bootz 80800000 - 83000000'
saveenv
#bootargs:内核启动参数,nfs挂载根文件系统,必须指定nfsvers=3
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.1.100:/home/linux/nfs/rootfs,proto=tcp,nfsvers=3 rw ip=192.168.1.50:192.168.1.100:192.168.1.1:255.255.255.0::eth0:off'
saveenv
reset #重启开发板,自动网络启动Linux
验证网络:uboot 命令行执行
ping 192.168.1.100,必须 ping 通,否则 tftp/nfs 全部失败。uboot 下 ping 只能开发板 ping 虚拟机,虚拟机 ping 不通开发板,单向通信属于正常现象。
六、U‑Boot 编译(i.MX6ULL)
解压 uboot 源码
tar -zxvf uboot.tar.gz
cd uboot
编译命令
#清理
make ARCH=arm CROSS_COMPILE=arm‑linux‑gnueabihf‑ distclean
#加载默认配置
make ARCH=arm CROSS_COMPILE=arm‑linux‑gnueabihf‑ imx6ull_alientek_emmc_defconfig
#编译,‑j16根据CPU核心数调整
make V=0 ARCH=arm CROSS_COMPILE=arm‑linux‑gnueabihf‑ -j16
输出产物:顶层目录 u‑boot.imx(给 i.MX 芯片烧录的完整镜像,包含 IVT/DCD 头信息)。
i.MX6ULL 启动三阶段回顾
- ROM (iROM) 阶段:芯片内部固化 ROM,上电运行,读取启动介质前 4KB 的 IVT/DCD,初始化基础时钟,把 SPL 加载到 OCRAM 片上 SRAM(仅 128KB)。
- SPL 第一阶段 U‑Boot:运行片内 OCRAM;初始化 DDR 内存,把完整 uboot 拷贝到 DDR(0x87800000)。
- 第二阶段 U‑Boot :DDR 内存运行;初始化外设,提供命令行,加载 zImage/dtb,调用
bootz启动 Linux 内核。
U‑Boot 高频核心命令
-
环境变量:
printenv查看、setenv设置、saveenv保存到存储介质 -
网络:
ping、tftp 内存地址 文件名、nfs -
MMC 操作:
mmc dev 0 #SD卡
mmc dev 1 #eMMC
fatload mmc 1:1 80800000 zImage #从mmc1的分区1读取zImage到DDR内存
启动命令: bootz 80800000 - 83000000:启动 zImage,
第二个参数 initrd 填‑代表无 ramdisk,
第三个参数 dtb 地址。
boot:执行 bootenv 中 bootcmd 环境变量。
七、Linux 内核编译(版本 Linux4.1.15)
tar -zxvf linux‑imx‑rel_imx_4.1.15_2.1.0_ga_alientek.tar.gz
cd linux‑imx‑rel_imx_4.1.15_2.1.0_ga_alientek
make ARCH=arm CROSS_COMPILE=arm‑linux‑gnueabihf‑ distclean
make ARCH=arm CROSS_COMPILE=arm‑linux‑gnueabihf‑ imx_alientek_emmc_defconfig
make ARCH=arm CROSS_COMPILE=arm‑linux‑gnueabihf‑ menuconfig #图形化裁剪内核
make ARCH=arm CROSS_COMPILE=arm‑linux‑gnueabihf‑ all -j16
编译输出产物:
- 内核镜像:
arch/arm/boot/zImage - 设备树二进制:
arch/arm/boot/dts/imx6ull‑alientek‑emmc.dtb
拷贝到 tftpboot 目录,供开发板下载:
cp arch/arm/boot/zImage ~/tftpboot/
cp arch/arm/boot/dts/imx6ull‑alientek‑emmc.dtb ~/tftpboot/
内核启动流程简述
head.S(_stext入口) → start_kernel() → rest_init() → kernel_init() → 挂载rootfs → 执行init进程,启动用户空间
八、rootfs 根文件系统
解压 rootfs.tar.bz2,NFS 模式必须解压到 nfs 共享目录,解压必须 sudo,否则权限丢失。 rootfs 启动流程 内核挂载 rootfs → 执行linuxrc → /etc/inittab → /etc/init.d/rcS → mount‑a 读取/etc/fstab挂载各个文件系统 → 启动 shell 交互终端。
/etc/inittab关键:askfirst会打印提示Please press Enter to activate this console,按下回车出现串口命令行。
九、EMMC 启动的 uboot 环境变量参考(烧录到 eMMC 后)
setenv bootcmd 'mmc dev 1; fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull‑alientek‑emmc.dtb; bootz 80800000 - 83000000;'
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
saveenv
mmc dev 1 代表 eMMC;
root=/dev/mmcblk1p2eMMC 的第二个分区,rootfs 存放位置;rootwait等待存储设备就绪,必须加上,否则内核启动找不到根文件系统。