正点原子 imx6ull linux 内核与设备树优化及NFS挂载实战

张开发
2026/4/10 18:57:02 15 分钟阅读

分享文章

正点原子 imx6ull linux 内核与设备树优化及NFS挂载实战
1. 环境准备与源码获取在开始操作之前我们需要准备好开发环境和源码包。我建议使用Ubuntu 18.04或20.04 LTS版本这是经过验证比较稳定的选择。首先确保你的系统已经安装了必要的编译工具链sudo apt update sudo apt install build-essential flex bison libssl-dev libncurses5-dev正点原子官方提供的Linux源码包通常是一个压缩文件文件名类似linux-imx-rel_imx_4.1.15_2.1.0_ga_alientek.tar.bz2。下载后建议放在用户主目录下新建的工作目录中比如~/imx6ull。解压时我发现一个细节问题有些新手会直接用图形界面解压这可能导致文件权限问题。更稳妥的做法是用命令行mkdir -p ~/imx6ull cd ~/imx6ull tar -vxjf linux-imx-rel_imx_4.1.15_2.1.0_ga_alientek.tar.bz2解压后会生成一个名为linux-imx-rel_imx_4.1.15_2.1.0_ga_alientek的目录这就是我们的内核源码目录。建议把这个目录重命名为更简单的名字比如linux-kernel方便后续操作mv linux-imx-rel_imx_4.1.15_2.1.0_ga_alientek linux-kernel2. 设备树修改实战设备树(Device Tree)是嵌入式Linux系统中描述硬件配置的重要机制。在正点原子imx6ull开发板上默认的设备树文件会启用板载的LED灯但实际项目中我们可能需要禁用这些LED以释放GPIO资源。找到设备树文件的正确路径很关键。在源码目录中设备树文件位于arch/arm/boot/dts/目录下。对于EMMC版本的开发板我们需要修改的文件是imx6ull-alientek-emmc.dts。我建议使用VSCode或Vim这类专业编辑器来修改cd linux-kernel/arch/arm/boot/dts code imx6ull-alientek-emmc.dts在文件中找到LED相关的节点通常在leds部分。这里有个实用技巧可以使用搜索功能查找/leds快速定位。找到后在对应的节点添加禁用状态led { compatible gpio-leds; status disabled; // 添加这行禁用LED ... };有时候你可能需要禁用多个LED这时候要注意每个LED节点的命名可能不同比如led0、led1等。建议仔细查看设备树文件确保修改的是正确的节点。修改完成后保存文件但先不要急着编译我们还需要检查其他可能需要调整的硬件配置。3. 内核与设备树编译编译过程看似简单但实际操作中有很多需要注意的细节。首先确保你已经安装了交叉编译工具链。正点原子通常提供配套的工具链如果没有可以使用以下命令安装sudo apt install gcc-arm-linux-gnueabihf编译设备树相对简单在源码根目录执行make dtbs但编译内核就需要更多参数了。我建议先清理之前的编译结果特别是如果你之前编译过其他版本make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- distclean然后是配置内核。正点原子通常提供默认配置文件make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- imx_v7_defconfig如果你想自定义内核功能可以使用菜单配置界面make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- menuconfig在menuconfig界面中新手常犯的错误是随意修改配置导致内核无法启动。我建议除非你明确知道某个功能的作用否则不要轻易修改。配置完成后开始编译内核make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- all -j$(nproc)这里的-j$(nproc)参数会根据你的CPU核心数自动设置并行编译任务数可以显著加快编译速度。编译完成后生成的镜像文件位于arch/arm/boot/zImage设备树二进制文件在arch/arm/boot/dts/imx6ull-alientek-emmc.dtb。4. NFS环境配置与挂载NFS(Network File System)是开发过程中非常实用的工具可以避免频繁烧写镜像。首先在Ubuntu上安装NFS服务sudo apt install nfs-kernel-server然后配置NFS共享目录。编辑/etc/exports文件添加你的共享目录比如/home/yourname/nfs_rootfs *(rw,sync,no_root_squash,no_subtree_check)这里有几个重要参数需要注意rw表示可读写sync表示同步写入no_root_squash允许root权限访问no_subtree_check提高性能配置完成后重启NFS服务sudo systemctl restart nfs-kernel-server将编译好的zImage和imx6ull-alientek-emmc.dtb复制到NFS共享目录cp arch/arm/boot/zImage ~/nfs_rootfs/ cp arch/arm/boot/dts/imx6ull-alientek-emmc.dtb ~/nfs_rootfs/5. 开发板网络与启动配置开发板需要通过uboot配置网络参数。连接串口后在启动时快速按回车进入uboot命令行。设置IP地址等网络参数setenv ipaddr 192.168.10.50 setenv ethaddr b8:ae:1d:01:00:00 setenv gatewayip 192.168.10.1 setenv netmask 255.255.255.0 setenv serverip 192.168.10.110 saveenv这里要注意IP地址的设置必须与你的实际网络环境匹配。特别是serverip应该设置为你的Ubuntu主机的IP地址。接下来设置启动参数setenv bootargs consolettymxc0,115200 root/dev/mmcblk1p2 rootwait rw saveenv手动挂载内核和设备树进行测试nfs 80800000 192.168.10.110:/home/yourname/nfs_rootfs/zImage nfs 83000000 192.168.10.110:/home/yourname/nfs_rootfs/imx6ull-alientek-emmc.dtb bootz 80800000 - 83000000如果一切正常系统应该能够成功启动。为了后续方便可以设置自动挂载setenv bootcmd nfs 80800000 192.168.10.110:/home/yourname/nfs_rootfs/zImage; nfs 83000000 192.168.10.110:/home/yourname/nfs_rootfs/imx6ull-alientek-emmc.dtb;bootz 80800000 - 83000000 saveenv6. 常见问题排查在实际操作中你可能会遇到各种问题。以下是我总结的几个常见问题及解决方法NFS挂载失败首先检查Ubuntu防火墙是否关闭可以使用sudo ufw disable临时关闭。然后确认NFS服务正常运行可以用showmount -e localhost查看共享目录是否可见。内核启动卡住这通常是因为设备树配置不正确。建议先使用未修改的设备树文件测试确认问题是否由你的修改引起。也可以尝试在uboot中增加earlyprintk参数查看早期启动信息。网络不通检查网线连接确认开发板和主机在同一局域网。可以用ping命令测试连通性。有时候需要调整uboot中的网络延迟参数setenv ethprime usb0; setenv ethact usb0。编译错误最常见的原因是工具链不匹配。确保你使用的交叉编译工具链版本与内核版本兼容。也可以尝试清理后重新编译make clean make mrproper。设备树修改不生效有时候修改了设备树但系统行为没有变化这可能是因为1) 修改的节点不正确2) 没有重新编译设备树3) 开发板加载的是旧版设备树文件。确保每次修改后都重新编译并确认开发板加载的是新版文件。

更多文章