1. 环境准备与源码获取在开始为imx6ull开发板构建OpenWrt之前我们需要先搭建好开发环境。我建议使用Ubuntu 20.04 LTS作为开发主机系统这个版本经过长期验证对各种开发工具的支持最为稳定。实测在16.04和18.04上也能运行但可能会遇到一些依赖库版本问题。首先安装基础编译工具链这个步骤我踩过不少坑发现有些教程会漏掉关键依赖。建议直接执行以下完整命令sudo apt-get update sudo apt-get install -y subversion g zlib1g-dev build-essential git python3 \ libncurses5-dev gawk gettext unzip file libssl-dev wget libelf-dev ecj fastjar \ java-propose-classpath asciidoc bzip2 libz-dev libtool binutils接下来获取OpenWrt源码。这里有个重要选择是用稳定版还是开发版对于imx6ull这种相对成熟的平台我推荐使用19.07.7这个长期支持版本LTS它的兼容性更好。下载解压命令如下wget https://downloads.openwrt.org/releases/19.07.7/targets/imx6/generic/openwrt-19.07.7-imx6-generic.tar.gz tar -xvf openwrt-19.07.7-imx6-generic.tar.gz cd openwrt-19.07.7进入源码目录后需要更新和安装feeds。这里有个小技巧国内用户可能会遇到下载慢的问题可以先用export GIT_SSL_NO_VERIFY1临时关闭SSL验证加速下载./scripts/feeds update -a ./scripts/feeds install -a2. 内核与架构适配imx6ull使用的是Cortex-A7架构而OpenWrt官方默认配置是针对i.MX6的Cortex-A9。这个差异会导致编译出的固件无法正常运行我当初就在这里卡了两天。需要修改的关键文件是target/linux/imx6/Makefile主要调整三个参数将CPU_TYPE从cortex-a9改为cortex-a7vfpv4启用浮点运算支持CPU_CFLAGS增加-mfpuneon-vfpv4内核版本匹配将LINUX_VERSION改为4.1对应imx6ull官方BSP修改后的关键部分应该如下CPU_TYPE : cortex-a7vfpv4 CPU_CFLAGS : -O2 -pipe -mcpucortex-a7 -mfpuneon-vfpv4 -mfloat-abihard LINUX_VERSION : 4.1.15接下来处理内核配置。需要从你的imx6ull内核源码中拷贝配置文件cp /path/to/your/linux-imx/arch/arm/configs/imx6ull_defconfig \ target/linux/imx6/config-4.1这里有个隐藏坑点如果直接使用4.1.15完整版本号可能会报错建议先用4.1通用版本。我在正点原子V1.9开发板上实测有效。3. 系统配置与定制执行make menuconfig进入配置界面后需要重点关注以下几个部分3.1 基础平台选择在Target System中选择(Freescale i.MX 6)然后在Subtarget里选(Generic with glibc)。这里一定要选glibcmusl库虽然体积小但兼容性差很多软件包会出问题。3.2 工具链配置进入Advanced configuration options → Toolchain Options选择glibc作为C库启用Build with SSP support增强安全性设置Binutils Version为2.31与内核版本最匹配3.3 网络驱动配置imx6ull通常有两个网口需要在Kernel modules → Network Devices中确认kmod-fecIMX6内置FEC驱动kmod-igb如果使用PCIe网卡特别注意正点原子开发板的ENET2eth0默认用作WAN口这在设备树里已经固定所以后面调试时网线要插在ENET1eth1上。4. Luci界面与软件包定制要让开发板支持网页管理需要正确配置Luci。很多教程只让选luci这个meta package但实际还需要额外配置在LuCI → Collections中选择luci基础框架luci-sslHTTPS支持luci-theme-bootstrap默认主题在LuCI → Applications中添加常用功能luci-app-firewall防火墙配置luci-app-opkg软件包管理luci-app-statistics流量监控推荐添加的实用软件包tcpdump网络抓包iperf3带宽测试vim-full完整版编辑器openssh-sftp-server文件传输有个常见误区很多人以为选了luci就自动包含所有功能实际上很多应用需要单独勾选。我第一次编译时就漏了luci-ssl结果只能通过HTTP访问非常不安全。5. 编译与问题排查开始编译前建议先清理环境make clean make dirclean然后启动编译进程根据你的CPU核心数调整-j参数make -j$(nproc) Vs编译过程中最常遇到的三个问题及解决方案下载失败由于网络问题导致包下载不完整解决方法手动下载到dl/目录示例wget -P dl/ https://.../package.tar.gz内核版本不匹配error: Linux version mismatch (expected 4.1.15, got 4.1.0)解决方法确保内核源码和配置文件版本一致未定义符号错误undefined reference to __stack_chk_guard解决方法在make menuconfig中启用SSP支持编译成功后固件会生成在bin/targets/imx6/generic-glibc/目录下主要文件包括openwrt-imx6-zImage内核镜像openwrt-imx6-root.ext4根文件系统imx6ull-14x14-emmc.dtb设备树6. 烧录与启动正点原子开发板支持多种启动方式我推荐使用SD卡烧录方案最方便调试。具体步骤准备SD卡建议8GB以上使用官方提供的imx6mksdboot.sh脚本sudo ./imx6mksdboot.sh -device /dev/sdX -flash emmc -ddrsize 512注意替换/dev/sdX为你的实际设备名关键文件替换将编译生成的zImage替换boot/zImage用imx6ull-alientek-emmc.dtb替换boot/imx6ull-14x14-emmc.dtb将rootfs.tar.bz2替换filesystem/下的对应文件设置开发板拨码开关为SD卡启动模式10000010首次启动时建议连接串口查看日志正常会看到[ 0.000000] Booting Linux on physical CPU 0x0 [ 0.000000] Linux version 4.1.15 (userhost) ... [ 1.234567] fec 2188000.ethernet eth0: registered PHC device 07. 网络配置与调试系统启动后默认网络配置可能不符合你的需求需要手动调整连接开发板ENET1口eth1到路由器通过串口登录root无密码配置IP地址uci set network.lan.ipaddr192.168.1.1 uci commit /etc/init.d/network restart如果无法访问Luci界面检查防火墙是否放行iptables -I INPUT -p tcp --dport 80 -j ACCEPTLuci服务是否运行/etc/init.d/uhttpd status接口是否启用ifconfig eth1 up我在实际项目中遇到过网页界面空白的问题原因是缺少luci-theme-bootstrap主题包重新编译添加后解决。另一个常见问题是Wi-Fi驱动不工作对于imx6ull需要额外配置kmod-ath9k等驱动模块。8. 进阶定制技巧完成基础系统搭建后你可能还需要这些高级功能8.1 添加自定义软件包在package/目录下创建新目录编写Makefileinclude $(TOPDIR)/rules.mk PKG_NAME:myapp PKG_VERSION:1.0 PKG_RELEASE:1 include $(INCLUDE_DIR)/package.mk define Package/myapp SECTION:utils CATEGORY:Utilities TITLE:My Custom Application endef define Package/myapp/install $(INSTALL_DIR) $(1)/usr/bin $(INSTALL_BIN) $(PKG_BUILD_DIR)/myapp $(1)/usr/bin/ endef $(eval $(call BuildPackage,myapp))8.2 优化启动速度通过分析dmesg输出我发现主要耗时在网络接口初始化可延迟加载文件系统检查对emmc可以禁用不必要的服务启动如dnsmasq优化方案uci set boot.delay5 uci set fstab.global[0].check_fs0 uci set dhcp.lan.ignore1 uci commit8.3 构建OTA升级镜像生成可用于网络升级的固件make -j$(nproc) Vs sysupgrade.tar这个sysupgrade.tar可以通过Luci界面直接上传升级适合量产部署。
imx6ull实战:从零构建定制化OpenWrt固件
1. 环境准备与源码获取在开始为imx6ull开发板构建OpenWrt之前我们需要先搭建好开发环境。我建议使用Ubuntu 20.04 LTS作为开发主机系统这个版本经过长期验证对各种开发工具的支持最为稳定。实测在16.04和18.04上也能运行但可能会遇到一些依赖库版本问题。首先安装基础编译工具链这个步骤我踩过不少坑发现有些教程会漏掉关键依赖。建议直接执行以下完整命令sudo apt-get update sudo apt-get install -y subversion g zlib1g-dev build-essential git python3 \ libncurses5-dev gawk gettext unzip file libssl-dev wget libelf-dev ecj fastjar \ java-propose-classpath asciidoc bzip2 libz-dev libtool binutils接下来获取OpenWrt源码。这里有个重要选择是用稳定版还是开发版对于imx6ull这种相对成熟的平台我推荐使用19.07.7这个长期支持版本LTS它的兼容性更好。下载解压命令如下wget https://downloads.openwrt.org/releases/19.07.7/targets/imx6/generic/openwrt-19.07.7-imx6-generic.tar.gz tar -xvf openwrt-19.07.7-imx6-generic.tar.gz cd openwrt-19.07.7进入源码目录后需要更新和安装feeds。这里有个小技巧国内用户可能会遇到下载慢的问题可以先用export GIT_SSL_NO_VERIFY1临时关闭SSL验证加速下载./scripts/feeds update -a ./scripts/feeds install -a2. 内核与架构适配imx6ull使用的是Cortex-A7架构而OpenWrt官方默认配置是针对i.MX6的Cortex-A9。这个差异会导致编译出的固件无法正常运行我当初就在这里卡了两天。需要修改的关键文件是target/linux/imx6/Makefile主要调整三个参数将CPU_TYPE从cortex-a9改为cortex-a7vfpv4启用浮点运算支持CPU_CFLAGS增加-mfpuneon-vfpv4内核版本匹配将LINUX_VERSION改为4.1对应imx6ull官方BSP修改后的关键部分应该如下CPU_TYPE : cortex-a7vfpv4 CPU_CFLAGS : -O2 -pipe -mcpucortex-a7 -mfpuneon-vfpv4 -mfloat-abihard LINUX_VERSION : 4.1.15接下来处理内核配置。需要从你的imx6ull内核源码中拷贝配置文件cp /path/to/your/linux-imx/arch/arm/configs/imx6ull_defconfig \ target/linux/imx6/config-4.1这里有个隐藏坑点如果直接使用4.1.15完整版本号可能会报错建议先用4.1通用版本。我在正点原子V1.9开发板上实测有效。3. 系统配置与定制执行make menuconfig进入配置界面后需要重点关注以下几个部分3.1 基础平台选择在Target System中选择(Freescale i.MX 6)然后在Subtarget里选(Generic with glibc)。这里一定要选glibcmusl库虽然体积小但兼容性差很多软件包会出问题。3.2 工具链配置进入Advanced configuration options → Toolchain Options选择glibc作为C库启用Build with SSP support增强安全性设置Binutils Version为2.31与内核版本最匹配3.3 网络驱动配置imx6ull通常有两个网口需要在Kernel modules → Network Devices中确认kmod-fecIMX6内置FEC驱动kmod-igb如果使用PCIe网卡特别注意正点原子开发板的ENET2eth0默认用作WAN口这在设备树里已经固定所以后面调试时网线要插在ENET1eth1上。4. Luci界面与软件包定制要让开发板支持网页管理需要正确配置Luci。很多教程只让选luci这个meta package但实际还需要额外配置在LuCI → Collections中选择luci基础框架luci-sslHTTPS支持luci-theme-bootstrap默认主题在LuCI → Applications中添加常用功能luci-app-firewall防火墙配置luci-app-opkg软件包管理luci-app-statistics流量监控推荐添加的实用软件包tcpdump网络抓包iperf3带宽测试vim-full完整版编辑器openssh-sftp-server文件传输有个常见误区很多人以为选了luci就自动包含所有功能实际上很多应用需要单独勾选。我第一次编译时就漏了luci-ssl结果只能通过HTTP访问非常不安全。5. 编译与问题排查开始编译前建议先清理环境make clean make dirclean然后启动编译进程根据你的CPU核心数调整-j参数make -j$(nproc) Vs编译过程中最常遇到的三个问题及解决方案下载失败由于网络问题导致包下载不完整解决方法手动下载到dl/目录示例wget -P dl/ https://.../package.tar.gz内核版本不匹配error: Linux version mismatch (expected 4.1.15, got 4.1.0)解决方法确保内核源码和配置文件版本一致未定义符号错误undefined reference to __stack_chk_guard解决方法在make menuconfig中启用SSP支持编译成功后固件会生成在bin/targets/imx6/generic-glibc/目录下主要文件包括openwrt-imx6-zImage内核镜像openwrt-imx6-root.ext4根文件系统imx6ull-14x14-emmc.dtb设备树6. 烧录与启动正点原子开发板支持多种启动方式我推荐使用SD卡烧录方案最方便调试。具体步骤准备SD卡建议8GB以上使用官方提供的imx6mksdboot.sh脚本sudo ./imx6mksdboot.sh -device /dev/sdX -flash emmc -ddrsize 512注意替换/dev/sdX为你的实际设备名关键文件替换将编译生成的zImage替换boot/zImage用imx6ull-alientek-emmc.dtb替换boot/imx6ull-14x14-emmc.dtb将rootfs.tar.bz2替换filesystem/下的对应文件设置开发板拨码开关为SD卡启动模式10000010首次启动时建议连接串口查看日志正常会看到[ 0.000000] Booting Linux on physical CPU 0x0 [ 0.000000] Linux version 4.1.15 (userhost) ... [ 1.234567] fec 2188000.ethernet eth0: registered PHC device 07. 网络配置与调试系统启动后默认网络配置可能不符合你的需求需要手动调整连接开发板ENET1口eth1到路由器通过串口登录root无密码配置IP地址uci set network.lan.ipaddr192.168.1.1 uci commit /etc/init.d/network restart如果无法访问Luci界面检查防火墙是否放行iptables -I INPUT -p tcp --dport 80 -j ACCEPTLuci服务是否运行/etc/init.d/uhttpd status接口是否启用ifconfig eth1 up我在实际项目中遇到过网页界面空白的问题原因是缺少luci-theme-bootstrap主题包重新编译添加后解决。另一个常见问题是Wi-Fi驱动不工作对于imx6ull需要额外配置kmod-ath9k等驱动模块。8. 进阶定制技巧完成基础系统搭建后你可能还需要这些高级功能8.1 添加自定义软件包在package/目录下创建新目录编写Makefileinclude $(TOPDIR)/rules.mk PKG_NAME:myapp PKG_VERSION:1.0 PKG_RELEASE:1 include $(INCLUDE_DIR)/package.mk define Package/myapp SECTION:utils CATEGORY:Utilities TITLE:My Custom Application endef define Package/myapp/install $(INSTALL_DIR) $(1)/usr/bin $(INSTALL_BIN) $(PKG_BUILD_DIR)/myapp $(1)/usr/bin/ endef $(eval $(call BuildPackage,myapp))8.2 优化启动速度通过分析dmesg输出我发现主要耗时在网络接口初始化可延迟加载文件系统检查对emmc可以禁用不必要的服务启动如dnsmasq优化方案uci set boot.delay5 uci set fstab.global[0].check_fs0 uci set dhcp.lan.ignore1 uci commit8.3 构建OTA升级镜像生成可用于网络升级的固件make -j$(nproc) Vs sysupgrade.tar这个sysupgrade.tar可以通过Luci界面直接上传升级适合量产部署。