本文转自迅为:http://www.topeetboard.com
学习平台:iTOP-4412开发板
本文讲解如何在 iTOP-4412 开发板上实现 NFS 网络文件系统。
我们使用的软硬件环境是:一台 PC,上面运行虚拟机 Ubuntu,iTOP-4412 开发板一块,PC 机和iTOP-4412 开发板通过网线连接到路由器上面,路由器分配的网段是 192.168.1.x 的 ip 地址,默认网关是路由器的 ip 地址,即 192.168.1.1。PC 机的 ip 地址是 192.168.1.103,iTOP-4412 开发板的 ip 地址是192.168.1.230,网段的子网掩码是 255.255.255.0。这几个 ip 地址在后面配置 iTOP-4412 开发板内核 nfs的时候会用到,大家需要根据自己使用的网络环境来设置这几个 ip 地址,设置的原则是确保 PC 的 ip 和iTOP4412 开发板的 ip 在同一个网段。
NFS 是 Network FileSystem 的缩写,是由 SUN 公司研制的 UNIX 表示层协议(pressentation layerprotocol) ,NFS 是基于 UDP/IP 协议的应用。它的最大功能就是可以通过网络让不同的机器,不通的操作系统彼此共享文件,可以通过 NFS 挂载远程主机的目录,访问该目录就像访问本地目录一样,所以也可以简单的将它看做一个文件服务器。通过 NFS 服务,我们可以实现在线调试文件系统或应用程序,而不用像传统的方式生成文件系统镜像,然后烧写到 iTOP-4412 的 eMMC 里,在启动开发板。通过 NFS 服务可以提高我们的调试效率。
实现 NFS,我们需要一个主机作为 NFS 服务器,我们选择我们的虚拟机 Ubuntu 作为主机。首先我们需要在虚拟机的 Ubuntu 上安装 Ubuntu NFS 服务,这是一个软件包,我们可以使用 apt 命令下载, (下载前请确认你的虚拟机可以上网) 。首先登录到虚拟机上,使用快捷键 Ctrl+Alt+t 组合按键打开终端如下图:
输入 su root 命令切换到 root 用户,如下图:
输入 apt-get install nfs-kernel-server 命令安装 Ubuntu NFS 服务,如下图:
在安装的过程中会提示“是否继续安装”的信息,如下图:
我们输入“Y” ,如下图:
然后按回车,会继续安装,如下图:
安装完成,如下图:
接下来需要配置/etc/exports,使用 vi 命令打开/etc/export,如下图:
在/etc/export 文件的最后一行添加:
/home/topeet/linux/ *(rw,sync,no_root_squash),如下图:
下面讲解一下上面输入的内容都代表什么意思:
/home/topeet/linux:是要共享的目录;
*:代表允许所有的网络段访问;
rw:是可读写权限;
sync:是资料同步写入内存和硬盘;
no_root_squash:是 Ubuntu nfs 客户端分享目录使用者的权限,如果客户端使用的是 root 用户,那么对于
该共享目录而言,该客户端就具有 root 权限;
其他 Ubuntu nfs 常用的参数有:
ro:只读访问
async :nfs 在写入数据前可以相应请求
secure: nfs 通过以下的安全 TCP/IP 端口发送
insecure: nfs 通过 1024 以上的端口发送
wdelay:如果多个用户要写入 NFS 目录,则归组(默认)
no_wdelay:如果多个用户要写入 NFS 目录,则立即写入,当使用 async 时,无需此设置
hide:在 nfs 共享目录中不共享妻子目录
no_hide:共享 nfs 目录的子目录
subtree_check:如果共享/usr/bin 之类的子目录时,强制 nfs 检查父目录的权限(默认
)
no_subtree_check:和上面相对,不检查父目录权限
all_squash:共享文件的 UID 和 GID 映射匿名用户 anonymous,适合公用目录
no_all_squash:保留共享文件的 UID 和 GID(默认)
root_squash root:用户的所有请求映射成如 anonymous 用户一样的权限(默认)
no_root_squash root:用户具有根目录的完全管理访问权限
anonuid=xxx:指定 nfs 服务器/etc/passwd 文件中匿名用户多的 UID
anongid=xxx:指定 nfs 服务器/etc/passwd 文件中匿名用户的 GID
接下来重启 portmap 服务,输入/etc/init.d/portmap restart 命令,如下图:
运行结果如下图:
然后重启 nfs 服务,输入/etc/init.d/nfs-kernel-server restart 命令,如下图:
运行结果如下图:
现在 Ubuntu nfs 服务器端的配置就完成了,下面我们可以在虚拟机 Ubuntu 本机上验证一下,例如我们把
/home/topeet/linux/app/system 挂载到/mnt 目录下,需要输入 mount -t nfs
localhost:/home/topeet/linux/app/system /mnt 命令,如下图:
执行完上面的命令,可以使用 df 命令查看是否挂载成功,如下图:
我们可以看到上图中高亮的那一行就是我们挂载的 nfs 文件系统,这说明我们的 Ubuntu nfs 服务器端搭建成
功了。
本章节我们用前面章节制作的做小 linux 系统为例,通过 nfs 来挂载它。我们把 linux 最小文件系统放到虚拟
机 Ubuntu 的/home/topeet/linux/app 目录下,如下图:
实现 nfs 文件系统我们需要修改 linux 最小文件系统的 etc/init.d/ifconfig-eth0 文件,如下图:
使用 vi 命令修改第八行,修改为:if grep -q nfs /proc/mounts ; then,修改后如下图:
修改完成后保存并退出。
下面我们开始配置 iTOP-4412 开发板的内核。要实现 nfs 功能,需要修改内核配置来支持,打开内核源
码,输入 cp config_for_linux .config 命令生成支持 linux 最小文件系统的内核配置文件,如下图:
然后输入 make menuconfig 命令进入 linux 配置界面,如下图:
选中“Networking support” ,如下图:
然后按回车进入 Networking support 配置界面,如下图:
选中“Networking options”选项,如上图所示,然后按回车进入 Networking options 配置界面,如下图:
在 Networking options 配置界面,选中“IP: kernel level autoconfiguration” ,如下图:
然后返回到 make menuconfig 的初始界面,如下图:
然后选择“File systems”选项,如下图:
然后输入回车,进入 File systems 配置界面,如下图:
选中“Network File Systems”选项,如下图:
然后输入回车,进入 Network File Systems 配置界面,如下图:
选中“ NFS client support” , “ NFS client support for NFS version 3” , “ NFS client support for the NFSv3
ACL protocol extension” , “NFS client support for NFS version 4” , “NFS client support for NFSv4.1” ,
“Root file system on NFS” ,如下图:
然后返回到 make menuconfig 的初始配置界面,如下图:
然后在初始配置界面选中“Boot options” ,如下图:
按回车进入 Boot options 配置界面,然后再 Default kernel command 里面输入:
root=/dev/nfs rw nfsroot=192.168.1.103:/home/topeet/linux/app/system
ip=192.168.1.230:192.168.1.103:192.168.1.1:255.255.255.0:iTOP:eth0:off rootfstype=ext4
init=/linuxrc console=ttySAC2,115200",如下图:
下面讲解一下上面输入命令的命令里面的几个参数:
root=/dev/nfs rw nfsroot=192.168.1.103:/home/topeet/linux/app/system 表示挂载的 nfs 服务器 ip 是
192.168.1.103,挂载的目录是/home/topeet/linux/app/system, (注意:/home/topeet/linux/是前面我
们搭建 nfs 服务器设置的) ;
ip=192.168.1.230:192.168.1.103:192.168.1.1:255.255.255.0:iTOP:eth0:off 这里面,第一个
ip192.168.1.230是我们开发板的ip地址, 第二个ip192.168.1.103是nfd服务器的ip, 第三个ip192.168.1.1
是开发板的网关, 255.255.255.0 是子网掩码, iTOP 是开发主机的名字 (一般无关紧要, 可以随便填写) , eth0
是网卡设备的名称。
至此,linux 内核的配置就完成了,退出 make menuconfig 配置,会弹出保存窗口,如下图:
使用键盘的左右方向键,选中上图的”Yes“,然后输入回车,退出保存配置,如下图:
然后输入 make 命令开始编译内核,如下图:
编译过程如下图:
编译完成,如下图:
至此,linux 内核支持 nfs 制作完成了,大家可以把编译生成的 zImage 烧写到 iTOP-4412 开发板上看下运行
结果。我们可以在串口上看到内核启动挂载 nfs 文件系统的 log,如下图: