Linux系统移植

一、移植基础认知

1. 三大核心镜像文件

文件 作用 说明
u-boot.imx 引导加载程序 上电初始化硬件,加载内核
zImage + imx6ull-alientek-emmc.dtb Linux内核+设备树 zImage是内核主体;dtb记录板载硬件资源,Linux3.x后独立拆分
rootfs.tar.bz2 根文件系统 存放命令、库、应用,提供人机交互环境

2. 所需硬件

I.MX6ULL MIN开发板、12V电源适配器、Type-C OTG线、网线、USB转串口、SD卡+读卡器、电脑(Windows+Ubuntu虚拟机)

二、前置:Ubuntu虚拟机全套环境搭建

2.1 虚拟机双网卡配置(上网+开发板互通)

目的:一块网卡NAT模式访问外网下载工具,一块桥接网卡和开发板传输文件(TFTP/NFS)

  1. 完全关闭虚拟机,打开VMware顶部「虚拟机」→「设置」
  2. 点击「添加」→「网络适配器」,新增第二块网卡
  3. 网卡1设置为NAT模式 ,网卡2设置桥接模式
  4. 顶部菜单「编辑」→「虚拟网络编辑器」
  5. 选中桥接网卡VMnet0,外部连接选择电脑有线网卡
  6. NAT网段固定为192.168.78.0,点击确定保存,启动虚拟机

2.2 Ubuntu静态IP与路由配置

  1. 终端输入ifconfig查看网卡名(示例:ens33=NAT,ens36=桥接)
  2. 编辑网络配置文件
bash 复制代码
sudo vim /etc/network/interfaces

写入配置:

复制代码
auto ens33
iface ens33 inet dhcp

auto ens36
iface ens36 inet static
address 192.168.1.100
netmask 255.255.0
gateway 192.168.1.1
  1. 重启系统生效
bash 复制代码
sudo reboot
  1. 修复默认路由(解决能连开发板但无法上网)
bash 复制代码
sudo route delete default
sudo route add default gw 192.168.78.2 ens33
  1. 设置开机自动修复路由
bash 复制代码
sudo vim /etc/systemd/system/custom-route.service

写入内容:

复制代码
[Unit]
Description=Custom Route Configuration
After=network.target
[Service]
Type=oneshot
ExecStart=/sbin/route delete default
ExecStart=/sbin/route add default gw 192.168.78.2 ens33
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target

执行生效命令:

bash 复制代码
sudo systemctl daemon-reload
sudo systemctl enable custom-route.service
sudo systemctl start custom-route.service
  1. 连通测试
bash 复制代码
# 测试外网
ping www.baidu.com
# 后续开发板IP设192.168.50,测试板卡互通
ping 192.168.1.50

2.3 安装开发必备工具

1. minicom(串口打印工具,查看开发板日志)
bash 复制代码
sudo apt-get install minicom
# 配置串口参数
sudo minicom -s

配置项:

  • Serial Device:/dev/ttyUSB0
  • 波特率:115200 8N1
  • 软硬件流控:全部关闭
    保存为默认配置,启动命令:sudo minicom
    退出快捷键:Ctrl+A 再按Q
2. TFTP服务器(网络下载内核到开发板)
bash 复制代码
sudo apt install tftpd-hpa tftp
# 创建共享目录并开放权限
mkdir /home/linux/tftpboot
chmod 0777 /home/linux/tftpboot
# 修改服务配置
sudo vim /etc/default/tftpd-hpa

修改配置:

复制代码
TFTP_DIRECTORY="/home/linux/tftpboot"
TFTP_OPTIONS="--secure -l -c"

重启服务:

bash 复制代码
sudo service tftpd-hpa restart
3. NFS服务器(开发板远程挂载文件系统)
bash 复制代码
sudo apt install nfs-kernel-server
# 创建共享目录
mkdir -p /home/linux/nfs/rootfs
chmod 0777 /home/linux/nfs /home/linux/nfs/rootfs
# 配置共享权限
sudo vim /etc/exports

添加一行:

复制代码
/home/linux/nfs/rootfs *(rw,sync,no_subtree_check,no_root_squash)

重启并查看共享目录:

bash 复制代码
sudo service nfs-kernel-server restart
showmount -e
4. ARM交叉编译器(编译ARM架构代码)
  1. gcc-linaro-4.9.4-2017.01-x86_64_armlinux-gnueabihf.tar.xz拷贝到/home/linux/tools/opt
  2. 解压文件
bash 复制代码
tar -xvf gcc-linaro-4.9.4-2017.01-x86_64_armlinux-gnueabihf.tar.xz
  1. 写入环境变量
bash 复制代码
sudo vim ~/.bashrc
# 文件末尾添加
export PATH=$PATH:/home/linux/tools/opt/gcc-linaro-4.9.4-2017.01-x86_64_armlinux-gnueabihf/bin
# 生效配置
source ~/.bashrc
# 验证安装
arm-linux-gnueabihf-gcc -v
5. 内核编译全套依赖
bash 复制代码
sudo apt-get install libncurses5-dev bison flex lzop bear ctags cscope

三、模式一:烧录系统到SD卡

方式A:Windows Mfgtool工具烧录

步骤1:工具解压准备
  1. 找到资料路径\驱动资料包\工具\mfgtool.zip
  2. 必须使用7Z/WinRAR解压,路径全程不能带中文
  3. 解压目录结构:
  • boot:存放u-boot.imxzImage、dtb设备树
  • filesystem:存放rootfs.tar.bz2
步骤2:硬件接线(严格顺序)
  1. 开发板插上12V电源
  2. Type-C OTG线连接开发板USB_OTG与电脑USB
  3. 拨码开关切换为USB启动(01000000)
  4. 暂时拔出SD卡,避免识别冲突
  5. 关闭所有VMware虚拟机,防止OTG端口被虚拟机抢占
步骤3:软件烧录操作
  1. 进入mfgtool文件夹,双击脚本Mfgtool2-eMMC-ddr512-SDCard.vbs

  2. 窗口初始显示No Device Connected,给开发板上电

  3. 状态栏出现「符合HID标准的供应商定义设备」=识别成功

  4. 插入SD卡到开发TF卡槽

  5. 点击窗口Start按钮,等待约5分钟

  6. 进度条全绿、显示Done代表烧写完成

  7. 依次点击StopExit关闭工具

步骤4:启动开发板
  1. 开发板断电
  2. 拨码开关切换为SD卡启动
  3. 重新上电,屏幕出现图形桌面即成功

方式B:Ubuntu脚本烧录SD卡

  1. SD卡插入读卡器接入Ubuntu
  2. 查看磁盘设备名:sudo fdisk -l(一般为/dev/sdb
  3. 将mfgtool内files文件夹拷贝到Ubuntu
  4. 修复脚本bug:打开imx6mksdboot.sh,把${PARITION2}改为${PARTITION2}
  5. 执行烧录脚本
bash 复制代码
sudo ./imx6mksdboot.sh -device /dev/sdb -flash emmc -ddrsize 512
  1. 打印「烧写成功」后拔出SD卡,插开发板SD卡槽,拨SD启动上电

补充:SD卡分区布局

  1. 0~1MB:存放U-Boot镜像
  2. 1MB~64MB:FAT32分区,存放zImage、dtb,挂载/boot
  3. 64MB至卡末端:EXT3分区,完整根文件系统rootfs

四、模式二:烧录系统到板载eMMC(产品量产专用)

方式1:Windows Mfgtool烧写eMMC

  1. 解压mfgtool,文件目录和SD烧录一致
  2. 硬件:电源+OTG线,拨码USB启动,全程不插SD卡
  3. 双击脚本Mfgtool2-eMMC-ddr512-eMMC.vbs
  4. 关闭虚拟机,上电识别设备后点击Start
  5. 等待5分钟烧录完成,关闭工具
  6. 断电,拨码切换EMMC启动,上电运行系统

方式2:Ubuntu远程烧写eMMC

  1. 先用模式一把系统烧进SD卡,SD启动开发板
  2. 网线连接Ubuntu与开发板,打开minicom串口
  3. 开发板测试网络连通
bash 复制代码
ping 192.168.1.100
  1. 开发板挂载Ubuntu NFS共享目录
bash 复制代码
mount -o nolock,rw,nfsvers=3 192.168.1.100:/home/linux/nfs/rootfs /mnt
  1. Ubuntu将mfgtool下files文件夹拷贝到/home/linux/nfs/rootfs
  2. 串口进入开发板/mnt/files,给脚本添加执行权限
  3. 执行eMMC烧写脚本,回车确认等待完成
  4. 断电切换EMMC拨码,重启开发板

五、模式三:网络启动(驱动开发首选无需反复烧卡)

核心原理

SD卡仅存放U-Boot;内核/设备树从TFTP下载;根文件系统通过NFS远程挂载。修改内核后无需重新烧卡,直接重启生效。

完整分步操作

步骤1:SD卡烧写U-Boot

执行【模式一】SD卡烧录步骤,仅需要uboot即可。

步骤2:准备TFTP、NFS文件
  1. zImageimx6ull-alientek-emmc.dtb复制到/home/linux/tftpboot
  2. rootfs.tar.bz2解压到/home/linux/nfs/rootfs
步骤3:串口进入U-Boot配置环境
  1. SD启动开发板,minicom串口等待倒计时,按任意键进入uboot命令行

  2. 恢复默认环境变量

    env default -a
    saveenv

  3. 配置网络IP参数

    setenv ipaddr 192.168.1.50
    setenv ethaddr 00:04:9f:04:d2:35
    setenv netmask 255.255.255.0
    setenv serverip 192.168.1.100
    setenv gatewayip 192.168.1.1
    saveenv

    测试网络连通

    ping 192.168.1.100

  4. 配置自动下载内核命令bootcmd

    setenv bootcmd 'tftp 80800000 zImage;tftp 83000000 imx6ull-alientek-emmc.dtb;bootz 80800000 - 83000000'
    saveenv

  5. 配置NFS根文件启动参数bootargs

    setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.1.100:/home/linux/nfs,proto=tcp,nfsvers=3 rw ip=192.168.1.50:192.168.1.100:192.168.1.1:255.255.0::eth0:off'
    saveenv

步骤4:启动Linux

uboot命令行输入boot,自动下载内核并挂载NFS文件系统,启动系统。

六、进阶:自行编译U-Boot / Linux内核

6.1 编译U-Boot

  1. 解压uboot源码压缩包
  2. 安装依赖
bash 复制代码
sudo apt-get install libncurses5-dev
  1. 完整编译命令
bash 复制代码
# 清空旧编译文件
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- -j16
  1. 产物:源码顶层u-boot.imx,可替换烧录文件

6.2 编译Linux 4.1.15内核

  1. 解压内核包linux-imx-rel_imx_4.1.15_2.1.0_ga_alientek.tar.gz
  2. 进入源码目录执行编译
bash 复制代码
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm-linux-gnueabihf- imx_alientek_emmc_defconfig
# 图形界面裁剪内核功能
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
# 完整编译
bear make ARCH=arm-linux-gnueabihf- all -j16
  1. 编译输出文件
  • 内核镜像:arch/arm/boot/zImage
  • 设备树:arch/arm/boot/dts/imx6ull-alientek-emmc.dtb
  1. 将两个文件复制到tftpboot目录,网络启动测试新内核

七、开发板拨码三种启动模式说明

启动模式 使用场景
USB启动 仅烧录系统时使用,正常运行不用
SD卡启动 调试开发,频繁更换镜像,新手首选
EMMC启动 产品量产,系统固化板载闪存,断电数据不丢失
相关推荐
时光の尘1 小时前
【凌鸥LKS32】基础篇(二)·Timer定时器实现LED闪烁
单片机·mcu·物联网·iot·timer·lks07
2601_965798472 小时前
Build a Consulting Site in 2026: Nifty Theme Practical Review
java·linux·数据库
加油码2 小时前
共享内存详解:原理、系统调用与高性能进程间通信
linux·c语言·c++
枳实-叶2 小时前
Linux 环境下段错误出现的原因及调试方法
linux·运维·服务器
Dawn-bit2 小时前
Linux文本处理三剑客之sed详解
linux·运维·服务器·云计算·运维开发
Lzh编程小栈2 小时前
【STM32底层精讲】RCC时钟系统超全详解(时钟树+源码+避坑指南)
c语言·stm32·单片机·嵌入式硬件·面试
dok123 小时前
Johannes 《Linux内核模块与设备驱动开发:编写Linux驱动程序》 (9)manual_cdev
linux·运维·驱动开发
Cx330❀3 小时前
【Linux网络】深入 HTTP 协议(五):从 Cookie/Session 原理到 C++ 源码实战
linux·运维·服务器·开发语言·网络·c++·http
keyipatience3 小时前
Socket编程3个版本
linux·运维·服务器·开发语言·网络·ubuntu