前言
采用的开发环境是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下,并解压!
- 配置开发板的ip地址,保证开发板和ubuntu能正常通信。如果不会配置的朋友可以移步至:ubuntu和开发板通信配置
- 屏蔽自启动文件中ip地址
一般厂家都会默认配置一个ip地址,开发板默认使用这个ip地址会导致开发板与ubuntu不能正常通信,最终导致根文件启动失败。
vim打开/nfsroot/rootfs/etc/rc.d/init.d/start_userapp
,注释掉一下红框所示的部分: - 进入开发板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
- 最后启动成功