NFS服务器
一、NFS服务器简介
NFS这个通过网络共享文件系统的服务在搭建的时候是很简单的,不过,它最大的问题在于“权限”。因为在客户端与服务器端必须具备相同的账号才能访问某些目录或文件。另外,NFS的启动需要通过所谓的远程过程调用(RPC),也就是说,我们并不是只要启动NFS就可以了,还需要启动RPC这个服务才可以。
在开始NFS配置之前,还需要了解一下什么是NFS.
1、什么是NFS(Network File System)
NFS是Network File System的缩写,最初是由Sun这家公司发展出来的。他最大的的功能是是可以通过网络,让不同的机器,不同的操作系统可以共享彼此的文件。所以,也可以简单的将它看做是一个文件服务器。这个NFS服务器可以让PC将网络中的NFS服务器共享的目录挂在到本地端的文件系统中,而在本地段的系统中看来,那个远程的主目录就好像自己的一个磁盘分区一样,在使用上相当便利。
既然NFS是通过网络进行数据传输的,那么便知道NFS会使用一些端口。那么NFS使用那个端口进行数据传输呢?基本上NFS这个服务的端口开在2049,但是由于文件系统非常复杂,因此NFS还会有其他的程序去启动额外的端口,但这些额外的端口是什么呢,答案是“不知道”。因为默认NFS用来传输的端口是随机选择的,小于1024端口。那客户端怎么只导服务端使用哪个端口呢?因此就需要远程调用(Remote Procedure Call,PRC)协议来辅助了。下面谈一下什么是RPC。
2、什么是RPC(Remote Procrdure Call)
因为NFS支持的功能相当多,而不同的功能都会使用不同的程序来启动,每启动一个功能都会启用一些端口来传输数据,因此,NFS的功能所对应的端口并不固定,而是随机取用一些未被使用的小鱼1024的端口用于传输。但如此一来又会产生客户端连接服务器的问题,因为客户端需要知道服务器端的相关端口才能连接。
此时,我们就会需要远程过程调用(RPC)服务了。RPC最主要的功能就是指定每个NFS功能所对应的port number,并且通知给客户端,让客户端可以连接到正确的端口上去。那么RPC又是如何知道每个NFS的端口呢?这是因为当服务器在启动NFS时,会随机选取数个端口,并主动向RPC注册,因此RPC可以知道每个端口对应的NFS功能。然后RPC又是固定使用port 111来监听客户端的需求并向客户端响应正确的端口,因此使NFS的启动更为快捷了。
注意:启动NFS之前,RPC就要先启动了,否则NFS会无法向RPC注册。另外,RPC若重新启动,原来注册的数据会不见了,因此RPC重新启动以后,他管理的所有服务都需要重新启动以重新向RPC注册。
当客户端有NFS文件访问需求时,他是如何向服务器端请求数据的呢?
1)客户端会向服务器端的RPC(port 111)发出NFS文件访问功能的查询要求。
2)服务端找到对应的已注册的NFS daemon端口后,会通知给客户端。
3)客户端了解正确的端口后,就可以直接与NFS daemon连接。
二、NFS Server端的配置
1、所需软件
RPC主程序:rpcbind
NFS主程序:nfs-utils
2、NFS的软件结构
主要配置文件:/etc/exports
NFS文件系统维护命令:/usr/sbin/exportfs
共享资源的日志文件:/var/lib/nfs/*tab
客户端查询服务器共享资源的命令:/usr/sbin/showmount
3、/etc/exports配置文件的语法与参数
在开始NFS服务的配置之前,必须要了解的是,NFS会直接使用内核功能,所以内核必须要支持NFS才行。万一如果所用的核心版本小于2.2版,或者重新编译过内核的话,那么就需要注意了,因为你可能会忘记选择NFS的内核支持。
我们的Centos或者是其他的版本的linux,默认内核通常是支持NFS功能的,所以只要确认内核版本是当前的新的2.6.x,并且使用的是distribution所提供的内核,那应该就不会有问题了。
NFS服务器的搭建其实很简单,只要编译好主要的配置文件/etc/exports之后,先自启动rpcbind(若已经启动,就不要重新启动),然后再启动NFS,NFS就启动成功了。不过这样的设置能否对客户端生效?那就需要考虑全线方面的配置能力了。
[root@localhost etc]#vi /etc/exports
/tmp 192.168.100.0/24(ro)localhost(rw)
*.ev.ncku.edu.tw(ro,sync)
[共享目录] [第一台主机(权限)][可用主机名表示] [可用通配符表示]
这个文件很简单。每一行最前面是要共享出来的目录,注意,是以目录为单位的。然后这个目录可以依照不同的权相共享给不同的主机。上面的例子是要把/tmp分别共享给三个不同的主机或网络。机的主机后面以小括号“()”定义权限参数,若权限参数不止一个时,则以逗号“,“分开,并且主机名与小括号是连在一起的。
/etc/exports配置文件的权限参数
rw ,ro:该目录共享的权限是可读写或只读,但最终能不能读写,还是与文件系统的rwx及身份有关。
snc,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。
例题1:让root保留root权限
[root@localhost etc]#vi /etc/exports
#任何人都可以用/tmp,用通配符来处理主机名,重点在no_root_squash
/tmp *(rw,no_root_squash)
主机名可以使用通配符,实例中表示无论来自哪里都可以使用/tmp这个目录。注意no_root_squash的功能。在这个例子中,如果你是客户端,而且你是以root身份登陆你的linux主机,那么当你mount上我这部主机的/tmp之后,你在该mount的目录当中,将具有root权限。
例题2:同一目录针对不同范围开放不同权限
假如要将一个公共的目录/home/public开放,但是需要限定在局域网192.168.211.0/24这个网络且加入vbirdgroup的用户才能够读写,其它来源的用户则只能读取。
[root@localhost etc]#mkdir /home/public
[root@localhost etc]#setfacl �Cm g:vbirdgroup:rwx /home/public
[root@localhost etc]#vi /etc/exports
/tmp *(rw,no_root_squash)
/home/public 192.168.211.0/24(rw) *(ro)
上面的例子说明,当IP在192.168.211.0/24这个网段的时候,那么当在client断骨在了server端的/home/public后,针对这个挂载目录就具有可以读写的权限。至于不在这个网段的情况,那么这个目录的数据就仅能读取而已,亦即为只读的属性。
4、启动NFS
[root@localhost etc]# /etc/init.d/rpcbind start
[root@localhost etc]# /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@localhost etc]# vi /etc/exports
[root@localhost etc]# /etc/init.d/nfslock start
[root@localhost etc]# chkconfig rpcbind on
[root@localhost etc]# chkconfig nfs on
[root@localhost etc]# chkconfig nfslock on
Rpcbind根本就不需要设置,只要直接启动它即可。启动之后,会出现一个port 111的sunrpc的服务,那就是rpcbind。至于nfs则会启动至少两个以上的daemon,然后就开始监听client端的请求。必须要特别注意屏幕上的输出信息,因为如果配置文件写错的话,屏幕上会有显示。
[root@localhost etc]# netstat -anltp | grep 111
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1185/rpcbind
tcp 0 0 :::111 :::* LISTEN 1185/rpcbind
此外,如果想要增加一些NFS服务的数据一致性功能,可能需要用到rpc.lockd及rpc.statd等RPC服务,这时就需要增加一个服务,那就是nfslock.启动之后,就到/var/log/messges里面看一下有没有正确启动。
[root@localhost etc]# tail /var/log/messages
Jan 26 00:48:12 localhost kernel: RPC: Registered tcp NFSv4.1 backchannel transport module.
Jan 26 00:48:12 localhost kernel: Installing knfsd (copyright (C) 1996 [email protected]).
Jan 26 00:48:12 localhost rpc.mountd[2805]: Version 1.2.3 starting
Jan 26 00:48:12 localhost kernel: NFSD: Using /var/lib/nfs/v4recovery as the NFSv4 state recovery directory
Jan 26 00:48:12 localhost kernel: NFSD: starting 90-second grace period
Jan 26 00:55:21 localhost kernel: nfsd: last server has exited, flushing export cache
Jan 26 00:55:21 localhost rpc.mountd[2805]: Caught signal 15, un-registering and exiting.
Jan 26 00:55:21 localhost rpc.mountd[2962]: Version 1.2.3 starting
Jan 26 00:55:21 localhost kernel: NFSD: Using /var/lib/nfs/v4recovery as the NFSv4 state recovery directory
Jan 26 00:55:21 localhost kernel: NFSD: starting 90-second grace period
查看一下NFS启用了哪些端口
[root@localhost etc]# netstat -anl | grep 111
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN
tcp 0 0 :::111 :::* LISTEN
udp 0 0 0.0.0.0:111 0.0.0.0:*
udp 0 0 :::111 :::*
[root@localhost etc]# netstat -anltp | grep 111
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1185/rpcbind
tcp 0 0 :::111 :::* LISTEN 1185/rpcbind
[root@localhost etc]# netstat -tulnp| grep -E '(rpc|nfs)'
tcp 0 0 0.0.0.0:875 0.0.0.0:* LISTEN 2958/rpc.rquotad
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1185/rpcbind
tcp 0 0 0.0.0.0:42768 0.0.0.0:* LISTEN 2962/rpc.mountd
tcp 0 0 0.0.0.0:36149 0.0.0.0:* LISTEN 2962/rpc.mountd
tcp 0 0 0.0.0.0:50428 0.0.0.0:* LISTEN 2962/rpc.mountd
tcp 0 0 0.0.0.0:36232 0.0.0.0:* LISTEN 1203/rpc.statd
tcp 0 0 :::111 :::* LISTEN 1185/rpcbind
tcp 0 0 :::51779 :::* LISTEN 2962/rpc.mountd
tcp 0 0 :::60583 :::* LISTEN 2962/rpc.mountd
tcp 0 0 :::38216 :::* LISTEN 2962/rpc.mountd
tcp 0 0 :::41544 :::* LISTEN 1203/rpc.statd
udp 0 0 0.0.0.0:875 0.0.0.0:* 2958/rpc.rquotad
udp 0 0 0.0.0.0:111 0.0.0.0:* 1185/rpcbind
udp
可以看出,NFS开启了很多port,主要的端口是:
Rpcbind启动的port在111,同时启动在UDP于TCP.
NFS本身的服务启动在port2049上。
其他rpc.*服务启动的port则是随机产生的,因此需向port 111注册。
怎么知道每个RPC服务的注册状况呢,可以使用rpcinfo来查看。
[root@localhost etc]# 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
100024 1 udp 59510 status
100024 1 tcp 36232 status
100011 1 udp 875 rquotad
100011 2 udp 875 rquotad
100011 1 tcp 875 rquotad
100011 2 tcp 875 rquotad
100005 1 udp 60511 mountd
[root@localhost etc]# 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
5、NFS的连接查看
在NFS服务器设置妥当之后,我们可以在server端先自我测试一下是否可以连接。具体做法用showmount这个命令来查看。
[root@localhost etc]# showmount -e localhost
Export list for localhost:
/tmp *
/home/test 192.168.211.2
/home/public (everyone)
当需要扫描某一台主机提供的NFS共享目录时,就使用showmount �Ce IP即可,非常方便。这也是NFS Client端最常用的命令。另外,NFS关于目录权限设置的数据非常多。/etc/exports只是比较特别的权限参数而已,还有很多默认的参数。
[root@localhost etc]# tail /var/lib/nfs/etab
/home/test 192.168.211.2(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534)
/home/public 192.168.211.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534)
/home/public
*(ro,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534)
/tmp *(rw,sync,wdelay,hide,nocrossmnt,secure,no_root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534)
如果有其他客户端挂载了你的NFS文件系统,那么该客户端与文件系统信息就会被记录到/var/lib/nfs/xtab里去。
如果想要重新处理/etc/exports文件,当重新设置完/etc/exports后需不需要重新穹顶NFS?不需要。如果重新启动NFS的话,就得再像RPC注册,很麻烦。这个时候我们可以通过exportfs这个命令来帮忙。
[root@localhost etc]# exportfs -arv
exporting 192.168.211.2:/home/test
exporting 192.168.211.0/24:/home/public
exporting *:/home/public
exporting *:/tmp
[root@localhost etc]# exportfs �Cauv
#这时如果你使用showmount �Ce localhost 就看不到任何资源了。
四、NFS客户端的设置
1、启动必备的服务
[root@localhost etc]#/etc/init.d/rpcbind start
[root@localhost etc]#/etc/init.d/nfslock start
2、查询服务器给我们提供了哪些可以使用的资源
[root@localhost etc]#showmount �Ce 192.168.211.128
/tmp *
/home/test 192.168.211.2
/home/public (everyone)
3、建立挂载点,并且实际挂载
[root@localhost etc]#mkdir �Cp /home/nfs/public
[root@localhost etc]#mount �Ct nfs 192.168.211.128:/home/public /home/nfs/public