NFS挂载文件系统需要的内核和uboot的配置

本文介绍如何通过NFS网络文件系统挂载文件系统以提高嵌入式开发效率,避免频繁烧录文件系统带来的问题。主要内容包括内核编译支持、U-boot设置、NFS服务器搭建等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自己用busybox做了一个文件系统,然后建了个home目录,在里面开发应用程序,应用程序大概是这样做的:

在Ubuntu虚拟机中用交叉编译器编译写好的应用程序,然后用arm-none-linux-gnueabi-readelf看应用程序运行需要哪些动态库,把他们拷贝到自己做的文件系统中的lib目录中就可以。

中途,我这样想过,把整个的交叉编译器都放到自己的文件系统中去,这样在自己的开发板上编译,再运行,也不需要拷贝什么动态库,这个突发的想象据说可以的,毕竟现在都是一二G的内存了吗,但实际上需要的动态库和动态链接加载器就那么六七个文件,还好。


但让人不爽的就是:没改一次应用,都要重新用fastboot烧录一下文件系统,来验证,这样既缩短了flash的使用寿命,也浪费时间,于是nfs网络文件系统是一个不错的选择。以前玩过,但自己来做就又是一回事,经过好几天的折腾,终于弄出来了,现把经验总结如下:

要想以NFS方式挂载文件系统,需要做以下几个工作:

一、编译内核,以支持使用NFS

参考文章:http://blog.chinaunix.net/uid-24219701-id-3029945.html


在编译内核的过程中,也出了点小问题,就是有个不需要的触摸屏驱动程序有问题,编译不过,于是修改了.config文件,把那个GT9XX的触摸屏的配置用#注释掉了,再编译的时候选择n,就编译出了我们需要的zImage。

二、U-boot中bootargs的设置

启动开发板后迅速敲空格键使得开发板停留在u-boot命令行终端,然后设置bootargs参数:

setenv bootargs root=/dev/nfs console=ttySAC2,115200n8 init=/linuxrc nfsroot=192.168.1.20:/home/cxy/linux_AP/_install ip=192.168.1.12:192.168.1.20:192.168.1.1:255.255.255.0::eth0:on

saveenv

注意:ip设置中,第一个是目标板IP,第二个是nfs服务器主机的IP,后面的是目标板的,但是要注意这里目标板的要和主机的配置一样,网关地址要一样,我就在这里忽视啦。


至于主机上nfs服务器的安装,我用的是Ubuntu 12.04.5的虚拟机,我的nfs服务器就安装了两个软件:

sudo apt-get install nfs-kernel-server

sudo apt-get install nfs-common

用sudo /etc/init.d/nfs-kernel-server restart重启nfs服务。

showmount -e查看输出的共享目录


### 配置 U-Boot 使用 NFS 挂载文件系统 在嵌入式开发环境中,U-Boot 是常用的引导加载程序之一。为了方便调试测试目的,通常会配置 U-Boot 通过网络文件系统 (NFS) 来挂载文件系统。 #### 设置环境变量 设置合适的环境变量对于成功启动 Linux 并挂载 NFS 文件系统至关重要。这些变量定义了内核参数以及如何连接到 NFS 服务器: ```bash setenv bootargs 'console=ttyS0,115200 root=/dev/nfs rw nfsroot=${serverip}:${path},tcp ip=dhcp' ``` 上述命令设置了 `bootargs` 变量来指定控制台端口、波特率、根文件系统的路径以及其他必要的选项[^5]。 其中 `${serverip}` `${path}` 应替换为实际的 NFS 服务器 IP 地址及其共享目录的位置;如果使用 DHCP 获取 IP,则可以直接采用默认值 `dhcp` 对于 `ip=` 参数部分。 #### 加载内核设备树 接着需要从远程位置获取 Linux 内核镜像及对应的设备树 Blob (DTB),这可以通过 TFTP 协议完成: ```bash tftp ${loadaddr} zImage tftp ${fdt_addr_r} sun7i-a20-cubieboard2.dtb ``` 这里假设已经预先设定了两个地址寄存器 (`${loadaddr}`,`${fdt_addr_r}`),用于存储下载的数据缓冲区起点[^3]。 #### 执行启动指令 最后一步就是调用 `bootm` 命令执行刚刚传送到 RAM 的内核映像,并传递 DTB 给它作为硬件描述信息的一部分: ```bash bootm ${loadaddr} - ${fdt_addr_r} ``` 此操作将会触发 ARM 架构下的 Linux 系统初始化流程,并尝试按照之前设定好的方式去寻找并挂载 NFS 提供的服务作为其根文件系统。 #### 创建必要节点 另外,在某些情况下可能还需要确保目标板上的 `/dev` 下存在一些基本字符型设备节点,比如串行接口或伪终端等。可以在构建 RootFS 映像前手动创建它们,或者借助 BusyBox 工具自动生成所需资源[^4]: ```bash sudo mknod /mnt/rootfs/dev/tty1 c 4 1 sudo mknod /mnt/rootfs/dev/console c 5 1 ... ``` 以上步骤展示了完整的基于 U-Boot 实现 NFS文件系统的过程,涵盖了从准备阶段直到最终运行的关键环节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值