一、NFS服务简介
NFS 是 Network File System 的缩写,即网络文件存储系统,最早是由 Sun 公司发展出来的,它最大的功能就是可以通过网络,让不同的机器、不同的操作系统可以共享彼此的文件。NFS服务器可以让PC将网络中的NFS服务器共享的目录挂载到本地端的文件系统中,而在本地端的系统中来看,那个远程主机的目录就像是自己的一个磁盘分区一样,使用起来非常方便。一般用来存储共享视频,图片等静态数据。
NFS的挂载原理如下图所示:NFS服务器设置好共享目录/home/nfs后,其他NFS客户端就可以将这个目录挂载到自己文件系统的某个挂载点(可自己定义)。挂载好后在客户端本地就能够看到服务端/home/nfs里的所有数据。
NFS是通过网络来进行数据传输,因此有对应的网络端口。那么客户端是如何知道NFS服务器端到底使用的是哪个端口呢?这时就需要通过远程过程调用(Remote Procedure Call,RPC)协议来实现了!
RPC与NFS通讯原理: NFS支持的功能很多,不同的功能启用的端口并不固定,客户端要知道 NFS服务器端的相关端口才能建立连接进行数据传输,RPC就是用来统一管理 NFS端口的,其对外的端口是111。RPC会记录 NFS端口的信息,并且通知客户端,让客户端可以连接到正常端口上去。
那么 RPC是如何知道每个 NFS功能的端口呢?首先当 NFS启动后,会随机的使用一些端口,然后 NFS会向 RPC去注册这些端口,并记录下来,同时RPC会开启111端口,等待客户端RPC的请求。若客户端有请求,那么服务器端的 RPC就会将之前记录的 NFS端口信息告知客户端。如此客户端就会获取NFS服务器端的端口信息,进行数据传输了。
注意:在启动 NFS服务器之前,首先要启动RPC服务(即portmap服务)否则 NFS 服务器就无法向 RPC服务区注册。如果 RPC服务重新启动,原来注册好的 NFS端口数据会全部丢失,此时 RPC服务管理的 NFS程序也要重启以重新向 RPC注册。
NFS客户端和NFS服务器通讯过程如下图所示:
- 首先服务器端启动RPC服务,并开启111端口
- 服务器端启动NFS服务,并向RPC注册端口信息
- 客户端启动RPC,向服务端的RPC服务请求服务端的NFS端口
- 服务端的RPC服务反馈NFS端口信息给客户端
- 客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输
二、Linux下部署NFS服务
2.1 安装NFS服务
使用如下命令安装 NFS 服务和 RPC服务
sudo apt-get install nfs-kernel-server rpcbind
安装完成后,创建共享文件夹供 nfs 服务器使用,此处在用户根目录下创建了 “linux/nfs” 文件夹
配置 nfs服务器共享目录:打开 nfs配置文件/etc/exports,在该文件末尾添加:
/home/andyxi/linux/nfs *(rw,sync,no_root_squash)
重启 NFS 服务
sudo /etc/init.d/nfs-kernel-server restart
2.2 NFS测试
这里使用 Ubuntu作为 NFS服务器端,Linux开发板作为客户端来进行 NFS测试。确保网络环境正常,Ubuntu、Windows和开发板能相互ping通。
在ubuntu的 /home/andyxi/linux/nfs目录下创建 test.c文件
vi test.c
在开发板中创建一个目录get,设置虚拟机IP并将NFS共享目录挂载到 get目录中
mkdir get
mount -t nfs -o nolock,nfsvers=3 192.168.10.100:/home/andyxi/linux/nfs get/
通过
df
命令可查看挂载的NFS目录,卸载NFS目录使用umount
命令