一、NFS服务器的工作原理;
      NFS 是分布式计算机系统的一个组成部分,可实现在异构网络上共享和装配远程文件系统。NFS由sun公司开发,目前已经成为文件服务的一种标准(RFC1904  RFC1813),其最大的功能是可以通过网络让不同的操作系统的计算机可以共享数据,所以也可以将其看作是一台文件服务器,NFS的目标是使计算机资源共享;客户端可以挂载服务器端的所提供的目录,挂载到本机后就如同本地的磁盘分区一样,可以使用cp ,cd mv 及df等磁盘相关的命令;虽然NFS有属于自己的协议与使用端口,但是使用RPC"远程过程调用“来协助NFS服务器本身运行,NFS是不可以单独进行工作的,它必须跟portmap来协商生成的。Portmap用于提供RPC协议(远程过程调用)要想启动NFS,必须要启动portmap服务。先启portmap,后启nfs;不论是客户端还是服务器端要使用NFS都需要启动RPC.
      使用NFS,客户端可以透明地访问服务器中的文件系统,NFS从诞生到现在已经有许多版本,如NFS V2 (rfc794) 及 NFS V3 (rfc1813) 最新的是V4 (rfc307)。最早由于收到计算机硬件的发展sun公司将V2版的使用UDP 以减轻机器的负担,到了V3,sun公司选择了TCP作为默认的传输方式。
V3 相对V2 的主要区别:
1)、文件尺寸:
V2最大支持32位文件大小(4G),V3新增加了64位文件的支持;
2)、文件传输尺寸
V3没有限制、V2最多只能设定8KB,可以使用-rsize and -wsize 来设定;
3)、返回完整的信息
V3增加和完善了返回错误和成功的信息,对于服务器的管理和设置带来很大好处;
4)、增加了对TCP传输协议的支持;
5)、异步写入特性
6)、改进了服务器的Mount 性能
7)、有更好的i/o写性能
8)、更强的网络运行效能,使得网络运行更为有效
9)、更强的灾难恢复功能;

在LINUX 上,UDP是默认的使用协议,作为服务器别无选择,但作为客户端,可以使用TCP和其他使用TCP的UNIX NFS服务器互联。在局域网中使用UDP教好,因为局域网比较稳定,使用UDP可以带来更好要的性能,LINUX默认的是使用V2,但是也可以通过 mount option 的nfsvers=n 选择NFS提供的协议和服务运行于OSI层次模型的应用层。

二、安装NFS服务器

1、NFS有三个守护进程:
rpc.nfsd:它是基本的NFS守护进程,主要功能是管理客户端是否能够登录服务器;

rpc.mountd:它是RPC安装守护进程,主要功能是管理NFS的文件系统。当客户端顺利通过rpc.nfsd登录NFS服务后,在使用NFS服务所提供的文件前,还必须通过文件使用权限的验证。它会读取NFS的配置文件/etc/exports来对比客户端权限。

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


NFS的脚本:   /etc/init.d/nfs

NFS的端口:   Nfsd:2049    portmap : 111    其他的端口都是由portmap(111)来分配的

NFS的配置文件:  /etc/exports(主配置文件)     /etc/sysconfig/nfs(全局配置文件)



2、安装NFS
[root@dns ~]# rpm -qa |grep nfs
nfs-utils-lib-1.0.8-7.6.el5
nfs-utils-1.0.9-42.el5

[root@dns home]# ll cdsrc/Server/ |grep nfs
-rwxrwxrwx 1 root root    45067 04-15 15:10 nfs4-acl-tools-0.3.3-1.el5.i386.rpm
-rwxrwxrwx 1 root root   390078 04-15 15:10 nfs-utils-1.0.9-42.el5.i386.rpm
-rwxrwxrwx 1 root root    56265 04-15 15:10 nfs-utils-lib-1.0.8-7.6.el5.i386.rpm
-rwxrwxrwx 1 root root    58773 04-15 15:10 nfs-utils-lib-devel-1.0.8-7.6.el5.i386.rpm

-rwxrwxrwx 1 root root    59759 04-15 15:10 sblim-cmpi-nfsv3-1.0.14-35.el5.i386.rpm
-rwxrwxrwx 1 root root    12415 04-15 15:10 sblim-cmpi-nfsv3-test-1.0.14-35.el5.i386.rpm
-rwxrwxrwx 1 root root    56824 04-15 15:10 sblim-cmpi-nfsv4-1.0.12-35.el5.i386.rpm
-rwxrwxrwx 1 root root    12346 04-15 15:10 sblim-cmpi-nfsv4-test-1.0.12-35.el5.i386.rpm
-rwxrwxrwx 1 root root   189188 04-15 15:11 system-config-nfs-1.3.23-1.el5.noarch.rpm


[root@dns home]# rpm -ivh  cdsrc/Server/nfs4-acl-tools-0.3.3-1.el5.i386.rpm
Preparing...                ########################################### [100%]
   1:nfs4-acl-tools         ########################################### [100%]
[root@dns home]# rpm -ivh  cdsrc/Server/nfs-utils-lib-devel-1.0.8-7.6.el5.i386.rpm
Preparing...                ########################################### [100%]
   1:nfs-utils-lib-devel    ########################################### [100%]

[root@dns home]# rpm -qa | grep portmap
portmap-4.0-65.2.2.1

3、NFS的常用目录
1)、/etc/exports
这个文件是NFS的主要配置文件,不过系统并没有默认值,所以这个文件不一定会存在,可能要使用vi主动建立这个文件,不过现在都会有这个文件;
2)、/usr/sbin/exportfs
这是维护NFS共享资源的命令,我们可以用其重新分享/etc/exports变更的目录资源,并将NFS SERVER分享的目录卸载或重新分享等,这个命令是NFS系统中相当重要的一个;
3)、/usr/sbin/showmount
shouwmount命令主要是用在client端,可以用来查看NFS共享出来的目录资源;
4)、/var/lib/nfs/*tab
在NFS服务器的登录文件都放置在/var/lib/nfs目录中,在该目录下有两个比较重要的登录文件;etab记录了NFS分享出来的目录的完整权限设定值,另一个xtab,记录曾经连接到此NFS主机的相关客户端数据。

三、配置/etc/exports文件文件

   把需要共享的文件系统直接写在/etc/exports文件中,这样当NFS服务器重新启动时系统就会自动读取/etc/exports文件,从而告诉内核要输出的文件系统和相关的存取权限。
  初装时这个文件是空的,配置文件格式:
第一列:定义要本机共享的目录,用绝对路径,不能使用符号链接;

第二列:写入客户端描述,也就是哪些客户端可以使用你NFS服务器;
客户端是以下几种方式:
(1)、如果是单个机器:可以是一个能被服务器解析哦的域名或主机名,还可以是一个IP地址。
(2)、如果是有许多客户端,可以使用*或者?字符来制定一个字符串匹配。如one.example.com 可以表示成*.example.com,如果表示所有的IP都能访问,就直接输入* 
(3)、客户端是IP网络的表示方法:
使用a.b.c.d./z(netmask) ,a.b.c.d.是网络,z是即可以是掩码位数,也可以是写成255.x.x.0这样;

第三列:紧挨着第二列的,标识的是共享的权限 ;
(1)、rw:可读写权限。
(2)、ro:只读权限。
(3)、no_root_squash:当使用者使用root身份登录NFS提供的共享目录时,其权限将被转成为匿名使用者,通常他的uid、gid都会变成nobody身份。
(4)、root_squash:当使用者使用root身份登录NFS提供的共享目录时,那么对于这个共享目录来说它具有root权限;
(5)、all_squash:忽略登录NFS的用户身份,一律被转换为匿名身份,即nobody。
(6)、anonuid:通常为nobody,也可以自定义这个值,UID必须在于/etc/passwd中。
(7)、anongid:同anonuid,但是是设置groupid.
(8)、sync:同步写入资料到内存与硬盘中。
(9)、async:资料会先写入内存中,而非直接写入硬盘。
 (10)、no_subtree_check:不检测子目录,提高性能

举例:
/home/cdsrc    192.168.0.28(rw) 192.168.0.31(ro)

保存退出,启动服务portmap和nfsd
[root@dns cdsrc]# /etc/rc.d/init.d/portmap start
[root@dns cdsrc]# /etc/rc.d/init.d/nfs     start
portmap激活后的端口为111;
[root@dns cdsrc]# netstat -utln |grep 111
tcp  0      0 0.0.0.0:111   0.0.0.0:*   LISTEN
udp  0      0 0.0.0.0:111   0.0.0.0:*
NFS激活后至少两个以上的系统守护进程用来监听客户端的请求,使用cat /var/log/messages 可以查看是否成功;

1、启动和停止NFS服务器
[root@dns cdsrc]# service nfs status
rpc.mountd 已停
nfsd 已停
rpc.rquotad 已停
[root@dns cdsrc]# service nfs start
启动 NFS 服务:                                            [确定]
关掉 NFS 配额:                                            [确定]
启动 NFS 守护进程:                                        [确定]
启动 NFS mountd:                                          [确定]
[root@dns nfs]# netstat -autln |grep 2049
tcp   0   0 0.0.0.0:2049       0.0.0.0:*                   LISTEN
udp   0   0 0.0.0.0:2049       0.0.0.0:*
[root@dns cdsrc]# chkconfig --list nfs
nfs             0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭
[root@dns cdsrc]# chkconfig --level 345 nfs on

2、如果修改了exports文件后不需要重启nfs,只需要重新扫描一次/etc/exports文件,并且重新将设定加载即可:
#exports [-aruv]
(1)、-a:全部挂载/etc/exports设定;
(2)、-r:重新挂载/etc/exports中的设置,此外同步更新/etc/exports 及/var/lib/nfs/xtab中的内容
(3)、-u:卸载某一目录
(4)、-v:在export时将共享的目录显示在屏幕上。

3、showmount 指令看看是否共享成功
#showmount [-ae] hostname
(1)、-a或-all:以host:dir这样的格式来显示客户主机名称和挂载点目录;
(2)、-d或-directories:仅显示被客户挂载的目录名;
(3)、-e或-exports:显示NFS服务器的输出清单;
(4)、-h或-help:显示帮助信息;
(5)、-v或-version:显示版本信息;
(6)、--no-headers:禁止输出描述头部的信息;
[root@dns cdsrc]# showmount -e 192.168.0.25
Export list for 192.168.0.25:
/home/cdsrc 192.168.0.31,192.168.0.28
[root@dns cdsrc]# showmount -e
Export list for dns.lianhua.com:
/home/cdsrc 192.168.0.31,192.168.0.28
这是默认查看自己共享的服务,前提是要DNS能解析自己;

四、客户端链接
即可以使用通过在/etc/fstab中实现也可以使用mount命令来挂载。
[root@mysqlndb02 ~]# cd /mnt/
[root@mysqlndb02 mnt]# mkdir nfs
[root@mysqlndb02 ~]# mount -t nfs 192.168.0.25:/home/cdsrc /mnt/nfs
[root@mysqlndb02 ~]# df
文件系统               1K-块        已用     可用 已用% 挂载点
/dev/sda3             11095576   6378364   4144496  61% /
/dev/sda1               101086     11373     84494  12% /boot
tmpfs                   127720         0    127720   0% /dev/shm
192.168.0.25:/home/cdsrc
                      30470176   4900256  23997152  17% /mnt/nfs
通过实验得到一个问题
192.168.0.28 与192.168.0.31都加载了192.168.0.25的共享目录
服务器端的/var/lib/nfs/中etab确实记录了NFS分享出来的目录的完整权限设定值,而xtab中却什么内容也没有,客户端的记录出现在了rmtab中而没有出现在xtab中,




客户端卸载挂载的NFS目录用umount
[root@mysqlndb02 ~]# umount /mnt/nfs
[root@mysqlndb02 ~]# df
文件系统               1K-块        已用     可用 已用% 挂载点
/dev/sda3             11095576   6378364   4144496  61% /
/dev/sda1               101086     11373     84494  12% /boot
tmpfs                   127720         0    127720   0% /dev/shm

分别在192.168.0.28、192.168.0.31上面建立文件,而28上面是可以的,31上面却不能,这和当初在/etc/exports文件中设置的权限有关;
[root@mgmserver nfs]# mkdir file

[root@mgmserver nfs]# ll -d file/
drwxr-xr-x 2 nfsnobody nfsnobody 4096 08-09 17:02 file

可以看到,当在共享文件夹目录里面创建了一个文件,他的拥有人和拥有组都是nfsnobody,在默认情况下面,拥有人和拥有组应该是root。这个是因为在系统默认的共享权限里面设置了anonuid=65534,anongid=65534。而这个65534id号其实就是nfsnobody用户。可以用id  nfsnobody 命令来查询一下
[root@mgmserver nfs]# id nfsnobody
uid=65534(nfsnobody) gid=65534(nfsnobody) groups=65534(nfsnobody)

关于刚才文件属于nfsnobody的原因,这个是由于系统默认的NFS共享权限中root_squash 导致的,root_squash:当登陆NFS主机使用共享目录的使用者是root时,其权限被转换成匿名使用者,通常它的UIDGID都会变成nobody身份。

其实NFS有很多默认的权限
[root@dns nfs]# exportfs -v
/home/cdsrc     192.168.0.28(rw,wdelay,root_squash,no_subtree_check,anonuid=65534,anongid=65534)
/home/cdsrc     192.168.0.31(ro,wdelay,root_squash,no_subtree_check,anonuid=65534,anongid=65534)


根据自己的兴趣去改相关的权限;

最后,如果关机时,NFS服务器中还有客户机联机,建议在关机之前先关闭portmap与nfsd系统服务,如果无法正确关闭,那么应先执行命令netstat -utlp 找出PID,然后kill掉该进程,这样才能正确关机