告别TFTP/NFS:为imx6ull开发板制作一张‘开箱即用’的OpenWrt系统SD卡
告别TFTP/NFS为imx6ull开发板制作一张‘开箱即用’的OpenWrt系统SD卡在嵌入式开发中imx6ull开发板因其出色的性能和丰富的接口资源成为许多开发者的首选。然而在为这类开发板部署OpenWrt系统时传统的网络启动方式如TFTP加载内核、NFS挂载文件系统常常会遇到各种问题导致系统无法正常引导和配置。本文将介绍一种更稳定、更便捷的部署方式——通过制作一张开箱即用的SD卡实现OpenWrt系统的快速部署。1. 为什么选择SD卡启动方案在嵌入式Linux系统开发中网络启动方式虽然灵活但也存在诸多不稳定因素。以imx6ull开发板为例常见的网络启动问题包括网口识别问题OpenWrt可能将某些网口识别为WAN口导致网络连接失败网络环境依赖需要稳定的TFTP和NFS服务器支持启动速度慢每次启动都需要通过网络加载内核和文件系统调试困难网络问题可能导致启动失败难以定位问题根源相比之下SD卡启动方案具有以下优势独立性强不依赖外部网络环境启动速度快直接从本地存储加载系统可靠性高避免了网络传输过程中的各种问题便携性好一张SD卡即可携带完整的系统环境2. 准备工作与环境搭建在开始制作SD卡之前需要完成以下准备工作2.1 硬件准备正点原子imx6ull开发板EMMC版本至少8GB容量的SD卡读卡器或开发板自带的SD卡槽网线用于后续网络配置2.2 软件准备Ubuntu开发环境推荐18.04或20.04 LTS版本OpenWrt 19.07.2源码正点原子MFG_TOOL烧录工具imx6mksdboot.sh脚本# 安装必要的依赖库 sudo apt-get install subversion g zlib1g-dev build-essential git python python3 \ libncurses5-dev gawk gettext unzip file libssl-dev wget libelf-dev ecj fastjar \ java-propose-classpath asciidoc bzip2 libz-dev libtool2.3 源码下载与配置# 下载OpenWrt 19.07.2源码 wget https://github.com/openwrt/openwrt/archive/v19.07.2.tar.gz tar -xzvf v19.07.2.tar.gz cd openwrt-19.07.2 # 更新和安装feeds ./scripts/feeds update -a ./scripts/feeds install -a # 基础配置 make defconfig make menuconfig在menuconfig界面中需要特别注意以下配置项配置项选择说明Target SystemFreescale i.MX 6选择正确的目标平台Advanced configuration options启用允许开发者选项Toolchain Options → C library implementationglibc选择glibc库3. 内核与系统适配imx6ull开发板与标准i.MX6平台存在一些差异需要进行针对性的适配3.1 修改平台配置进入target/linux/imx6/目录修改Makefile文件将架构从cortex-a9改为cortex-a7启用浮点支持将内核版本从4.14改为4.13.2 准备内核配置文件从开发板的内核源码目录中获取对应的defconfig文件# 假设内核源码位于~/linux-imx cp ~/linux-imx/arch/arm/configs/imx6ul-alientek-emmc_defconfig \ target/linux/imx6/config-4.1 # 删除原有的配置文件 rm target/linux/imx6/config-4.14 rm target/linux/generic/config-4.143.3 编译外部内核在编译OpenWrt之前需要先编译外部内核cd ~/linux-imx make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- imx6ul-alientek-emmc_defconfig make V1 ARCHarm CROSS_COMPILEarm-linux-gnueabihf- zImage dtbs提示内核编译完成后建议保留编译环境以便后续可能的调试和修改。4. 编译OpenWrt系统完成上述准备工作后可以开始编译OpenWrt系统cd ~/openwrt-19.07.2 make V1 -j$(nproc)编译过程中可能会遇到一些文件缺失的问题解决方法通常是在相应目录下查找类似文件复制并重命名为缺失的文件名继续编译过程编译完成后可以在以下目录找到生成的系统组件组件路径根文件系统bin/targets/imx6/generic-glibc/openwrt-imx6-default-rootfs.tar.gz内核镜像build_dir/target-arm_cortex-a7vfpv3-d16_glibc_eabi/linux-imx6/zImage设备树文件build_dir/target-arm_cortex-a7neon-vfpv4_glibc_eabi/linux-imx6/linux-4.1/arch/arm/boot/dts/imx6ul-alientek-emmc.dtb5. 制作可启动SD卡5.1 准备烧录工具从正点原子开发板配套资料中获取MFG_TOOL工具和imx6mksdboot.sh脚本将mfgtool/Profiles/Linux/OS Firmware/files整个文件夹复制到Ubuntu虚拟机确保imx6mksdboot.sh脚本具有可执行权限chmod x imx6mksdboot.sh5.2 替换系统组件进入files目录替换以下文件boot目录用OpenWrt编译的zImage替换原有的zImage用imx6ul-alientek-emmc.dtb替换imx6ull-14x14-emmc-4.3-800x480-c.dtbfilesystem目录将OpenWrt编译的根文件系统打包为rootfs.tar.bz2替换原有文件# 打包根文件系统 cd bin/targets/imx6/generic-glibc/ tar -xjf openwrt-imx6-default-rootfs.tar.gz sudo tar -cjf rootfs.tar.bz2 ./*5.3 执行烧录脚本将SD卡插入读卡器并连接到Ubuntu系统确认设备节点通常为/dev/sdblsblk # 确认SD卡设备节点 sudo ./imx6mksdboot.sh -device /dev/sdb -flash emmc -ddrsize 512注意执行脚本前请确保SD卡中没有重要数据因为该操作会完全擦除SD卡内容。6. 系统启动与配置6.1 启动系统将制作好的SD卡插入开发板将启动拨码开关设置为SD卡启动模式10000010连接电源启动系统6.2 网络配置系统启动后可能会遇到网络接口未正确识别的问题默认情况下eth0可能未被启用尝试将网线连接到ENET1接口手动配置IP地址ifconfig eth1 192.168.10.246.3 启用Web管理界面如果无法访问Web管理界面可能是Luci未正确安装重新配置OpenWrtmake menuconfig进入Luci配置选择Luci → Collections → luci重新编译并烧录系统7. 常见问题与解决方案在实际操作过程中可能会遇到以下问题SD卡无法识别检查拨码开关设置是否正确尝试使用不同的SD卡或读卡器确认烧录过程没有错误系统启动失败检查内核和设备树文件是否正确替换确认根文件系统打包格式正确查看串口输出日志定位问题网络连接问题尝试不同的网口检查IP地址配置确认网络线缆连接正常Web界面无法访问确认Luci已正确安装检查防火墙设置尝试使用不同的浏览器访问通过SD卡部署OpenWrt系统到imx6ull开发板不仅解决了网络启动方式的不稳定性问题还大大简化了系统部署流程。这种方法特别适合需要频繁更换系统或进行现场调试的场景。在实际项目中我发现将常用的工具和配置预先打包到SD卡镜像中可以显著提高开发效率。