NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。
NFS服务器可以让PC将网络中的NFS服务器共享的目录挂载到本地端的文件系统中,而在本地端的系统中来看,那个远程主机的目录就好像是自己的一个磁盘分区一样,在使用上相当便利。
目录
一、简介
二、挂载原理
三、RPC与NFS的通讯
四、操练
1、安装和检查NFS、RPC服务(注意:客户端和服务端都要安装)
2、服务端配置过程
3、客户端配置
4、测试
5、排错
先在NFS服务器设置好一个共享目录/home/public。其他的有权访问NFS服务器的NFS客户端,就可以将这个目录挂载到自己文件系统上,挂载点是客户机自己定义。如下图客户端A的挂载点是/home/A,客户端B挂载的目录是/home/B,而客户端C的挂载目录是/data/ysm。挂载好后通过本地的挂载目录,可以看到到服务端/home/public的所有数据。如果服务器端配置的客户端只读,那么客户端就只能够只读。如果配置读写,客户端就能够进行读写。在使用体验上,就和本地磁盘几乎没有区别,但是数据时存放在服务器上的,不会占用本地磁盘空间。
NFS挂载原理图NFS是通过网络来进行服务器端和客户端之间的数据传输,两者之间要传输数据就要有想对应的网络端口,基本上NFS这个服务器的端口开在2049,但由于文件系统非常复杂。因此NFS还有其他的程序去启动额外的端口,这些额外的用来传输数据的端口是随机选择的,小于1024的端口;既然是随机的,那么客户端又需要知道NFS服务器端到底使用的是哪个端口。这时就需要通过远程过程调用(Remote Procedure Call,RPC)协议来实现
因为NFS支持的功能相当多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此NFS的功能对应的端口并不固定,客户端要知道NFS服务器端的相关端口才能建立连接进行数据传输,而RPC就是用来统一管理NFS端口的服务,并且统一对外的端口是111,RPC会记录NFS端口的信息,如此我们就能够通过RPC实现服务端和客户端沟通端口信息。PRC最主要的功能就是指定每个NFS功能所对应的port number,并且通知客户端,记客户端可以连接到正常端口上去。
那么RPC又是如何知道每个NFS功能的端口呢?
当NFS启动后,会随机的使用一些端口,这时NFS就会向RPC去注册这些端口,而RPC就会记录下这些端口,并且RPC会开启111端口,等待客户端RPC的请求,如果客户端有请求,服务器端的RPC就会将之前记录的NFS端口信息告知客户端。如此客户端就会获取NFS服务器端的端口信息,就会以实际端口进行数据的传输了。
访问程序通过NFS客户端向NFS服务端存取数据的流程大致如下
NFS工作流程图1)首先服务器端启动RPC服务,并开启111端口
2)服务器端启动NFS服务,并向RPC注册端口信息
3)客户端启动RPC(portmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口
4)服务端的RPC(portmap)服务反馈NFS端口信息给客户端。
5)客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。
以下几点需要注意:
1)在启动NFS SERVER之前,首先要启动RPC服务,否则NFS SERVER就无法向RPC服务区注册。
2)如果RPC服务重新启动,原来已经注册好的NFS端口数据就会全部丢失。因此此时RPC服务管理的NFS程序也要重新启动以重新向RPC注册。
3)特别注意:一般修改NFS配置文档后,不需要重启NFS,直接在命令执行/etc/init.d/nfs reload或exportfs –rv即可使修改的/etc/exports生效。
安装命令 yum install nfs-utils rpcbind -y (或者:yum groupinstall "NFS file server" -y)
若有rpm包,安装命令:rpm -ivh 包名 (-ivh:在安装过程中显示正在安装的文件信息及安装进度)
由于先前已经安装,这里提示不用安装,那么久检查一下安装的版本
在安装前可以像笔者一样,检查一下主机系统版本
[root@nfs01 ~]# cat /etc/redhat-release
CentOS release 6.9 (Final)
[root@nfs01 ~]# uname -r
2.6.32-696.el6.x86_64
[root@nfs01 ~]# yum install nfs-utils rpcbind -y
已加载插件:fastestmirror, security
设置安装进程
Loading mirror speeds from cached hostfile
(。。。省略N多行。。。)
包 1:nfs-utils-1.2.3-78.el6_10.1.x86_64 已安装并且是最新版本
包 rpcbind-0.2.0-16.el6.x86_64 已安装并且是最新版本
无须任何处理
[root@nfs01 ~]# rpm -qa nfs-utils rpcbind
rpcbind-0.2.0-16.el6.x86_64
nfs-utils-1.2.3-78.el6_10.1.x86_64
1、先启动rpcbind,不怕啰嗦,必须先启动rpcbind,原因上文已经解释了
启动过后可以检查一下是否启动成功,以及查询一下其主端口111是否已在监听
[root@nfs01 ~]# /etc/init.d/rpcbind start
正在启动 rpcbind: [确定]
[root@nfs01 ~]# /etc/init.d/rpcbind status
rpcbind (pid 2712) is running...
[root@nfs01 ~]# netstat -lntup|grep rpcbind
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1374/rpcbind
tcp 0 0 :::111 :::* LISTEN 1374/rpcbind
udp 0 0 0.0.0.0:111 0.0.0.0:* 1374/rpcbind
udp 0 0 0.0.0.0:701 0.0.0.0:* 1374/rpcbind
udp 0 0 :::111 :::* 1374/rpcbind
udp 0 0 :::701 :::* 1374/rpcbind
2、rpc服务启动完成后,再启动nfs,nfs主端口为2049,启动完成也要检查是否启动成功
[root@nfs01 ~]# /etc/init.d/nfs start
[root@nfs01 ~]# /etc/init.d/nfs status
rpc.svcgssd 已停
rpc.mountd (pid 2801) is running...
nfsd (pid 2817 2816 2815 2814 2813 2812 2811 2810) is running...
rpc.rquotad (pid 2796) is running...
3、查看localhost 有注册的端口,这里我们可以看到端口2049的nfs服务
[root@nfs01 ~]# rpcinfo -p localhost
program vers proto port service
100000 4 tcp 111 portmapper
(。。。。省略N多行。。。。)
100005 3 tcp 49427 mountd
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 2 tcp 2049 nfs_acl
(。。。。省略N多行。。。。)
100021 3 tcp 45448 nlockmgr
100021 4 tcp 45448 nlockmgr
4、写入nfs的配置文件
格式:NFS共享目录 NFS客户端地址1(参数1,参数2,...) NFS客户端地址2(参数1,参数2,...)
可以使用完整的主机IP,也可使用网络号
[root@nfs01 ~]# vim /etc/exports
#share /data by 45AC for NFS at 20190412
/data 172.16.1.0/24(rw,sync)
括号里的参数,常见的如下所示(可通过man exports 看到更详细说明)
参数参数 说明
ro 该共享目录的权限是只读(read-only)
rw 该共享目录的权限是可读写(read-write)
hide 隐藏文件系统。
noaccess 阻止访问这个目录及其子目录
wdelay 为合并多次更新而延迟写入磁盘
no_wdelay 尽可能快地把数据写入磁盘
sync 将数据同步写入内存缓冲区与磁盘中(同步模式)
async 将数据线暂存在内存缓冲区中,而非直接写入磁盘(非同步模式)
subtree_check 验证每个被请求的文件都在导出的目录树中
no_subtree_check 只验证涉及被导出的文件系统的文件请求
all_squash 将所有本地和远程账户映射到匿名用户
root_squash 将根用户及所属组都映射为匿名用户或用户组(nfsnobody),为默认设置
no_root_squash 将远程根用户当成本地根用户,即不压制root
anonuid 为匿名用户账户指定组ID
anongid 为匿名用户账户指定用户ID
5、设置开机自启动,并检查
[root@nfs01 ~]# chkconfig nfs on
[root@nfs01 ~]# chkconfig rpcbind on
[root@nfs01 ~]# chkconfig --list |egrep "nfs|rpc"
nfs 0:off 1:off 2:on 3:on 4:on 5:on 6:off
nfs-rdma 0:off 1:off 2:off 3:off 4:off 5:off 6:off
nfslock 0:off 1:off 2:off 3:on 4:on 5:on 6:off
rpcbind 0:off 1:off 2:on 3:on 4:on 5:on 6:off
rpcgssd 0:off 1:off 2:off 3:on 4:on 5:on 6:off
rpcsvcgssd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
6、创建共享目录,修改目录所有者和组
[root@nfs01 ~]# mkdir -p /data
[root@nfs01 ~]# id nfsnobody
uid=65534(nfsnobody) gid=65534(nfsnobody) groups=65534(nfsnobody)
[root@nfs01 ~]# chown -R nfsnobody.nfsnobody /data
drwxr-xr-x 2 nfsnobody nfsnobody 4096 Apr 12 10:18 /data
7、平滑重启nfs,命令:/etc/init.d/nfs reload 等价于 exports -rv
启动后用 showmount -e 服务端IP 测试挂载
[root@nfs01 ~]# /etc/init.d/nfs reload
[root@nfs01 ~]# showmount -e 172.16.1.31 #若出现以下提示,表示服务端已经配置完成
Export list for 172.16.1.31:
/data 172.16.1.0/24
1、首先检查rpc和nfs安装情况
[root@web01 ~]# rpm -qa nfs-utils rpcbind
nfs-utils-1.2.3-78.el6_10.1.x86_64
rpcbind-0.2.0-16.el6.x86_64
2、启动rpc,并检查运行情况。注意:客户机不用启动nfs
[root@web01 ~]# /etc/init.d/rpcbind start
正在启动 rpcbind: [确定]
[root@web01 ~]# /etc/init.d/rpcbind status
rpcbind (pid 2142) 正在运行...
3、设置开机自启动
[root@web01 ~]# chkconfig rpcbind on
[root@web01 ~]# chkconfig --list rpcbind
rpcbind 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
4、检查网络和nfs服务器端口是否通畅
[root@web01 ~]# telnet 172.16.1.31 111 #以下提示为通畅
Trying 172.16.1.31...
Connected to 172.16.1.31.
Escape character is '^]'.
^ZConnection closed by foreign host.
5、挂载服务端的共享目录
命令:mount -t nfs 172.16.1.31:/data /mnt , /data 是服务端的共享目录,/mnt 是我们本地的挂载目录
挂载前,可用showmount -e 172.16.1.31先测试一下
fd -h 查看挂载情况,172.16.1.31:/data 19G 1.6G 16G 10% /mnt 就是我们挂载的NFS
[root@web01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
[root@web01 ~]# mount -t nfs 172.16.1.31:/data /mnt
[root@web01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 19G 1.5G 17G 9% /
tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 190M 35M 146M 19% /boot
172.16.1.31:/data 19G 1.6G 16G 10% /mnt
6、设置开机自动挂载
[root@web01 mnt]# echo "mount -t nfs 172.16.1.31:/data /mnt" >>/etc/rc.local
[root@web01 mnt]# tail -1 /etc/rc.local
mount -t nfs 172.16.1.31:/data /mnt
客户机上,我们在/mnt目录创建一个文件,再到服务机的/data目录查看刚刚创建的文件
客户机创建过程
[root@web01 ~]# cd /mnt
[root@web01 mnt]# touch ysm.txt
[root@web01 mnt]# echo 'you are angel!' >> ysm.txt
[root@web01 mnt]# cat ysm.txt
you are angel!
服务机查看
[root@nfs01 ~]# cd /data
[root@nfs01 data]# ls
nfs-blog ysm.txt
[root@nfs01 data]# cat ysm.txt
you are angel!
对NFS原理以及部署步骤熟练
客户端排查
ping server_ip
telnet server_ip 111
showmount -e server_ip
mount -t nfs server_ip:/服务端共享目录 /客户端挂载点
centos6.6以后版本,如果挂载的时候报如下错,需在客户机安装nfs,只安装,不启动。
安装命令:yum install nfs-utils -y