首页 > 代码库 > NFS服务器

NFS服务器

一、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去要服务器的端口,要到端口后再建立连接,然后传输数据。

 

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

 

《客户端NFS和服务端NFS通讯过程》

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

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

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

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

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

技术分享

 

技术分享

 

二、NFS部署

1、查看系统版本等参数,服务器版本

[root@promote ~]# cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core) 
[root@promote ~]# uname -r
3.10.0-327.el7.x86_64
[root@promote ~]# 

2、两个安装NFS服务软件包的方法

1)[root@aliyun ~]# yum groupinstall "NFS file server" -y

2)yum install -y nfs-utils rpcbind

3、启动NFS服务(server端)

1)先启用rpc服务
[root@aliyun ~]# /etc/init.d/rpcbind start
Starting rpcbind:                                          [  OK  ]


2)查看服务端的开启的中间服务
[root@aliyun ~]# rpcinfo -p 127.0.0.1
   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


3)启动NFS服务,如果直接启动NFS服务会失败。
[root@aliyun ~]# /etc/init.d/nfs start
Starting NFS services:                                     [  OK  ]
Starting NFS mountd: rpc.mountd: svc_tli_create: could not open connection for udp6
rpc.mountd: svc_tli_create: could not open connection for tcp6
rpc.mountd: svc_tli_create: could not open connection for udp6
rpc.mountd: svc_tli_create: could not open connection for tcp6
rpc.mountd: svc_tli_create: could not open connection for udp6
rpc.mountd: svc_tli_create: could not open connection for tcp6
                                                           [  OK  ]
Starting NFS daemon: rpc.nfsd: address family inet6 not supported by protocol TCP
                                                           [  OK  ]
Starting RPC idmapd:                                       [  OK  ]


4)当开启NFS服务的时候再查看服务端的开启的中间服务,会发现多了很多服务和端口
[root@aliyun ~]# rpcinfo -p 127.0.0.1
   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
    100005    1   udp  46787  mountd
    100005    1   tcp  48141  mountd
    100005    2   udp  51029  mountd
    100005    2   tcp  34046  mountd
    100005    3   udp  54267  mountd
    100005    3   tcp  33692  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  49372  nlockmgr
    100021    3   udp  49372  nlockmgr
    100021    4   udp  49372  nlockmgr
    100021    1   tcp  33433  nlockmgr
    100021    3   tcp  33433  nlockmgr
    100021    4   tcp  33433  nlockmgr
[root@aliyun ~]# 

5)设置开机启动
[root@aliyun ~]# chkconfig rpcbind on
[root@aliyun ~]# chkconfig nfs on

4、client端只需要启动RPC服务

[root@weiwei ~]# /etc/init.d/rpcbind start
[root@weiwei ~]# /etc/init.d/rpcbind status
rpcbind (pid  18859) is running...

[root@weiwei ~]# chkconfig rpcbind on

5、NFS的配置文件,在server上

1)[root@aliyun ~]# cat /etc/exports 
##test for rpc and nfs
/data 192.168.222.0/24(rw,sync)                    如果这边是ro,就是read only

依次是,共享/data目录,仅仅192.168.222.0/24此网段的主机可以访问,,具有读写权限,将buffer中数据库同步到硬盘上也就是不在内存之中

2)平滑重启
/etc/init.d/nfs reload
如果此时正在使用,那就继续使用,如果没有使用的就不可以使用了

3)查看是否可以共享(服务端检查)
showmount -e localhost

(NFS服务器)
[root@aliyun ~]# showmount -e 127.0.0.1
Export list for 127.0.0.1:
/data 10.0.0.0/24

(客户端)
showmount -e 服务端的ip地址(服务端检查)
[root@weiwei ~]# showmount -e 192.168.222.140
Export list for 192.168.222.140:
/data 192.168.222.0/24

6、在客户端挂在共享的目录,/data是共享目录,/mnt是挂在在本地的目录,这个是临时挂在,重启之后就没了,然后要在/etc/fstab下面挂载或者在rc.local里面开机启动执行

[root@weiwei ~]# mount -t nfs 192.168.222.140:/data /mnt
[root@weiwei ~]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg_weiwei-lv_root
                       18G  5.1G   12G  31% /
tmpfs                 932M   80K  932M   1% /dev/shm
/dev/sda1             477M   43M  410M  10% /boot
/dev/sr0              1.9G  1.9G     0 100% /media/CentOS-6.7-x86_64-LiveDVD
192.168.222.140:/data
                       17G  2.4G   14G  16% /mnt
[root@weiwei ~]# 


[root@weiwei ~]# cd /mnt
[root@weiwei mnt]# ls
a.txt
[root@weiwei mnt]# cat a.txt 
niamadafjoiewfwe
[root@weiwei mnt]# 


###挂载,两种方式
/etc/fstab
192.168.222.140:/data   /mnt                    ext4    defaults        0 0

/etc/rc.local
mount -t nfs 192.168.222.140:/data /mnt 

7、此时读是同步了,但是如果我想写却出现了问题

[root@weiwei mnt]# touch b.txt
touch: cannot touch `b.txt‘: Permission denied
[root@weiwei mnt]# 


此时就要去服务器上去看看共享目录的其他用户的权限,此时的用户是nfsnobody
[root@promote /]# ls -l data
total 4
-rw-r--r--. 1 root root 17 Aug 14 07:00 a.txt

[root@promote /]# chmod -R 777 data			此时就可以了


查看其他用户
[root@promote ~]# cat /var/lib/nfs/etab 
/data	192.168.222.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,no_all_squash)
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

  

可以参考:http://atong.blog.51cto.com/2393905/1343950 

 

NFS服务器