NFS 是 Network FileSystem 的缩写,是让不一样的主机、不一样的操做系统能够共享存储的服务。经过 NFS,咱们本地 NFS 的客户端能够透明地读写位于服务端 NFS 服务器上的文件,就像访问本地文件同样方便。vim
NFS 在文件传送或信息传送过程当中依赖于 RPC(Remote Procedure Call) 协议,即远程过程调用, NFS 的各项功能都必需要向 RPC 来注册,如此一来 RPC 才能了解 NFS 这个服务的各项功能 Port、PID、NFS 在服务器所监听的 IP 等,而客户端才可以透过 RPC 的询问找到正确对应的端口,因此,NFS 必需要有 RPC 存在时才能成功的提供服务,简单的理解两者关系:NFS是 一个文件存储系统,而 RPC 是负责信息的传输。安全
下面详细说明在Linux平台上配置NFS服务的方法:服务器
这里以CentOS和Ubuntu为例来讲明,物理机、云主机或虚拟机都可,保障服务器和客户机之间的网络畅通。网络
经过上边简要的介绍,咱们知道 NFS 服务须要依赖 RPC 服务,因此这里 NFS 服务端须要安装 rpcbind 和 nfs-utils,客户端只须要安装 nfs-utils 便可,因为我选用的为 CentOS 系统,因此可使用 yum 快速的安装。app
#服务端 $ yum install -y nfs-utils rpcbind #客户端 $ yum install -y nfs-utils
#服务端 apt install nfs-kernel-server #客户端 apt install nfs-common
咱们在服务端建立一个共享目录 /data/share ,做为客户端挂载的远端入口,而后设置权限。async
$ mkdir -p /data/share $ chmod 666 /data/share
而后,修改 NFS 配置文件 /etc/exportstcp
$ vim /etc/exports #编辑文件内容以下: /data/share 10.222.77.0/24(rw,sync,insecure,no_subtree_check,no_root_squash)
说明一下,这里配置后边有不少参数,每一个参数有不一样的含义,具体能够参考下边。此处,我配置了将 /data/share 文件目录设置为容许 IP 为该 10.222.77.0/24 区间的客户端挂载,固然,若是客户端 IP 不在该区间也想要挂载的话,能够设置 IP 区间更大或者设置为 * 即容许全部客户端挂载,例如:ide
#容许全部ip客户端挂载 /data/share *(ro,sync,insecure,no_root_squash)
参数说明:测试
ro 只读访问 rw 读写访问 sync 全部数据在请求时写入共享 async nfs 在写入数据前能够响应请求 secure nfs 经过 1024 如下的安全 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
$ service rpcbind start #或者 $ /bin/systemctl start rpcbind.service
查看 NFS 服务项 rpc 服务器注册的端口列表ui
$ rpcinfo -p localhost program vers proto port service 100000 4 tcp 111 portmapper 100000 3 tcp 111 portmapper 100000 2 tcp 111 portmapper 100000 4 udp 111 portmapper 100000 3 udp 111 portmapper 100000 2 udp 111 portmapper
注意:此时咱们尚未启动 NFS 服务,只监听了 111 端口,接着咱们来启动 NFS 服务,再来看下注册的端口列表。
$ service nfs start #或者 /bin/systemctl start nfs.service
启动 NFS服务后 rpc 服务已经启用了对 NFS 的端口映射列表:
$ rpcinfo -p localhost program vers proto port service 100000 4 tcp 111 portmapper 100000 3 tcp 111 portmapper 100000 2 tcp 111 portmapper 100000 4 udp 111 portmapper 100000 3 udp 111 portmapper 100000 2 udp 111 portmapper 100024 1 udp 33745 status 100024 1 tcp 36980 status 100005 1 udp 20048 mountd 100005 1 tcp 20048 mountd 100005 2 udp 20048 mountd 100005 2 tcp 20048 mountd 100005 3 udp 20048 mountd 100005 3 tcp 20048 mountd 100003 3 tcp 2049 nfs 100003 4 tcp 2049 nfs 100227 3 tcp 2049 nfs_acl 100003 3 udp 2049 nfs 100003 4 udp 2049 nfs 100227 3 udp 2049 nfs_acl 100021 1 udp 38960 nlockmgr 100021 3 udp 38960 nlockmgr 100021 4 udp 38960 nlockmgr 100021 1 tcp 38362 nlockmgr 100021 3 tcp 38362 nlockmgr 100021 4 tcp 38362 nlockmgr
咱们发现,启动了 NFS 服务后,rpc 注册的端口列代表显增多。OK 如今服务端都启动起来了,在服务端看下是否正确加载了设置的 /etc/exports 配置。
$ showmount -e localhost Export list for localhost: /data/share 10.222.77.0/24
若是使用了防火墙,必定要在服务端把须要的端口打开,不然会客户端没法访问。
默认状况须要以下端口:
tcp 111 2049 20048 端口 udp 111 4046 端口
最后,在另外一台 Linux 上测试一下,是否可以正确挂载吧。首先,咱们能够在客户端查看下 NFS 服务端 (上边服务端 IP 为:10.222.77.86) 设置可共享的目录信息。
# showmount -e 10.222.77.86 Export list for 10.222.77.86: /data/share 10.222.77.0/24
而后,在客户端建立挂在目录 /share
$ mkdir -p /share
最后,挂载远端目录到本地 /share 目录。
$ mount 10.222.77.86:/data/share /share $ df -h | grep 10.222.77.86 Filesystem Size Used Avail Use% Mounted on 10.222.77.86:/data/share 27G 11G 17G 40% /share
能够看到,能够正确将远端 NFS 目录挂载到本地。注意:挂载点 /share 目录必须已经存在,并且目录中没有文件或子目录。
最后,咱们在 NFS 服务端 /data/share 目录下建立一个文件,看下客户端是否可以正确读取并修改。
服务端写入文件
$ echo "This is NFS server." > /data/share/nfs.txt $ ll /data/share/ total 4 -rw-r--r-- 1 root root 20 Nov 5 16:49 nfs.txt
在客户端读取测试
$ ll /share/ total 4 -rw-r--r-- 1 root root 20 Nov 5 16:49 nfs.txt $ cat /share/nfs.txt This is NFS server.
客户端写入文件$ echo "This is NFS client." >> /share/nfs.txt
服务端读取测试
$ cat /data/share/nfs.txt This is NFS server. This is NFS client.
都是木有问题的,这是由于上边设置了 NFS 远端目录权限为 rw 拥有读写权限,若是设置为 ro,那么客户端只能读取,不能写入,根据实际应用场景合理配置,这里就不在演示了。这里提一下,NFS 默认使用用 UDP 协议来进行挂载,为了提升 NFS 的稳定性,可使用 TCP 协议挂载,那么客户端挂载命令可以使用以下命令:
$ mount 10.222.77.86:/data/share /share -o proto=tcp -o nolock
最后,若是客户端要卸载 NFS 挂载的话,使用以下命令便可。
$ umount /share