网络服务—NFS

什么是NFS ?

     NFS 是Network File System的缩写,即网络文件系统。一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布。功能是通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据,是在类Unix系统间实现磁盘文件共享的一种方法

  它的主要功能是通过网络让不同的机器系统之间可以彼此共享文件和目录。NFS服务器可以允许NFS客户端将远端NFS服务器端的共享目录挂载到本地的NFS客户端中。在本地的NFS客户端的机器看来,NFS服务器端共享的目录就好像自己的磁盘分区和目录一样。一般客户端挂载到本地目录的名字可以随便,但为方便管理,我们要和服务器端一样比较好。

NFS一般用来存储共享视频,图片等静态数据。

NFS挂载原理

     NFS是通过网络来进行服务端和客户端之间的数据传输。两者之间要传输数据就要有想对应的网络端口来进行传输。NFS服务器到底使用什么网络端口来传输数据的,NFS服务器端其实是随机选择端口来进行数据传输。那NFS客户端又是如何知道NFS服务器端到底使用的是哪个端口呢?其实NFS服务器时通过远程过程调用(remote procedure call 简称RPC)协议/服务来实现的。也就是说RPC服务会统一管理NFS的端口,客户端和服务端通过RPC来先沟通NFS使用了哪些端口,之后再利用这些端口(小于1024)来进行数据的传输。

也就是RPC管理服务端的NFS端口分配,客户端要传数据,那客户端的RPC会先跟服务端的RPC去要服务器的端口,要到端口后再建立连接,然后传输数据。

那RPC和NFS之间又是如何之间相互通讯的?

首先当NFS启动后,就会随机的使用一些端口,然后NFS就会向RPC去注册这些端口。RPC就会记录下这些端口。并且RPC会开启111端口,等待客户端RPC的请求,如果客户端有请求,那服务端的RPC就会将记录的NFS端口信息告知客户端。

RPC和NFS的启动顺序是怎样的?

  在启动NFS SERVER之前,首先要启动RPC服务(即portmap服务,下同)否则NFS SERVER就无法向RPC服务区注册,另外,如果RPC服务重新启动,原来已经注册好的NFS端口数据就会全部丢失。因此此时RPC服务管理的NFS程序也要重新启动以重新向RPC注册。特别注意:一般修改NFS配置文档后,是不需要重启NFS的,直接在命令执行/etc/init.d/nfs  reload

总结:客户端NFS和服务端NFS通讯过程

1)首先服务器端启动RPC服务,并开启111端口

2)启动NFS服务,并向RPC注册端口信息

3)客户端启动RPC(portmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口

4)服务端的RPC(portmap)服务反馈NFS端口信息给客户端。

5)客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。

 

NFS相关协议及软件安装管理

协议:

     RPC(Remote Procedure Call Protocol)——远程过程调用协议

软件:

     nfs-utils-* :包括基本的NFS命令与监控程序 

     rpcbind-* :支持安全NFS RPC服务的连接  

     注:通常情况下,是作为系统的默认包安装的

     Cent OS6.*之前rpcbind叫portmap。

NFS系统守护进程

nfs:它是基本的NFS守护进程,主要功能是管理客户端是否能够登录服务器

rpcbind:主要功能是进行端口映射工作。当客户端尝试连接并使用RPC服务器提供的服务(如NFS服务)时,rpcbind会将所管理的与服务对应的端口提供给客户端,从而使客户可以通过该端口向服务器请求服务。

安装NFS服务

[root@localhost Share]# rpm -qa | grep nfs
nfs-utils-1.2.3-70.el6.x86_64
nfs-utils-lib-1.1.5-11.el6.x86_64
nfs4-acl-tools-0.3.3-8.el6.x86_64
[root@localhost Share]# rpm -qa | grep rpcbind
rpcbind-0.2.0-12.el6.x86_64
[root@localhost Share]# yum -y install nfs-utils rpcbind

 服务端配置

 [root@localhost ~]# mkdir -p /data/ljj

[root@localhost ~]# ls -l /data/
总用量 4
drwxr-xr-x 2 root root 4096 11月 19 04:07 ljj

[root@localhost ~]# chmod 666 /data/ljj
[root@localhost ~]# ls -l /data
总用量 4
drw-rw-rw- 2 root root 4096 11月 19 04:07 ljj

[root@localhost ~]# vim /etc/exports
/data/ljj 192.168.1.0/24(rw,no_root_squash,no_all_squash,sync)

常见的参数则有:

参数值 内容说明
rw  ro 该目录分享的权限是可擦写 (read-write) 或只读 (read-only),但最终能不能读写,还是与文件系统的 rwx 及身份有关。

sync  async sync 代表数据会同步写入到内存与硬盘中,async 则代表数据会先暂存于内存当中,而非直接写入硬盘!

no_root_squash  root_squash 客户端使用 NFS 文件系统的账号若为 root 时,系统该如何判断这个账号的身份?预设的情况下,客户端 root 的身份会由 root_squash 的设定压缩成 nfsnobody, 如此对服务器的系统会较有保障。但如果你想要开放客户端使用 root 身份来操作服务器的文件系统,那么这里就得要开 no_root_squash 才行!

all_squash 不论登入 NFS 的使用者身份为何, 他的身份都会被压缩成为匿名用户,通常也就是 nobody(nfsnobody) 啦!

anonuid  anongid anon 意指 anonymous (匿名者) 前面关于 *_squash 提到的匿名用户的 UID 设定值,通常为 nobody(nfsnobody),但是你可以自行设定这个 UID 的值!当然,这个 UID 必需要存在于你的 /etc/passwd 当中! anonuid 指的是 UID 而 anongid 则是群组的 GID 啰。

[root@localhost ~]# service rpcbind restart
停止 rpcbind:[确定]
正在启动 rpcbind:[确定]
[root@localhost ~]# service nfs restart
关闭 NFS 守护进程:[失败]
关闭 NFS mountd:[失败]
关闭 NFS quotas:[失败]
启动 NFS 服务: [确定]
关掉 NFS 配额:[确定]
启动 NFS mountd:[确定]
启动 NFS 守护进程:[确定]
正在启动 RPC idmapd:[确定]
[root@localhost ~]# exportfs
/data/ljj 192.168.1.0/24

 查看 RPC 服务的注册状况

[root@localhost ~]# 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
100011 1 udp 875 rquotad
100011 2 udp 875 rquotad
100011 1 tcp 875 rquotad
100011 2 tcp 875 rquotad
100005 1 udp 55311 mountd
100005 1 tcp 53167 mountd
100005 2 udp 50629 mountd
100005 2 tcp 55630 mountd
100005 3 udp 43989 mountd
100005 3 tcp 41228 mountd
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 2 tcp 2049 nfs_acl
100227 3 tcp 2049 nfs_acl
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 2 udp 2049 nfs_acl
100227 3 udp 2049 nfs_acl
100021 1 udp 44044 nlockmgr
100021 3 udp 44044 nlockmgr
100021 4 udp 44044 nlockmgr
100021 1 tcp 44249 nlockmgr
100021 3 tcp 44249 nlockmgr
100021 4 tcp 44249 nlockmgr

选项与参数:
-p :针对某 IP (未写则预设为本机) 显示出所有的 port 与 porgram 的信息;
-t :针对某主机的某支程序检查其 TCP 封包所在的软件版本;
-u :针对某主机的某支程序检查其 UDP 封包所在的软件版本;

 在你的 NFS 服务器设定妥当之后,我们可以在 server 端先自我测试一下是否可以联机喔!就是利用 showmount 这个指令来查阅! 

[root@localhost ~]# showmount -e localhost
Export list for localhost:
/data/ljj 192.168.1.0/24

 选项与参数:

-a :显示目前主机与客户端的 NFS 联机分享的状态;
-e :显示某部主机的 /etc/exports 所分享的目录数据。

 客户端配置

[root@localhost ~]# yum -y install nfs-utils

[root@localhost ~]# mkdir /ljj

[root@localhost ~]# showmount -e 192.168.1.211
Export list for 192.168.1.211:
/data/ljj 192.168.1.0/24

为了提高NFS的稳定性,使用TCP协议挂载,NFS默认用UDP协议 

[root@localhost ~]# mount -t nfs 192.168.1.211:/data/ljj /ljj -o proto=tcp -o nolock

测试结果

查看挂载结果 

[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3    19G    2.3G   16G 13% /
tmpfs 238M 0 238M 0% /dev/shm
/dev/sda1 190M 33M 147M 19% /boot
192.168.1.211:/data/ljj
19G 2.3G 16G 13% /ljj

服务端

[root@localhost ~]# cd /data/ljj/
[root@localhost ljj]# echo "test" > test.txt

客户端

[root@localhost ~]# cat /ljj/test.txt
test

[root@localhost ~]# echo "123" >> /ljj/test.txt 

服务端

[root@localhost ljj]# cat /data/ljj/test.txt
test
123

客户端卸载已挂在的NFS 

[root@bogon ~]# umount /ljj

为了方便配置防火墙,需要固定nfs服务端口

NFS启动时会随机启动多个端口并向RPC注册,这样如果使用iptables对NFS端口进行限制就会有点麻烦,可以更改配置文件固定NFS服务相关端口。

[root@localhost ljj]# 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
100011 1 udp 875 rquotad
100011 2 udp 875 rquotad
100011 1 tcp 875 rquotad
100011 2 tcp 875 rquotad
100005 1 udp 55311 mountd
100005 1 tcp 53167 mountd
100005 2 udp 50629 mountd
100005 2 tcp 55630 mountd
100005 3 udp 43989 mountd
100005 3 tcp 41228 mountd
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 2 tcp 2049 nfs_acl
100227 3 tcp 2049 nfs_acl
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 2 udp 2049 nfs_acl
100227 3 udp 2049 nfs_acl
100021 1 udp 44044 nlockmgr
100021 3 udp 44044 nlockmgr
100021 4 udp 44044 nlockmgr
100021 1 tcp 44249 nlockmgr
100021 3 tcp 44249 nlockmgr
100021 4 tcp 44249 nlockmgr

 分配端口,编辑配置文件:

 vim /etc/sysconfig/nfs

 RQUOTAD_PORT=875

 LOCKD_TCPPORT=32803

 LOCKD_UDPPORT=32769

 MOUNTD_PORT=892

 STATD_PORT=662

[root@localhost ljj]# service nfs restart
关闭 NFS 守护进程:[确定]
关闭 NFS mountd:[确定]
关闭 NFS quotas:[确定]
关闭 NFS 服务: [确定]
Shutting down RPC idmapd: [确定]
启动 NFS 服务: [确定]
关掉 NFS 配额:[确定]
启动 NFS mountd:[确定]
启动 NFS 守护进程:[确定]
正在启动 RPC idmapd:[确定]

[root@localhost ljj]# 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
100011 1 udp 875 rquotad
100011 2 udp 875 rquotad
100011 1 tcp 875 rquotad
100011 2 tcp 875 rquotad
100005 1 udp 892 mountd
100005 1 tcp 892 mountd
100005 2 udp 892 mountd
100005 2 tcp 892 mountd
100005 3 udp 892 mountd
100005 3 tcp 892 mountd
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 2 tcp 2049 nfs_acl
100227 3 tcp 2049 nfs_acl
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 2 udp 2049 nfs_acl
100227 3 udp 2049 nfs_acl
100021 1 udp 32769 nlockmgr
100021 3 udp 32769 nlockmgr
100021 4 udp 32769 nlockmgr
100021 1 tcp 32803 nlockmgr
100021 3 tcp 32803 nlockmgr
100021 4 tcp 32803 nlockmgr

原文地址:https://www.cnblogs.com/liujunjun/p/11843262.html