前言

 采用的开发环境是Ubuntu14.04和iMX-283A开发板,通过在ubuntu上搭建NFS服务器,实现开发板远程启动根文件系统。

NFS服务器介绍

 NFS 即网络文件系统(Network File-System),可以通过网络让不同机器、不同系统之间可以实现文件共享。通过 NFS,可以访问远程共享目录,就像访问本地磁盘一样,NFS只是一种文件系统,本身并没有传输功能,是基于 RPC(远程过程调用) 协议实现的,采用 C/S 架构。

 在嵌入式 Linux 开发中,需要在 Linux 主机为目标机编写程序代码,然后编译程序,生成的程序是要传输到目标机上才能调试、运行。那么如何更快、更便捷地传输文件,将影响到开发工作的效率。 NFS 无疑是最好的选择。通过 NFS 服务,主机可以将自己系统中某个指定目录通过网络共享给目标机(和 Windows 的文件网络共享类似)。目标机可以直接运行存放于 Linux 主机共享目录下的程序。这样调试程序时十分方便。同样,开发板可以通过NFS远程启动存放在Linux主机上的根文件系统,这样无需考虑根文件系统过大的问题,等项目开发完成后,再进行根文件系统剪裁。

ubuntu上配置NFS

  • 安装NFS服务器:sudo apt-get install nfs-kernel-server
  • 安装NFS客户端:sudo apt-get install nfs-common
  • 添加 NFS 共享目录:sudo vi /etc/exports  文件末尾添加:/nfsroot *(rw,sync,no_root_squash),意思就是在 / 目录下创建共享目录。
     *:允许任何网段 IP 的系统访问该 NFS 目录
     rw:共享目录可读可写
     sync:将数据同步写入内存缓冲区和磁盘中,效率低,但是可以保证数据的一致性。
     no_root_squash:NFS不检查父目录的权限,提高效率。
  • 启动 NFS 服务:sudo /etc/init.d/nfs-kernel-server start
  • 重新启动NFS服务:sudo /etc/init.d/nfs-kernel-server restart

开发板远程启动根文件系统rootfs

  • 将根文件系统压缩包复制到目录 /nfsroot下,并解压!
  • nfs设置开机自启_嵌入式

  • 配置开发板的ip地址,保证开发板和ubuntu能正常通信。如果不会配置的朋友可以移步至:ubuntu和开发板通信配置
  • 屏蔽自启动文件中ip地址
     一般厂家都会默认配置一个ip地址,开发板默认使用这个ip地址会导致开发板与ubuntu不能正常通信,最终导致根文件启动失败。
     vim打开/nfsroot/rootfs/etc/rc.d/init.d/start_userapp,注释掉一下红框所示的部分:
  • nfs设置开机自启_nfs设置开机自启_02

  • 进入开发板uboot下配置启动参数
     NFS启动根文件的启动参数格式:
setenv bootargs root=/dev/nfs rw console=$(consolecfg) nfsroot=$(serverip):$(rootpath)
ip=$(ipaddr):$(serverip):$(gatewayip):$(netmask):$(hostname):$(device):off

 consolecfg —— 调试串口配置;
 serverip —— 提供 NFS 服务的主机 IP;
 ipaddr —— 本机 IP(目标系统 IP);
 gateway —— 网关;
 netmask —— 子网掩码;
 hostname —— 目标板的主机名;
 device —— 网络设备
 rootpath —— 主机 NFS 根文件系统路径。

 在这里ubuntu的ip为192.168.172.88,开发板ip为192.168.172.66,网关为192.168.172.255,子网掩码为255.255.255.0,没有主机名,可以为空值,但是不可以没有,所以最终的命令如下:

MX28 U-Boot >setenv bootargs 'root=/dev/nfs rw console=ttyAM0,115200n8 
nfsroot=192.168.172.88:/nfsroot/rootfs ip=192.168.172.66:192.168.172.88:
192.168.172.255:255.255.255.0: :eth0:off mem=64M'

MX28 U-Boot >saveenv

MX28 U-Boot >reset
  • 最后启动成功