文件服务器之NFS服务器

NFS(Network File System),它的目的就是想让不一样的机器,不一样的操做系统能够彼此共享数据文件,目前在Unix like当中用来做为文件服务器是一个至关不错的解决方案,基本上Unix like主机链接到另外一台Unix like主机来共享彼此的文件时,使用NFS要比SAMBA服务器快速且方便的多。此外,NFS的配置很简单,只要记得启动Remote Procedure Call(rpc,就是rpcbind这个软件)就可以搭建起来。大公司或门户除了使用NFS外,还可能会使用更为复杂的分布式文件系统,好比FastDFS、Moosefs(mfs)、GlusterFS等。html

1.NFS的由来与功能

NFS共享文件系统的搭建很简单,不过最大的问题就是权限。由于在服务器端和客户端必须具有相同的帐号才可以访问某些目录或文件,另外NFS启动须要经过远程调用RPC,也就是说并非只启动NFS,还要启动rpc这个服务才行。node

1.1 什么是NFS(Network File System)

NFS就是Network File System的缩写,最初由sun公司发展出来。它最大的功能就是能够经过网络,让不一样的机器、不一样的操做系统能够共享彼此的文件(share files)。因此也能够简单的将它看作是一个文件服务器(file server).NFS服务器可让PC将网络中的NFS服务器共享的目录挂载到本地端的文件中,并且在本地段的系统看来,远程主机的目录就好像是本身的一个磁盘分区(partition)同样,在使用上至关便利。其结构图以下图所示:linux

文件服务器之NFS服务器

就如同上面的图示同样,当NFS服务器配置好共享出来的/home/sharefile这个目录后,其余的NFS客户端就能够将这个目录挂载到本身的文件系统的某个挂载点(挂载点能够自定义)上,例如上图中的NFS Client1与NFS Client2挂载的目录就不一样。只要在NFS Client1系统中进入/home/data/sharefile内,就能够看到NFS服务器系统内的/home/sharefile目录下的全部数据(固然要有足够的权限)。这个/home/data/sharefile就好像NFS Client1机器里面的一个partition,只要权限足够,那么就可使用cp、cd、mv、rm等磁盘或文件相关的命令。vim

既然NFS是经过网络来进行数据传输的,那么NFS使用哪一个端口来进行数据传输呢?基本上这个服务的端口开在2049,可是因为文件系统很是复杂,所以NFS还须要其余程序去启动额外端口,但这些额外端口启动的端口是什么呢?答案“不知道”。由于默认NFS用来传输的端口是随机选择的,小于1024的端口,那客户端怎么知道服务器端使用哪一个端口呢?此时就须要用远程过程调用(Remote Procedure Call,RPC)协议来辅助了。centos

1.2 什么是RPC(Remote Procedure Call)

RPC最主要的功能就是指定每一个NFS功能所对应的port number,而且通知客户端,让客户端能够链接到正确的端口上去,那rpc又是如何知道每一个NFS的端口的呢?这是由于当服务器在启动NFS时会随机选取数个端口,并主动向RPC注册,所以RPC能够知道每一个端口对应的NFS功能。而后RPC又是固定使用port 111来监听客户端的需求并向客户端相应正确的端口。所以使NFS得启动更为便捷。安全

注意:在启动NFS以前要先启动RPC,不然NFS没法向rpc注册,另外RPC若从新启动,原来注册的数据会不见,所以RPC从新启动后,它管理的全部服务都须要从新启动以从新向RPC注册。服务器

1.3 NFS启动的RPC deamons

咱们如今知道NFS服务器在启动的时候须要向rpc注册,因此NFS服务器也称为RPC server之一。那么NFS服务器主要的任务是进行文件系统的共享,而文件系统的共享是与权限有关的,因此NFS服务器至少须要两个daemons,一个管理客户端是否可以登陆的问题,一个管理客户端可以取得的权限。若是须要quota的话,那么NFS还须要加载其余的RPC程序,NFS服务器有一下几个daemon。网络

rpc.nfsdapp

最主要的NFS服务提供程序,这个daemon主要的功能是管理客户端是否可以使用服务器文件系统的挂载信息等,其中还包含判断这个登陆用户的ID。socket

rpc.mountd

这个daemon主要功能,则是在于管理NFS的文件系统。当客户端顺利经过rpc.nfsd登陆服务器以后,在它可使用NFS服务器提供的文件以前,还会通过文件权限的热证程序。它会去读NFS的配置文件/etc/exports来对比客户端的权限,当经过这一关以后客户端就能够取得使用NFS文件的权限了。

rpc.lockd(非必要)

这个daemon能够用来管理文件锁定(lock)方面。文件为什么要锁定呢?由于既然共享的NFS文件可让客户端使用,那么当多个客户端同时尝试写入某个文件时,就可能对文件形成必定的问题。rpc.lockd则能够用来客服这些问题。但rpc.lockd必需要同时在客户端和服务器端都开启才行,此外,roc.lockd也常与rpc.statd同时启动。

rpc.statd(非必要)

这个daemon能够用来检查文件的一致性,与rpc.lockd有关。若发生由于客户端同时使用同一文件形成可能有所损坏时,rpc.statd能够用来检测并尝试回复该文件,与rpc.lockd同样,这个功能必要要在服务端和客户端同时启动才会生效。

上述的几个RPC 所须要的程序,其实都已经写入两个基本的服务器启动脚本中了,那就是bfs和nfslock,也就是/etc/init.d/nfs和/etc/init.d/nfslock,与服务器相关的写入nfs服务中,而与客户端的rpc.lockd相关,就设置于nfslock服务中。

1.4 NFS的文件系统的访问权限

不知道你们想没想过一个问题,假如在NFS Client1上面以dmtsai这个用户身份去访问/home/data/sharefile/这个来自NFS Server所提供的文件系统,请问NFS Server所提供的文件系统会让咱们以什么身份去访问?是dmtzai仍是其余什么?

当以dmtsai这个通常身份用户去访问来自服务器端的文件时,须要注意的是:文件系统的inode所记录的属性为UID、GID,而非帐号与属组名。那通常linux主机会主动以本身的/etc/passwd、/etc/group来查询对应的用户名,组名。因此当dmtsai进入到该目录后,会参照NFS Client1的用户名与组名,可是因为该目录的文件来自于NFS Server,因此可能会出现如下几种状况。

(1)NFS Server/NFS Client恰好有相同的帐号与属组名

此时用户能够直接以dmtsai的身份访问服务器所提供的共享文件系统。

(2)NFS Server的502这个UID帐号对应的帐号为vbird

若NFS服务器上的/etc/passwd里面UID 502的用户为vbird,则客户端的dmtsai能够访问服务器端的vbird这个用户的文件,只由于二者有相同的UID而已。这样就不能保证客户端的UID对应的帐号会与服务器相同,那nfs服务器所提供的数据岂不就可能会被错误的用户乱改?

(3)NFS Server并无502这个UID

另外一种状况是,在服务器端并无502这个UID的存在,则此时dmtsai的身份在该目录下就会被压缩成匿名用户,通常NFS的匿名者把65534做为其ID,早期的linux中这个65534的帐号名称一般是nobody,Centos则取名为nfsnobody。但有时也有特殊的状况,例如在服务器共享/tmp目录的时候,dmtsain的身份仍是会保持502,但创建的各项数据在服务器端来看,就会属于无属主的数据。

(4)若是用户身份是root

有个比价特殊的用户,那就是每一个linux主机都有的UID为0的root。若是客户端能够用root的身份去访问服务器的文件系统,那服务器的数据哪会有什么安全性保护?因此在默认状况下,root的身份会被主动压缩成为匿名用户。

总之,客户端用户能作的事情是与UID及其GID有关的,那当客户端与服务器端的UID即帐号的对应不一致时,可能就会形成文件系统使用上的混乱,这是NFS文件系统在使用上的一个弊端,而在了解用户帐号与UID及文件系统的关系以后,要实际在客户端以NFS使用服务器端的文件系统时,还须要具有:

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

(2)实际的文件权限具备可写入(w)的权限。

当知足了如下的文件:①用户帐号,即UID的相关身份;②NFS服务器容许写入的权限;③文件系统确实是有w的权限时,才具备该文件的可写入权限,尤为是身份(UID)确认环节,很容易弄错。

2.NFS Server端的配置

2.1 所须要的软件

RPC主程序:rpcbind

NFS主程序:nfs-utils

用rpm或者yum安装

[root@nfs_server ~]# yum install nfs-utils rpcbind -y
[root@nfs_server ~]# rpm -qa|grep nfs
nfs-utils-lib-1.1.5-13.el6.x86_64
nfs-utils-1.2.3-78.el6_10.1.x86_64
[root@nfs_server ~]# rpm -qa|grep rpcbind
rpcbind-0.2.0-16.el6.x86_64

2.2 NFS软件的结构

(1)主要配置文件:/etc/exports

这个文件时NFS的主要配置文件。不过系统并无默认值,因此这个文件不必定存在,可能要用vim建立。里面的一些参数能够用man exports查看。

(2)NFS文件系统维护命令:/usr/sbin/exportfs

[root@nfs_server ~]# which exportfs
/usr/sbin/exportfs

这个是维护NFS共享资源的命令,能够利用这个命令从新共享/etc/exports更新的目录资源、将NFS Server共享的目录卸载或从新共享等。

(3)共享资源的日志文件:/var/lib/nfs/*tab

在NFS服务器中,日志文件都放置到/var/lib/nfs/目录中、在该目录下有两个比较重要的日志文件,一个是etab,主要记录了NFS所共享出来的目录的完整权限的设置值;另外一个就是xtab,则记录了曾经连接到此NFS服务器的相关客户端的数据。

[root@nfs_server ~]# ll /var/lib/nfs/*tab
 -rw-r--r-- 1 root root 0 Oct  9 23:50 /var/lib/nfs/etab
 -rw-r--r-- 1 root root 0 Oct  9 23:50 /var/lib/nfs/rmtab
 -rw-r--r-- 1 root root 0 Oct  9 23:50 /var/lib/nfs/xtab

(4)客户端查询服务器共享资源的命令:/usr/sbin/showmount

这是一个重要的NFS命令。export用在NFS Server端,而showmount则主要用在客户端。showmount能够用来查看NFS共享出来的目录资源。

2.3 /etc/exports配置文件的语法与参数

在开始NFS服务器的配置以前要了解的是,NFS会直接使用到内核功能,因此内核必须支持NFS才行。万一若是全部的核心版本小于2.2版本,那么就要注意了可能忘记选择NFS的内核支持。

还好Centos或者是其余版本的linux,默认内核一般是支持NFS功能的,因此只要确认内核的版本是当前的2.6.X版本。

[root@nfs_server ~]# uname -r
 2.6.32-696.el6.x86_64

至于NFS服务器的搭建很简单,只要编辑好主配置文件/etc/exports以后,先启动rpcbind(若是已经启动了,就不要从新启动),而后再启动NFS,nfs服务器就搭建成功了。下面看一下文件的配置:

[root@nfs_server ~]# cat /etc/exports
/tmp      192.168.136.0/24(rw) localhost(rw) *.ev.ncku.edu.tw(ro,sync)

[共享目录tmp]  [第一台主机(权限)][第二台主机能够用主机名(rw)]  [可用通配符表示]

上面的例子是将/tmp分别分享给3个不一样的主机或网络。主机后面要用小括号“()”定义权限参数,若权限参数不止一个时,则以逗号“,”分开,而且主机名与小括号是连在一块儿的,这个文件内也能够用井号“#”来注释。

主机名的设置有下面几种方式:

(1)可使用完整的IP或者是网络号,例如192.168.136.0或者192.168.136.0/24,或192.168.136.0/255.255.255.0均可以。

(2)可使用主机名,但这个主机名必须在/etc/hosts内,或者使用DNS找到该名称才行,反正重点是可找到IP就行。若是是主机名的话,那么能够支持通配符。例如"*"或“?”均可以。

经常使用权限参数以下图所示:

文件服务器之NFS服务器

例题1:

让root保留root的权限

假如想讲/tmp共享出去给你们使用,因为这个目录原本就是你们均可以读写的,一次想让全部人均可以访问。此外,要让root写入的文件还具备root的权限,那应该如何设计配置文件呢?

答:

[root@nfs_server ~]# cat /etc/exports
/tmp   192.168.136.0/24(rw) localhost(rw) *.ev.ncku.edu.tw(ro,sync)
#任何人均可以用/tmp,用通配符来处理主机名,重点在no_root_squash
/tmp*(rw,no_root_squash)

主机名可使用通配符,上例表示不管来自哪里的用户均可以使用/tmp目录。再次提醒,*(rw,no_root_squash)这个设置值中间是没有空格符的。而/tmp和*(rw,no_root_squash)则是用空格符来隔开的。特别注意no_root_squash的功能,在这个例子中,若是你是客户端,并且你是以root的身份登陆你的linux主机,那么当你挂载这台主机的/tmp目录后,在使用该目录时将具备root的权限。

例题2:

同一目录针对不一样范围开放不一样权限

加入要将一个公共的目录/home/public开放,可是须要限定在局域网192.168.136.0/24这个网络且加入linzhongniao组的用户才可以读写,其余来源的用户只能读取。

答:

[root@nfs_server ~]# mkdir -p /home/public
[root@nfs_server ~]# setfacl -m g:linzhongniao:rwx /home/public/
[root@nfs_server ~]# cat /etc/exports
#多个范围用空格分开
/home/public 192.168.136.0/24(rw) *(ro)

上面的例子说明,当ip为192.168.136.0/24这个网段的时候,在客户端挂载了/home/public后,针对这个挂载的目录就具备能够读写的权限,至于不在这个网段的用户,对这个目录只具备能够读写的权限。

注意:通配符只能用在主机名的分辨上,IP或网段只能用192.168.136.0/24的形式,不可使用192.168.136.*这种格式表示。

例题3:

仅给某一个主机使用的目录设置

假如要将一个私人的目录/home/test开放给192.168.136.114这个客户端的机器来使用,该如何设置?假设具备完整权限的用户是dmtsai。

答:

[root@nfs_server ~]# mkdir -p /home/test
[root@nfs_server ~]# setfacl -m u:dmtsai:rwx /home/test
[root@nfs_server ~]# cat /etc/exports
#只要设置的ip正确便可
/home/test 192.168.136.114(rw)

例题4:

开放匿名访问的状况

假如要让*.centos.vbird网络的主机,登陆到NFS主机时,能够访问/home/linux,可是在写入数据时,但愿他们的UID与GID都变成45这个身份的用户,假设NFS服务器上的UID45和GID45的用户/组名为nfsanon。

[root@nfs_server ~]# cat /etc/exports
#若是要开放匿名访问,那么重点是all_squash,而且要配合anonuid
/home/linux *.centos.vbird(rw,all_squash,anonuid=45,anongid=45)

注意all_squash与anonuid、anongid的功能。如此一来当*.centos.vbird登陆这台NFS主机,而且在/home/linux写入文件时,该文件的属主与属组就会变成/etc/passwd里面对应的UID为45的那个身份的用户了。

2.4 启动NFS

[root@nfs_server ~]# cat /etc/exports
/wwwdir 192.168.136.0/24(rw,no_root_squash,sync)
[root@nfs_server ~]# /etc/init.d/rpcbind start
[root@nfs_server ~]# /etc/init.d/nfslock start
[root@nfs_server ~]# /etc/init.d/nfs start
Starting NFS services: [  OK  ]
Starting NFS quotas:   [  OK  ]
Starting NFS mountd:   [  OK  ]
Starting NFS daemon:   [  OK  ]
Starting RPC idmapd:   [  OK  ]
[root@nfs_server ~]# chkconfig rpcbind on
[root@nfs_server ~]# chkconfig nfs on
[root@nfs_server ~]# chkconfig nfslock on

rpcbind不须要配置,直接启动便可。启动以后会出现一个port 111的sunrpc的服务,那就是rpcbind。至于nfs则会启动至少两个以上的daemon,而后就开始监听client端的请求。必需要注意屏幕上的输出,若是配置文件写错的话会输出错误的地方。

此外若是想要保证NFS服务器的一致性,可能须要用到rpc.lockd及rpc.start等rpc服务,这是须要增长的服务,就是nfslock。启动以后要赶快查看/var/log/message日志文件有没有正确启动。

[root@nfs_server ~]# tail  /var/log/messages  
Nov  8 09:59:24 nfs_server kernel: e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
Nov  8 09:59:24 nfs_server kernel: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
Nov  8 10:45:25 nfs_server kernel: RPC: Registered named UNIX socket transport module.
Nov  8 10:45:25 nfs_server kernel: RPC: Registered udp transport module.
Nov  8 10:45:25 nfs_server kernel: RPC: Registered tcp transport module.
Nov  8 10:45:25 nfs_server kernel: RPC: Registered tcp NFSv4.1 backchannel transport module.
Nov  8 10:45:25 nfs_server kernel: Installing knfsd (copyright (C) 1996 okir@monad.swb.de).
Nov  8 10:45:25 nfs_server rpc.mountd[2808]: Version 1.2.3 starting
Nov  8 10:45:25 nfs_server kernel: NFSD: Using /var/lib/nfs/v4recovery as the NFSv4 state recovery directory
Nov  8 10:45:25 nfs_server kernel: NFSD: starting 90-second grace period

在确认正确启动以后,查看一下NFS服务器开了那些端口

[root@nfs_server ~]# netstat -lntup|grep -E "rpc|nfs"
tcp0  0 0.0.0.0:48897   0.0.0.0:*   LISTEN  2808/rpc.mountd 
tcp0  0 0.0.0.0:875 0.0.0.0:*   LISTEN  2803/rpc.rquotad
tcp0  0 0.0.0.0:111 0.0.0.0:*   LISTEN  1382/rpcbind
tcp0  0 0.0.0.0:44691   0.0.0.0:*   LISTEN  2808/rpc.mountd 
tcp0  0 0.0.0.0:48952   0.0.0.0:*   LISTEN  2808/rpc.mountd 
tcp0  0 0.0.0.0:59065   0.0.0.0:*   LISTEN  1404/rpc.statd  
tcp0  0 :::35080:::*LISTEN  1404/rpc.statd  
tcp0  0 :::111  :::*LISTEN  1382/rpcbind
tcp0  0 :::44050:::*LISTEN  2808/rpc.mountd 
tcp0  0 :::33399:::*LISTEN  2808/rpc.mountd 
tcp0  0 :::41721:::*LISTEN  2808/rpc.mountd 
udp0  0 0.0.0.0:709 0.0.0.0:*   1382/rpcbind
udp0  0 127.0.0.1:732   0.0.0.0:*   1404/rpc.statd  
udp0  0 0.0.0.0:875 0.0.0.0:*   2803/rpc.rquotad
udp0  0 0.0.0.0:111 0.0.0.0:*   1382/rpcbind
udp0  0 0.0.0.0:34709   0.0.0.0:*   2808/rpc.mountd 
udp0  0 0.0.0.0:42402   0.0.0.0:*   2808/rpc.mountd 
udp0  0 0.0.0.0:42285   0.0.0.0:*   1404/rpc.statd  
udp0  0 0.0.0.0:44983   0.0.0.0:*   2808/rpc.mountd 
udp0  0 :::709  :::*1382/rpcbind
udp0  0 :::33508:::*2808/rpc.mountd 
udp0  0 :::111  :::*1382/rpcbind
udp0  0 :::47999:::*2808/rpc.mountd 
udp0  0 :::36500:::*2808/rpc.mountd 
udp0  0 :::38456:::*1404/rpc.statd

咱们看启动了好多端口,不过最主要的端口是:

rpcbind启动的prot在111端口,同时启动在UDP和TCP。

[root@nfs_server ~]# netstat -lntup|grep -E "rpc|nfs"|grep "111"
tcp0  0 0.0.0.0:111 0.0.0.0:*   LISTEN  1382/rpcbind
tcp0  0 :::111  :::*LISTEN  1382/rpcbind
udp0  0 0.0.0.0:111 0.0.0.0:*   1382/rpcbind
udp0  0 :::111  :::*1382/rpcbind

NFS自己的服务启动在port 2049上。

其余的rpc.*服务启动的port则是随机产生的,所以须要向port 111注册。

怎么知道每一个RPC服务的注册状况呢?能够用rpcinfo命令查看

[root@nfs_server ~]# rpcinfo -p [IP|hostname]
[root@nfs_server ~]# rpcinfo -t|-u  [IP|hostname] 程序名称例如nfs
 -p:针对某IP(未写则默认为本机) 显示出全部的port与program(程序)的信息。
 -t:针对某主机的某个程序检查其TCP数据包所在的软件版本。
 -u:针对某主机某个程序检查其UDP数据包所在的软件版本。

#1.显示出目前这台主机的rpc状态
[root@nfs_server ~]# rpcinfo -p localhost
program vers proto   port  service
1000004      tcp     111  portmapper
1000003      tcp     111  portmapper
1000002      tcp     111  portmapper
1000004      udp     111  portmapper
1000003      udp     111  portmapper
1000002      udp     111  portmapper
1000241      udp    42285  status
1000241      tcp    59065  status
1000111      udp    875  rquotad
1000112      udp    875  rquotad
1000111      tcp    875  rquotad
1000112      tcp    875  rquotad
1000051      udp   42402  mountd
1000051      tcp   44691  mountd
1000052      udp   34709  mountd
1000052      tcp   48952  mountd
1000053      udp   44983  mountd
1000053      tcp   48897  mountd
1000032      tcp   2049  nfs
1000033      tcp   2049  nfs
1000034      tcp   2049  nfs
1002272      tcp   2049  nfs_acl
1002273      tcp   2049  nfs_acl
1000032      udp   2049  nfs
1000033      udp   2049  nfs
1000034      udp   2049  nfs
1002272      udp   2049  nfs_acl
1002273      udp   2049  nfs_acl
1000211      udp  45895  nlockmgr
1000213      udp  45895  nlockmgr
1000214      udp  45895  nlockmgr
1000211      tcp  40840  nlockmgr
1000213      tcp  40840  nlockmgr
1000214      tcp  40840  nlockmgr
程序代号 NFS版本 数据包类型  端口   服务名称

 #2.针对nfs这个程序检查其相关软件的软件版本信息(仅查看tcp数据包)
[root@nfs_server ~]# rpcinfo -t localhost nfs
program 100003 version 2 ready and waiting
program 100003 version 3 ready and waiting
program 100003 version 4 ready and waiting
能够发现提供NFS的共有三种,分别是二、三、四、版

上面的信息中须要除了程序名称与对应的端口能够与netstat -lntup输出的结果做对比以外,还须要注意到NFS的版本支持。新的NFS版本传输速度较快,由上表看,咱们的NFS支持到第四版。若是rpcinfo没法输出,那就表示注册的数据有为题,可能须要从新启动rpcbind与nfs。

2.5 NFS的链接查看

在NFS服务器设置稳当以后,咱们能够在Server端自我测试一下是否能够链接。具体作法就是用showmount这个命令查看

[root@nfs_server ~]# showmount [-a|-e] [hostname|IP]
选项与参数:
-a:显示当前主机与客户端的NFS链接共享的状态
-e:显示某台主机的/etc/exports所共享的目录数据

#显示配置好的exports共享目录信息
[root@nfs_server ~]# showmount -e localhost
Export list for localhost:
/wwwdir 192.168.136.0/24

当要扫描某一台主机提供的NFS共享目录时,就使用showmount -e IP(或hostname)便可,这也是NFS客户端最经常使用的命令,另外NFS关于目录权限设置的数据很是多。/etc/exports只是比较特别的权限参数而已,还有许多默认参数。这些默认参数在哪里?检查一下/var/lib/nfs/etab就知道了。

[root@nfs_server ~]# tail /var/lib/nfs/etab 
/wwwdir 192.168.136.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,no_root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534,sec=sys,rw,no_root_squash,no_all_squash)
#上面能够看出除了rw、sync等。其实还有anonuid及anongid等的设置

经过上面的案例分析anonuid和anongid对比/etc/passwd以及/etc/group,会发现记录的用户和组是nfsnobody,这个帐号在不一样的版本中多是不同。另外若是有其余客户端挂载服务器端的NFS文件系统,那么该客户端与文件系统信息就会被记录到/var/lib/nfs/xtab里去。

[root@nfs_server ~]# grep "65534" /etc/passwd
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
[root@nfs_server ~]# grep "65534" /etc/group
nfsnobody:x:65534:

若是想要从新处理/etc/exports文件,当从新设置完/etc/exports后需不须要从新启动NFS?不须要。若是从新启动NFS的话,要得再向RPC注册,很麻烦。这个时候就能够经过exportfs这个NFS文件系统维护命令来处理。

[root@nfs_server ~]# exportfs [-a|-r|-u|-v]
选项参数:
 -a:所有挂载(或卸载)/etc/exports中的设置
 -r:从新挂载/etc/exports里面的设置,此外也更新/etc/exports及/var/lib/nfs/xtab的内容
 -u:卸载某一个目录
 -v:在export的时候,将共享的目录显示在屏幕上

#从新挂载一次/etc/exports的设置,至关于/etc/init.d/nfs reload
[root@nfs_server ~]# exportfs -arv
exporting 192.168.136.0/24:/wwwdir

#将已经共享的NFS目录资源所有卸载
[root@nfs_server ~]# exportfs -auv
#这时若是再使用showmount -e localhost就看不到任何资源了

这样就能够从新exportfs咱们记录在/etc/exports文件中的目录数据了。可是要特别留意,若是仅处理配置文件,但并无相对应的目录等,就会出现警告信息,因此要先建立共享目录。

2.6 NFS的安全性

(1)防火墙的设置问题与解决方案

通常来讲NFS服务器是对内部网络开放的,不会对内特网开放。然而,若是有特殊需求的话,可能会跨不一样的网络。可是NFS的防火墙很很差弄,为何呢?由于除了固定的port1十一、2049以外,还有不少由rpc.mountd、rpc.rquotad等服务开启的端口不固定,因此iptables就很难设定规则,那怎么办呢?

为了解决这个问题,Centos6.x提供了一个固定NFS服务端口的配置文件,那就是/etc/sysconfig/nfs。在这个文件中就可以制定特定的端口,这样每次启动NFS时,相关服务启动的端口就会固定,这样就能设置防火墙了。那么须要修改的RPC服务有哪些呢?主要有mountd、rquotad、nlockmgr这3个。

[root@nfs_server ~]# sed -i 's@#RQUOTAD_PORT=875@RQUOTAD_PORT=875@g' /etc/sysconfig/nfs 
[root@nfs_server ~]# sed -i 's@#LOCKD_TCPPORT=32803@LOCKD_TCPPORT=32803@g' /etc/sysconfig/nfs   
[root@nfs_server ~]# sed -i 's@#LOCKD_UDPPORT=32769@LOCKD_UDPPORT=32769@g' /etc/sysconfig/nfs   
[root@nfs_server ~]# sed -i 's@#MOUNTD_PORT=892@MOUNTD_PORT=892@g' /etc/sysconfig/nfs   
[root@nfs_server ~]# grep -nE "RQUOTAD_|LOCKD_T|LOCKD_U|MOUNTD_P" /etc/sysconfig/nfs  
12:RQUOTAD_PORT=875
20:LOCKD_TCPPORT=32803
22:LOCKD_UDPPORT=32769
57:MOUNTD_PORT=892
把前面的注释去掉,端口的值能够自行设定也能够不变

[root@nfs_server ~]# /etc/init.d/nfs restart 重启尽可能用reload
Shutting down NFS daemon:  [  OK  ]
Shutting down NFS mountd:  [  OK  ]
Shutting down NFS quotas:  [  OK  ]
Shutting down NFS services:[  OK  ]
Shutting down RPC idmapd:  [  OK  ]
Starting NFS services: [  OK  ]
Starting NFS quotas:   [  OK  ]
Starting NFS mountd:   [  OK  ]
Starting NFS daemon:   [  OK  ]
Starting RPC idmapd:   [  OK  ]
[root@nfs_server ~]# rpcinfo -p|grep -E "rquota|mount|nlock"
1000111   udp875  rquotad
1000112   udp875  rquotad
1000111   tcp875  rquotad
1000112   tcp875  rquotad
1000051   udp892  mountd
1000051   tcp892  mountd
1000052   udp892  mountd
1000052   tcp892  mountd
1000053   udp892  mountd
1000053   tcp892  mountd
1000211   udp  32769  nlockmgr
1000213   udp  32769  nlockmgr
1000214   udp  32769  nlockmgr
1000211   tcp  32803  nlockmgr
1000213   tcp  32803  nlockmgr
1000214   tcp  32803  nlockmgr

假设想要开放192.168.136.0/24这个网段的用户可以使用这台服务器的NFS资源,须要这样配置

[root@nfs_server ~]# iptables -A INPUT -i eth0 -p tcp -s 192.168.136.0/24 -m multiport --dport 111,2049,875,32803,32767,892 -j ACCEPT
[root@nfs_server ~]# iptables -A INPUT -i eth0 -p udp -s 192.168.136.0/24 -m multiport --dport 111,2049,875,32803,32767,892 -j ACCEPT

(2)使用/etc/exports设置更安全的权限

这就要逻辑的思考了,可是要在便利与安装之间找到平衡点,善用root_squash和all_squash等功能,再利用anonuid等的设置来规范主机的用户部分。

(3)分区计划

若是有多台linux主机,而且打算彼此共享目录,那么在安装的时候能够规划处一块分区做为预留之用。

3.NFS服务器关机注意事项

当NFS使用的这个RPC服务在客户端链接上服务器时,那么服务器想要关机。那可能就会成为“不可能的服务”。若是服务器上面还有客户端链接,那么可能须要等待几个钟头才可以正常关机。因此,建议NFS服务器想要关机以前,先关掉rpcbind和nfs的这两个进程,若是没法将这两个进程关掉,那么先用netstat -lutp找出PID,而后再kill将它关掉,这样才能保证正常关机。

固然还能够利用showmount -a localhost来查出哪一个客户端还在链接,能够告诉他们,让他们先挂断服务。

4.NFS客户端的设置

既然NFS服务器最主要的工做就是共享系统给网络上其余的客户端,因此客户端固然须要挂载NFS服务器的文件系统,那么NFS服务器能够经过防火墙来保护本身,那么客户端挂载文件系统以后不须要保护本身吗?

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

客户端挂载文件系统,能够这样作:

(1)确认本地端已经启动了rpcbind服务。

(2)扫描NFS服务器共享的目录有哪些,并了解咱们是否可使用(showmount)

(3)在本地端创建预计要挂载的目录(mkdir)

(4)利用mount将远程主机直接挂载到相关目录

假如客户端在192.168.136.117(ping)这台机器上,而nfs服务器在192.168.136.118这台机器上,那么赶忙来检查一下咱们是否已经启动rpcbind服务,另外看看nfs服务器主机有什么可用的目录。

#1.客户端启动必备的服务
[root@ping ~]# /etc/init.d/rpcbind start
Starting rpcbind:  [  OK  ]
[root@ping ~]# /etc/init.d/nfslock start
Starting NFS statd:[  OK  ]
#客户端已经启动nfslock的话,客户端也要启动才能生效

#2.查看服务器给咱们提供了哪些可使用的资源,通常在配置完exports配置文件以后查看
[root@ping ~]# showmount -e 192.168.136.118
Export list for 192.168.136.118:
/wwwdir 192.168.136.0/24 <==这是一下子要挂载的目录

接下来想要将远程主机的/wwwdir挂载到本地端主机的/home/nfs/public目录下,因此就须要在本地端主机先创建起这个挂载点的目录,而后就能够用mount这个命令直接挂载了。

#3.挂载远程主机的/wwwdir目录
[root@ping ~]# mkdir -p /home/nfs/public
[root@ping ~]# mount -t nfs 192.168.136.118:/wwwdir /home/nfs/public
#语法:-t nfs用于指定文件系统类型
192.168.136.118:/wwwdir  指定某一台主机的某个目录
/home/nfs/public   客户端要挂载的目录、

#4.使用df或者mount查看挂载以后的状况
[root@ping ~]# df
Filesystem   1K-blocksUsed Available Use% Mounted on
/dev/sda4  8717516 1162724   7105308  15% /
tmpfs   502056   0502056   0% /dev/shm
/dev/sda1   194241   34853149148  19% /boot
/dev/sda2  9948012  111408   9324604   2% /var
 192.168.136.118:/wwwdir
   8717568 1162752   7105280  15% /home/nfs/public

如何将挂载的目录卸载呢?能够用umount命令,强制卸载umount -lf(小写的L)

[root@ping ~]# umount /home/nfs/public/

4.2 客户端的挂载参数与开机挂载

除了NFS服务器须要保护以外,客户端也须要自我保护,这能够经过mount挂载指定参数实现,下图列出了mount命令的主要参数

文件服务器之NFS服务器

经常使用选项:

-t 后面指定经常使用文件系统类型,ext, ext2, ext3, ext4,xfs

-o 选项的选择,后面指定要挂载的参数

-a 全部的,挂载挂载/etc/fstab中提到的全部(给定类型的)文件系统。

若是NFS服务器所提供的只是相似/home下面的我的数据,应该不须要可执行、SUID与设备文件,所以在挂载的时候,可使用下面的命令:

[root@ping ~]# mount -t nfs -o nosuid,noexec,nodev,rw 192.168.136.118:/wwwdir /home/nfs/public
[root@ping ~]# mount |grep "addr"
 192.168.136.118:/wwwdir on /home/nfs/public type nfs (rw,noexec,nosuid,nodev,vers=4,addr=192.168.136.118,clientaddr=192.168.136.117)

这样挂载这个文件系统就只能进行数据访问,相对来讲,对于客户端是比较安全的,因此nousid、noexec、nodev等参数要牢记。

案例:用df -h查看系统挂载发现文件系统只读

文件系统只读案例:http://blog.sina.com.cn/s/blog_4a2fadfb010131jf.html

解决:

一、先用umout卸载,不能卸载加-lt参数强制卸载,从新mount便可

二、mount -o rw,remount /

4.3 关于NFS特殊的挂载参数

除了上面的mount参数以外,针对NFS服务器,linux还提供了很多有用的额外参数,这些参数颇有用,举例来讲因为文件系统对linux系统很是重要,由于在进行任何操做时,只要用到文件系统,那么整个目录树系统就会主动的去查询所有的挂载点。若是nfs服务器与客户端之间的链接由于网络问题,或者是服务器端先关机了没有通知客户端,那么客户端在使用文件系统命令的时候就很是慢,由于必须等到文件系统查找等待时间后,系统才可以继续工做。

为避免出现这些问题,还有一些额外的参数可用,如图所示:

文件服务器之NFS服务器

更多的参数能够man nfs ,一般若是NFS是用在高速运行的环境中的话,建议加上这些参数

[root@ping ~]# umount /home/nfs/public
[root@ping ~]# mount -t nfs -o nosuid,noexec,nodev,rw,bg,soft,rsize=1000,wsize=1000 192.168.136.118:/wwwdir /home/nfs/public

4.4 使NFS开机挂载

咱们知道开机就挂在的挂载点与相关参数是写入/etc/fstab文件中的,那NFS能不能写入/etc/fstab中呢?很是惋惜的是,不能够,为何呢?分析开机启动流程,咱们能够发现网络的启动是在本机挂载以后,所以当你利用/etc/fstab尝试挂载NFS时,系统因为还没有启动网络,因此没法挂载成功。那怎么办呢?写入到/etc/rc.d/rc.local便可。

方法一:

[root@ping ~]# echo "mount -t nfs -o nosuid,noexec,nodev,rw,bg,soft,rsize=1000,wsize=1000 192.168.136.118:/wwwdir /home/nfs/public" >>/etc/rc.local

方法二:

[root@backup backup2]# tail -1 /etc/fstab
 10.0.10.241:/data1  /backup2nfs defaults0 0
[root@backup backup2]# chkconfig netfs on
[root@backup backup2]# chkconfig --list netfs
netfs   0:关闭  1:关闭  2:启用  3:启用  4:启用  5:启用  6:关闭

4.5 自动挂载autofs的使用

在通常NFS文件系统的使用过程当中,若是客户端要使用服务器所提供的NFS文件系统,要么就是在/etc/rc.d/rc.local中设置开机时挂载,要么就须要登陆后手动挂载,此外客户端须要预先手动创建好挂载点目录,而后挂载上来,可是这样会有一些小问题。

(1)NFS文件系统与网络链接的困扰

NFS服务器与客户端的链接或许不会永远存在,而RPC这个服务若是挂载了NFS服务器后,任何一方脱机均可能形成另外一方老是在等待超时。并且挂载的NFS文件系统可能又不常常被使用,若不挂在的话须要使用时又得通知管理员,这样很不方便。

那么为了解决这个问题,可不可让客户端在使用NFS文件系统的需求是才让系统自动挂载?

当NFS文件系统使用完毕后,可不可让NFS自动卸载,以免可能的RPC错误?

那么有没有办法实现上面的功能呢?有的,能够用autofs这个服务来实现。

(2)autofs的配置的概念

autofs这个服务在客户端计算机上面,会持续的检测某个指定的目录,并预先设置当使用到该目录下的某个子目录时,将会取得来自服务器端的NFS文件系统资源,并自行自动挂载的操做。拓扑图以下图所示:

文件服务器之NFS服务器

如上图所示,咱们的autofs的主要配置文件为/etc/auto.master。这个文件中的内容很简单咱们只要定义出须要挂载的目录(/home/nfsfile)便可,这个目录就是autofs要持续监测的目录,在/etc/auto.nfs(这个文件名能够自定义)里面则能够定义出每一个子目录所欲挂载的NFS目录资源。

举例来讲,当咱们在客户端要使用/home/nfsfile/wwwdir的数据时,此时autofs才会去192.168.136.118服务器上挂载/wwwdir,当隔了5分钟没有使用该目录下的数据后,则客户端将会主动卸载/home/nfsfile/wwwdir。

(3)安装autofs

[root@ping ~]# yum install autofs -y

(4)创建主配置文件/etc/auto.master,并指定检测的特定目录

这个主要配置文件的内容很简单,只要在要被检测的目录及数据对应文件便可,数据对应文件文件名是能够自行定义的,在这个例子中我使用/etc/auto.nfs来命名。

[root@ping ~]# cp /etc/auto.master{,.bak}
[root@ping ~]# >/etc/auto.master
[root@ping ~]# echo "/home/nfsfile /etc/auto.nfs" >>/etc/auto.m
auto.master  auto.master.bak  auto.misc
[root@ping ~]# echo "/home/nfsfile /etc/auto.nfs" >>/etc/auto.master
[root@ping ~]# cat /etc/auto.master
/home/nfsfile /etc/auto.nfs

提示:须要注意的是/home/nfsfile目录不须要实现存在,由于autofs会主动创建该目录。若是提早创建了反而会出现问题。

(5)创建数据对应文件内(/etc/auto.nfs)的挂载信息与服务器对应的资源

自行设置/etc/auto.nfs文件

格式:

[本地端子目录] [-挂载参数] [服务器所提供的目录]

选项与参数:

[本地端子目录] :指的是在/etc/auto.master内指定的目录及子目录

[-挂载参数]:就是前一小节提到的rw、bg、soft等参数,无关紧要

[服务器所提供的目录]:例如192.168.136.118:/wwdir等

[root@ping ~]# echo "wwwdir -rw,bg,no_root_squash 192.168.136.118:/wwwdir" >>/etc/auto.nfs
[root@ping ~]# cat /etc/auto.nfs
wwwdir -rw,bg,no_root_squash 192.168.136.118:/wwwdir

(6)实际操做与查看

启动autofs

[root@ping ~]# /etc/init.d/autofs start
Loading autofs4:   [  OK  ]
Starting automount:[  OK  ]

如今咱们以前并无挂载NFS服务器的资源目录,好了咱们来看一下几个重要的数据吧。先看看/home/nfsfile会不会主动被创建?而后若是进入/home/nfsfile/wwwdir目录文件系统如何变化?

[root@ping ~]# ls -ld /home/nfsfile/
drwxr-xr-x 2 root root 0 Nov  9 21:54 /home/nfsfile/
[root@ping ~]# cd /home/nfsfile/wwwdir
#注意这个地方若是只进入到/home/nfsfile/目录ls或者按tab键是找不到目录wwwdir的,只可以手敲出来,这时cd进入目录才自动挂载。
[root@ping wwwdir]# mount|grep "nfsfile"
 192.168.136.118:/wwwdir on /home/nfsfile/wwwdir type nfs (rw,no_root_squash,sloppy,vers=4,addr=192.168.136.118,clientaddr=192.168.136.117)
[root@ping wwwdir]# df /home/nfsfile/wwwdir/
Filesystem   1K-blocksUsed Available Use% Mounted on
 192.168.136.118:/wwwdir
   8717568 1162752   7105280  15% /home/nfsfile/wwwdir