ARM Linux 驱动开发篇---TFTP挂载内核设备树,NFS挂载文件系统教程--解决高版本 Ubuntu的nfs挂载系统失败-- Ubuntu20.04

🎬 渡水无言个人主页渡水无言

专栏传送门linux专栏

⭐️流水不争先,争的是滔滔不绝

📚博主简介:第二十届中国研究生电子设计竞赛全国二等奖 |国家奖学金 | 省级三好学生

| 省级优秀毕业生获得者 | csdn新星杯TOP18 | 半导纵横专栏博主 | 211在读研究生

在这里主要分享自己学习的linux嵌入式领域知识;有分享错误或者不足的地方欢迎大佬指导,也欢迎各位大佬互相三连

目录

前言

一、准备工作

1.1、网络环境

1.2、内核文件准备

1.3文件系统准备

[二、TFTP 挂载内核、设备树](#二、TFTP 挂载内核、设备树)

[三、NFS 挂载文件系统](#三、NFS 挂载文件系统)

四、正式进行挂载

4.1测试

4.2挂载系统失败原因

[4.2.1常见的 NFS 挂载失败原因(按优先级排序):](#4.2.1常见的 NFS 挂载失败原因(按优先级排序):)

[Ubuntu 的 NFS 共享目录配置错误(排除)](#Ubuntu 的 NFS 共享目录配置错误(排除))

[NFS 目录权限 / 所有者错误(排除)](#NFS 目录权限 / 所有者错误(排除))

[NFS 服务未重启,配置未生效(排除)](#NFS 服务未重启,配置未生效(排除))

[NFS 协议版本不兼容(问题所在)](#NFS 协议版本不兼容(问题所在))

4.3解决方案

总结


前言

上几期博客我们完成了网络环境、TFTP环境、NFS环境的搭建,本期博客我们来完成TFTP挂载内核设备树,NFS挂载文件系统。


一、准备工作

1.1、网络环境

已经完成网络环境 ping 测试,完成 TFTP 和 NFS 环境搭建和验证。

1.2、内核文件准备

先准备好zImage 文件和 imx6ull-alientek-emmc.dtb 设备树文件,并拷贝到Ubuntu 的 tftp 工作目录下。

赋予这两个文件可读可写可执行权限。

复制代码
sudo chmod 777 zImage imx6ull-alientek-emmc.dtb

最终tftp 工作目录如下:

1.3文件系统准备

在 nfs 共享目录下创建一个 rootfs 目录用于存放文件系统。
再将 busybox 文件系统拷贝到nfs 共享目录下rootfs 文件夹中。
如下图所示:

执行以下指令将文件系统包解压。

复制代码
tar vxjf rootfs.tar.bz2

解压完的文件系统如下。

二、TFTP****挂载内核、设备树

这里将 uboot 烧录到 EMMC 中,进入 uboot 命令行,设置开发板的 IP 信息。

使用如下命令:

复制代码
setenv ipaddr 192.168.10.50
setenv ethaddr 00:04:9f:04:d2:35
setenv gatewayip 192.168.10.1
setenv netmask 255.255.255.0
setenv serverip 192.168.10.100
saveenv

并测试下 uboot 是否能 ping 虚拟机

复制代码
ping 192.168.10.100

注意,uboot 阶段,虚拟机 ping 开发板是没有反馈的,这里不用虚拟机去 ping 开发板。
设置环境变量 bootcmd 来挂载 tftp 目录下的内核、设备树文件到开发板内存中。

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

三、NFS****挂载文件系统

设置环境变量 bootargs 来挂载 nfs 共享目录下的 rootfs 文件系统到开发板内存中。

复制代码
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs \
                nfsroot=192.168.10.100:/home/duan/linux/nfs/rootfs,proto=tcp rw \
                ip=192.168.10.50:192.168.10.100:192.168.10.1:255.255.255.0::eth0:off '
saveenv

注意:绿色标记为单个空格

四、正式进行挂载

4.1测试

环境变量已经设置好了,执行 boot 指令即可使用网络挂载出厂系统。

4.2挂载系统失败原因

从刚才的测试总发现TFTP 加载内核 / 设备树完全正常

内核已识别 NFS 启动参数
日志停在ALSA device list: No soundcards found.没有后续的 NFS 挂载日志,本质原因是:

内核尝试挂载 NFS 根文件系统,但连接 Ubuntu 的 NFS 服务器时超时 / 被拒绝,内核一直在等待 NFS 响应,最终卡住(不会报错,只会静默等待)。

4.2.1常见的 NFS 挂载失败原因(按优先级排序):

Ubuntu 的 NFS 共享目录配置错误(排除)
  • /etc/exports文件中未正确添加/home/duan/linux/nfs/rootfs的共享规则,或规则权限不足;

  • 示例正确配置:/home/duan/linux/nfs/rootfs *(rw,sync,no_root_squash,no_subtree_check)

NFS 目录权限 / 所有者错误(排除)
  • rootfs目录的所有者不是 root,或权限不足(需至少 755);

  • 执行ls -ld /home/duan/linux/nfs/rootfs,确保权限是drwxr-xr-x,所有者是root:root

NFS 服务未重启,配置未生效(排除)
  • 修改/etc/exports/etc/default/nfs-kernel-server后,未执行sudo systemctl restart nfs-kernel-server,配置不生效。

NFS 协议版本不兼容(问题所在)
  • 开发板内核(4.1.15)较老,仅支持 NFSv2/NFSv3,但 Ubuntu 默认可能只开启 NFSv4,导致协议不匹配。

4.3解决方案

经过博主自己逐个测试,发现原因是 **NFS 协议版本不兼容,**开发板内核(4.1.15)比较老,Ubuntu 默认可能只开启 NFSv4,导致协议不匹配。
所以在 U-Boot 命令行补充 NFS 版本参数,强制用 NFSv3,代码如下:

复制代码
 # 清空原有bootargs,重新配置(重点加nfsvers=3)
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.10.100:/home/duan/linux/nfs/rootfs,proto=tcp,nfsvers=3 rw ip=192.168.10.50:192.168.10.100:192.168.10.1:255.255.255.0::eth0:off'

 saveenv
boot  # 重新启动

此时发现挂载系统成功,并可以进入文件系统。


总结

本期博客我们来完成TFTP挂载内核设备树,NFS挂载文件系统,并解决了NFS因为挂载失败的问题。

相关推荐
其实防守也摸鱼14 分钟前
运维--学习阶段问题解答(1)(自测)
linux·运维·服务器·数据库·学习·自动化·命令模式
懒鸟一枚24 分钟前
深入理解 Linux 内存、Swap 交换分区与分页机制的关系
java·linux·数据库
Darkwanderor2 小时前
对Linux的进程控制的研究
linux·运维·c++
bksczm4 小时前
linux之线程概念和控制
linux·开发语言·c++
爱网络爱Linux5 小时前
Linux proc 目录安全加固
linux·运维·rhce·rhca·红帽认证·proc 目录安全加固
hehelm5 小时前
Linux网络编程—TCP字典翻译系统
linux·开发语言·网络·c++·tcp/ip
MindUp5 小时前
企业网盘权限模型解析:多层级访问控制与审计能力选型指南
java·linux·运维
ICECREAM5 小时前
环形队列设计——基于共享内存的高效进程间通信
linux
pt10435 小时前
思科网络自动化-API常用数据编码格式(JSON/XML/YAML)课程与实践
linux·服务器·网络
kdxiaojie5 小时前
Linux 驱动研究 —— I2C (5)
linux·运维·笔记·学习