最近在学习正点原子I.MX6ULL嵌入式Linux开发,完成uboot移植后,想验证网络驱动是否正常工作。前期已搞定开发板、Windows主机、Ubuntu虚拟机的三方互ping(网络基础环境搭建完成),但测试文件传输时遇到了坑:TFTP服务可正常下载文件,NFS服务却持续报错(TTT/ount count等提示),无法下载目标文件。
经过几小时排查,最终定位到是高版本Ubuntu的NFS配置、内核兼容性问题,特此记录解决方案,给遇到同款问题的朋友避坑。
一、环境信息
-
开发板:正点原子I.MX6ULL(uboot已移植完成)
-
虚拟机:Ubuntu 24.04,默认内核 6.15
-
主机:Windows(已完成与开发板、虚拟机的桥接配置,三方互ping通) 网路配置出现问题的可以参考Uboot网路配置问题解决方案
-
目标文件:Ubuntu下
/home/chidao/linux/nfs/zImage(计划通过NFS传输到开发板)
二、问题现象与初步排查
1. 异常现象
开发板uboot中执行NFS下载命令,持续报错(提示 TTT 或 ount count),文件下载失败;但切换为TFTP服务下载同文件时,可正常传输。
2. 初步排查(排除基础问题)
由于开发板、主机、虚拟机已互ping通,且TFTP正常,说明:
-
网络物理链路、IP配置(同网段)无问题
-
uboot网络驱动工作正常
-
问题聚焦于 NFS服务端(Ubuntu)的配置/兼容性 上
三、核心原因分析
排查后发现,问题源于Ubuntu 24.04(高版本)与uboot NFS客户端的兼容性差异,主要有3点:
-
Ubuntu 24.04 内核6.15默认禁用NFSv2:uboot的NFS客户端仅支持NFSv2版本,而高版本Ubuntu(含内核6.15)已移除/禁用NFSv2,仅保留v3/v4,导致版本不兼容
-
NFS共享目录配置不当:未正确配置共享文件夹权限,导致开发板无访问权限
-
UDP服务未启用:NFSv2依赖UDP协议,Ubuntu默认可能禁用NFS的UDP支持,导致传输失败
验证版本命令(Ubuntu终端执行): sudo cat /proc/fs/nfsd/versions 若输出中无 +2(表示支持v2),则确认是NFSv2不兼容问题。
四、解决方案(分步操作)
核心思路:降低Ubuntu内核以支持NFSv2 → 配置NFS共享与版本/协议 → 重启服务验证
步骤1:降低Ubuntu内核至5.19.0(支持NFSv2)
Ubuntu 24.04默认内核6.15禁用NFSv2,需降级至5.19.0(经测试可完美支持NFSv2),方案参考Ubuntu 24.04.2 LTS 内核降级教程。
1.1 查看当前内核与系统架构
# 查看当前运行内核版本uname -r
# 查看系统已安装的所有内核dpkg --list | grep linux-image
# 查看系统架构(amd64/arm64等,后续下载内核需匹配)dpkg --print-architecture1.2 下载并安装5.19.0内核
创建shell脚本批量下载安装(避免手动下载出错),步骤如下:
# 1. 创建脚本文件(命名为 install_kernel_5.19.sh)touch install_kernel_5.19.shchmod +x install_kernel_5.19.sh # 赋予可执行权限
# 2. 编辑脚本(复制以下内容,注意ARCH需匹配自己的系统架构)vim install_kernel_5.19.sh脚本内容(ARCH默认amd64,若为arm64/armhf需修改):
#!/bin/bash
set -e # 执行出错时立即退出
VER=5.19.0-051900ARCH=amd64 # 架构匹配:arm64/armhf 请修改此处URL=https://kernel.ubuntu.com/mainline/v5.19
# 1. 创建临时目录,避免文件混乱mkdir -p ~/kernel-5.19 && cd ~/kernel-5.19
# 2. 下载4个核心deb包(内核 headers + image + modules)wget ${URL}/${ARCH}/linux-headers-${VER}_${VER}.202207312230_all.debwget ${URL}/${ARCH}/linux-headers-${VER}-generic_${VER}.202207312230_${ARCH}.debwget ${URL}/${ARCH}/linux-image-unsigned-${VER}-generic_${VER}.202207312230_${ARCH}.debwget ${URL}/${ARCH}/linux-modules-${VER}-generic_${VER}.202207312230_${ARCH}.deb
# 3. 安装内核包sudo dpkg -i *.deb
# 4. 清理临时文件(可选,也可保留用于后续卸载)echo "内核安装完成,清理临时文件..."rm -rf ~/kernel-5.191.3 执行脚本并验证安装
# 执行安装脚本sudo ./install_kernel_5.19.sh
# 验证5.19.0内核是否安装成功dpkg --list | grep linux-image若输出中包含 linux-image-unsigned-5.19.0-051900-generic,则安装成功。
1.4 切换默认启动内核为5.19.0
# 编辑grub启动配置sudo vim /etc/default/grub
# 修改GRUB_DEFAULT(指定默认启动5.19.0内核)GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 5.19.0-051900-generic"
# 更新grub配置sudo update-grub
# 重启虚拟机(生效内核)sudo reboot重启后执行 uname -r,若输出 5.19.0-051900-generic,则内核切换成功。
步骤2:配置NFS服务(共享目录+版本+协议)
2.1 配置NFS共享文件夹
指定需要共享给开发板的目录(即本文的 /home/chidao/linux/nfs),并配置权限:
# 编辑NFS共享配置文件sudo vim /etc/exports
# 在文件末尾添加以下内容(替换为自己的共享目录路径)/home/你的用户名/linux/nfs *(rw,sync,no_root_squash)参数说明:
-
*:允许所有设备访问(嵌入式开发场景简化配置,也可指定开发板IP) -
rw:读写权限 -
sync:同步写入磁盘(避免文件丢失) -
no_root_squash:开发板root用户拥有共享目录的root权限(避免权限不足)
2.2 强制NFS服务支持v2版本
编辑NFS内核服务配置,指定启用NFSv2:
sudo vim /etc/default/nfs-kernel-server修改以下5项配置(确保启用v2):

2.3 启用NFS的UDP服务
NFSv2依赖UDP协议,需配置启用UDP支持:
sudo vim /etc/nfs.conf修改以下配置(启用UDP):

2.4 重启NFS服务(生效配置)
sudo /etc/init.d/nfs-kernel-server restart
# 验证NFS服务状态(可选)sudo /etc/init.d/nfs-kernel-server status若输出 active (running),则服务重启成功。
五、验证测试
重启开发板,进入uboot终端,执行NFS下载命令(示例):
nfs 80800000 192.168.1.101:/home/chidao/linux/nfs/zImage参数说明:
-
80800000:开发板内存地址(根据自己的uboot配置调整) -
192.168.1.101:Ubuntu虚拟机IP(serverip) -
/home/chidao/linux/nfs/zImage:Ubuntu共享目录下的目标文件
若命令执行后无报错,显示文件传输进度(如 100% 完成),则NFS下载正常,问题解决!
六、注意事项(避坑提醒)
-
内核降级后,若重启仍进入旧内核:可在开机GRUB菜单中手动选择「Advanced options for Ubuntu」→「5.19.0内核」启动,再重新执行
sudo update-grub固化配置 -
共享目录权限问题:若仍提示权限不足,可执行
sudo chmod -R 777 /home/你的用户名/linux/nfs临时开放权限(仅开发测试环境使用) -
防火墙干扰:Ubuntu防火墙可能拦截NFS端口,可临时关闭防火墙测试:
sudo ufw disable -
uboot参数:确保uboot中
serverip(Ubuntu IP)、ipaddr(开发板IP)配置正确,且与主机同网段
七、总结
高版本Ubuntu(如24.04)与uboot NFSv2的兼容性问题是核心坑点,通过「内核降级+NFS配置调整」可完美解决。核心逻辑是:让NFS服务端(Ubuntu)支持uboot所需的NFSv2版本与UDP协议,同时配置正确的共享权限。
如果TFTP正常但NFS报错,优先排查NFS版本兼容性和协议配置,基本能定位问题~
部分信息可能已经过时





