NFS是NetworkFileSystem的缩写,它最大的功能是可以通过网络让不同的机器、不同的操作系统可以分享个别的文件。这个NFS服务器可以让那你的PC来将网络远程的NFS服务器分享的目录,挂载到本地端的机器当中,在本地端的机器看起来,那个远程主机的目录就好像是自己的一个磁盘分区。

基本上NFS这个服务的端口开在2049,但是由于文件系统非常复杂,因此NFS还有其他的程序去启动额外的端口,预设NFS用来传输的端口是随机选择小于1024以下的端口来使用的。客户端要远程调用(RemoteProcedureCall,RPC)的协议来辅助。

RPC最主要的功能就是在指定每个NFS功能所对应的portnumber,并且回报给客户端,让客户端可以连接到正确的端口上去。服务器在启动NFS时,会随机取用数个端口,并主动向RPC注册,因此RPC可以知道每个端口对应的NFS功能,然后RPC又是固定使用port111来监听客户端的需求并回报客户端正确的端口。

注:要启动NFS之前,RPC就要先启动了,否则NFS会无法向RPC注册。另外,RPC若重新启动时,原本注册的数据会不见,因此RPC重新启动后,它管理的所有服务都需要重新启动来重新向RPC注册。

客户端有NFS文件存取需求时,向服务器端要求数据的流程:

1.客户端会向服务器端的RPC(port111)发出NFS文件存取功能的询问要求;
2.服务器端找到对应的已注册的NFSdaemon端口后,会回报给客户端;
3.客户端了解正确的端口后,就可以直接与NFSdaemon来联机。

NFS启动的RPCdaemons

rpc.nfsd:这个daemon主要的功能就是在管理客户端是否能够使用服务器文件系统挂载信息等,其中还包含这个登陆者的ID的判别

rpc.mountd:这个daemon主要的功能,则是在管理NFS的文件系统哩!当客户端顺利的通过rpc.nfsd而登入服务器之后,在他可以使用NFS服务器提供的档案之前,还会经过档案权限(就是那个-rwxrwxrwx与owner,group那几个权限啦)的认证程序!他会去读NFS的配置文件/etc/exports来比对客户端的权限,当通过这一关之后客户端就可以取得使用NFS档案的权限啦!(注:这个也是我们用来管理NFS分享之目录的权限与安全设定的地方哩!)

NFS的文件访问权限:

客户端以NFS取用服务器端的文件系统时,还得具有

1NFS服务器有开放可写入的权限(与/etc/exports设定有关)

2实际的文件权限具有可写入的权限。

NFSServer端设定

所需软件:

RPC主程序:rpcbind

NFS主程序:nfs-utils

[root@centos ~]# yum install rpcbind[root@centos ~]# yum install nfs-utils

NFS配置文件:

主要配置文件:/etc/exports

NFS文件系统维护指令:/usr/sbin/exportfs

分享资源的登录文件:/var/lib/nfs/*tab

客户端查询服务器分享资源的指令:/usr/sbin/showmount

[root@www ~]# vim /etc/exports /tmp 192.168.100.0/24(ro) localhost(rw) *.ev.ncku.edu.tw(ro,sync) [分享目录] [第一部主机(权限)] [可用主机名] [可用通配符]

要将/tmp分别分享给三个不同的主机或网域的意思。记得主机后面以小括号()设计权限参数,若权限参数不止一个时,则以逗号(,)分开。且主机名与小括号是连在一起的喔!在这个档案内也可以利用#来批注呢。

想将/tmp分享出去给大家使用,由于这个目录本来就是大家都可以读写的,因此想让所有的人都可以存取,要让root写入的档案还是具有root的权限

[root@centos ~]# vim /etc/exports# 任何人都可以用我的 /tmp ,用通配符来处理主机名,重点在no_root_squash/tmp  *(rw,no_root_squash)

启动rpc、nfs服务

[root@centos ~]# service rpcbind startStarting rpcbind: [  OK  ][root@centos ~]# service nfs startStarting NFS services:  [  OK  ]Starting NFS mountd: [  OK  ]Starting NFS daemon: [  OK  ]

查看开放端口

[root@centos ~]# netstat -plunt | grep -E '(rpc|nfs)'tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      6023/rpcbindtcp        0      0 0.0.0.0:52528               0.0.0.0:*                   LISTEN      6069/rpc.mountdtcp        0      0 0.0.0.0:54929               0.0.0.0:*                   LISTEN      6069/rpc.mountdtcp        0      0 0.0.0.0:34879               0.0.0.0:*                   LISTEN      6069/rpc.mountdtcp        0      0 :::35502                    :::*                        LISTEN      6069/rpc.mountdtcp        0      0 :::111                      :::*                        LISTEN      6023/rpcbindtcp        0      0 :::60977                    :::*                        LISTEN      6069/rpc.mountdtcp        0      0 :::39008                    :::*                        LISTEN      6069/rpc.mountdudp        0      0 0.0.0.0:37102               0.0.0.0:*                               6069/rpc.mountdudp        0      0 0.0.0.0:111                 0.0.0.0:*                               6023/rpcbindudp        0      0 0.0.0.0:36248               0.0.0.0:*                               6069/rpc.mountdudp        0      0 0.0.0.0:57902               0.0.0.0:*                               6069/rpc.mountdudp        0      0 0.0.0.0:686                 0.0.0.0:*                               6023/rpcbindudp        0      0 :::111                      :::*                                    6023/rpcbindudp        0      0 :::34965                    :::*                                    6069/rpc.mountdudp        0      0 :::686                      :::*                                    6023/rpcbindudp        0      0 :::42044                    :::*                                    6069/rpc.mountdudp        0      0 :::36419                    :::*                                    6069/rpc.mountd

查看每个RPC服务的注册状况

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

显示出目前这部主机的RPC状态

[root@centos ~]# rpcinfo -p localhostprogram vers proto   port  service100000    4   tcp    111  portmapper100000    3   tcp    111  portmapper100000    2   tcp    111  portmapper100000    4   udp    111  portmapper100000    3   udp    111  portmapper100000    2   udp    111  portmapper100005    1   udp  37102  mountd100005    1   tcp  34879  mountd100005    2   udp  57902  mountd100005    2   tcp  52528  mountd100005    3   udp  36248  mountd100005    3   tcp  54929  mountd100003    2   tcp   2049  nfs100003    3   tcp   2049  nfs100003    4   tcp   2049  nfs100227    2   tcp   2049  nfs_acl100227    3   tcp   2049  nfs_acl100003    2   udp   2049  nfs100003    3   udp   2049  nfs100003    4   udp   2049  nfs100227    2   udp   2049  nfs_acl100227    3   udp   2049  nfs_acl100021    1   udp  38908  nlockmgr100021    3   udp  38908  nlockmgr100021    4   udp  38908  nlockmgr100021    1   tcp  56488  nlockmgr100021    3   tcp  56488  nlockmgr100021    4   tcp  56488  nlockmgr

检查nfs这个程序相关软件版本信息(仅查看TCP)

[root@centos ~]# rpcinfo -t localhost nfsprogram 100003 version 2 ready and waitingprogram 100003 version 3 ready and waitingprogram 100003 version 4 ready and waiting

NFS的联机查看

[root@www ~]# showmount [-ae] [hostname|IP]选项与参数:-a :显示目前主机与客户端的 NFS 联机分享的状态;-e :显示某部主机的 /etc/exports 所分享的目录数据。

查看设定好的相关exports分享目录信息

[root@centos ~]# showmount -e localhostExport list for localhost:/tmp *

当你要扫瞄某一部主机他提供的NFS分享的目录时,就使用showmount-eIP(或hostname)即可

NFS关于目录权限设定的数据非常之多,在/etc/exports只是比较特别的权限参数而已,还有很多预设参数呢!这些预设参数在哪?我们可以检查一下/var/lib/nfs/etab就知道了

[root@centos ~]# tail /var/lib/nfs/etab/tmp    *(rw,sync,wdelay,hide,nocrossmnt,secure,no_root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534)

重新编辑/etc/exports文件,不需要重启nfs!如果重新启动nfs的话,要得再向RPC注册!我们可以通过exportfs这个指令

[root@www ~]# exportfs [-aruv]选项与参数:-a :全部挂载(或卸除) /etc/exports 档案内的设定-r :重新挂载 /etc/exports 里面的设定,此外,亦同步更新 /etc/exports 及 /var/lib/nfs/xtab 的内容!-u :卸除某一目录-v :在 export 的时候,将分享的目录显示到屏幕上!

NFS客户端的设定

手动挂载NFS服务器分享的资源

所需软件:

[root@centos ~]# yum install rpcbind
#启动rpcbind服务[root@centos ~]# service rpcbind start#查询服务器提供哪些资源[root@centos ~]# showmount -e 192.168.246.23Export list for 192.168.246.23:/tmp *

建立挂载点

[root@centos ~]# mkdir -p /home/nfs/[root@centos ~]# mount -t nfs 192.168.246.23:/tmp  /home/nfs/[root@centos ~]# df -ThFilesystem    Type    Size  Used Avail Use% Mounted on/dev/sda2     ext4    193G   24G  159G  14% /tmpfs        tmpfs    1.9G  904K  1.9G   1% /dev/shm/dev/sda1     ext4    194M   48M  137M  26% /boot/dev/sda3     ext4    145G  188M  137G   1% /home192.168.246.23:/tmpnfs     97G  9.6G   82G  11% /home/nfs

至此,最简单的NFS挂载共享就完成了!