相关概念:

一、什么是NFS(Network File System)即网络文件系统。NFS  使用内核功能,所以内核需要支持NFS。

主要功能:通过网络,让不同的机器、不同的OS 可以共享彼此的文件。

协议详解请参考百度百科链接:http://baike.baidu.com/view/44349.htm

二、什么是RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。

协议详解请参考百度百科链接:http://baike.baidu.com/view/7287257.htm?fromId=32726&redirected=seachword

主要功能:指定每个NFS对应的 port number,并通知客户端,让客户端可以连接到正确的端口上。

因为NFS服务必须使用RFC服务,所以称之为RPC Server的一种,另外NIS也属于RPC Server。

Server/client都要开启RFC 服务。启动NFS之前,RPC要先启动,否则NFS会无法向RPC注册。

客户端有NFS文件访问需求时,向服务器的请求数据的流程:

1、客户端向服务器端的RPC(Port 111) 发出NFS文件访问功能。

2、服务器端找到对应的已注册的 NFS daemon 端口后,会通知客户端。

3、客户端找到正确端口后,可以直接与NFS daemon。

三、NFS Server 端的配置

1、所需要软件

RPC主程序: rpcbind

NFS主程序: nfs-utils

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

2、NFS的软件结构

主配置文件:/etc/exports

NFS文件系统维护命令:/usr/sbin/exportfs   共享 /etc/exports 更新的目录资源、将NFS 共享的目录卸载以及重新共享。

共享资源的日志文件:/var/lib/nfs/*tab     etab:记录NFS共享目录的完整权限设置值;另一个xtab,记录到连接到此NFS服务器的客户端信息。

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

3、/etc/exports配置文件

[root@centos ~]# vi /etc/exports
    /tmp         192.168.11.0/24(ro)   *(rw) 
*.ev.ncku.edu.tw(ro,sync)


   [分享目录]       [第一部主机(权限)]             [可用主机名]         [可用通配符]

每一行最前面是要分享出来的目录。是以目录为单位啊! 然后这个目录可以依照不同的权限分享给不同的主机,像鸟哥上面的 例子说明是: 要将 /tmp 分别分享给三个不同的主机或网域的意思。记得主机后面以小括号 () 设计权限参数, 若权限参数不止一个时,则以逗号 (,) 分开。且主机名与小括号是连在一起的!在这个档案内也可以利用 # 来批注呢。

至于主机名的设定主要有几个方式:

1、可以使用完整的 IP 或者是网域,例如 192.168.100.10 或192.168.100.0/24 ,或 192.168.100.0/255.255.255.0 都可以接受! 不可以使用 192.168.100.* 。

2、也可以使用主机名,但这个主机名必须要在 /etc/hosts 内,或可使用 DNS找到该名称才行!反正重点是可找到 IP 就是了。如果是主机名的话,那么可以支持通配符,例如 * 或 ? 均可接受。

Exports文件中的权限参数

选项                     说明

Ro                        该主机对该共享目录有只读权限
Rw                       该主机对该共享目录有读写权限
Root_squash          客户机用root用户访问该共享文件夹时,将root用户映射成匿名用户
No_root_squash     客户机用root访问该共享文件夹时,不映射root用户
All_squash             客户机上的任何用户访问该共享目录时都映射成匿名用户
Anonuid                将客户机上的用户映射成指定的本地用户ID的用户
Anongid                将客户机上的用户映射成属于指定的本地用户组ID
Sync                     资料同步写入到内存与硬盘中
Async                   资料会先暂存于内存中,而非直接写入硬盘
Insecure                允许从这台机器过来的非授权访问

例题一:

让 root 保留 root权限

答:[root@centos ~]# vi /etc/exports

/tmp        *(rw,no_root_squash)   任何人都可以使用  /tmp,主机名可以使用通配符处理,重点是no_root_squash。

例题二:同一目录针对不同范围开放不同权限 
我要将一个公共的目录 /home/public 公开出去,但是只有限定我的局域网络192.168.11.0/24 这个网域且加入 vbirdgroup 的用户才能够读写,其他来源则只能读取。 
答:

[root@centos ~]# mkdir /home/public
 [root@centos ~]# groupadd vbirdgroup 
 
[root@centos ~]# setfacl -m g:vbirdgroup:rwx /home/public  
 
[root@centos ~]# vim /etc/exports  
 
  /tmp           *(rw,no_root_squash)  
 
  /home/public  192.168.11.0/24(rw)     *(ro)



# 继续累加在后面,注意,我有将主机与网域分为两段 (用空白隔开) ! 


例题三:仅给某个单一主机使用的目录设定 
我要将一个私人的目录 /home/test 开放给 192.168.100.10 这个 Client 端的机器来使用时,该如何设定?假设使用者的身份是 dmtsai 才具有完整的权限时。
    答:

[root@centos ~]# mkdir /home/test  
[root@centos~]# setfacl -m u:dmtsai:rwx /home/test  
[root@centos ~]# vim /etc/exports /tmp           *(rw,no_root_squash) 
/home/public  192.168.11.0/24(rw)     *(ro) 
/home/test     192.168.11.173(rw)  
# 只要设定 IP 正确即可!

这样就设定完成了!而且,只有 192.168.11.173这部机器才能对 /home/test 这个目录进行存取喔!

例题四:开放匿名登录的情况 
我要让 *.centos.vbird 网域的主机,登入我的 NFS 主机时,可以存取 /home/linux ,但是他们存数据的时候,我希望他们的 UID 与 GID 都变成 45 这个身份的使用者,假设我 NFS 服务器上的 UID 45 与 GID 45 的用户/组名为 nfsanon。 
答:

[root@centos~]# groupadd -g 45 nfsanon 
[root@centos ~]# useradd -u 45 -g nfsanon nfsanon
[root@centos ~]# mkdir /home/linux 
[root@centos ~]# setfacl -m u:nfsanon:rwx /home/linux 
[root@centos ~]# vim /etc/exports  
/tmp           *(rw,no_root_squash) /home/public  192.168.11.0/24(rw)     *(ro) 
/home/test     192.168.11.173(rw) 
/home/linux   *.centos.vbird(rw,all_squash,anonuid=45,anongid=45)

     # 如果要开放匿名,那么重点是 all_squash,并且要配合 anonuid 喔!

特别注意到那个 all_squash 与 anonuid, anongid 的功能!如此一来,当clientlinux.centos.vbird 登入这部 NFS 主机,并且在 /home/linux 写入档案时,该档案的所有人与所有群组,就会变成 /etc/passwd 里面对应的 UID 为 45 的那个身份的使用者了!

3、启动NFS

/etc/init.d/rpcbind start 
/etc/init.d/nfs start
/etc/init.d/nfslock start

查看NFS 开启的端口

[root@centos ~]# netstat -tunlp | grep -E "(rpc|nfs)"
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      1345/rpcbind        
tcp        0      0 0.0.0.0:54000               0.0.0.0:*                   LISTEN      3034/rpc.mountd     
tcp        0      0 0.0.0.0:60724               0.0.0.0:*                   LISTEN      1425/rpc.statd      
tcp        0      0 0.0.0.0:58105               0.0.0.0:*                   LISTEN      3034/rpc.mountd     
tcp        0      0 0.0.0.0:49257               0.0.0.0:*                   LISTEN      3034/rpc.mountd     
tcp        0      0 :::111                      :::*                        LISTEN      1345/rpcbind        
tcp        0      0 :::57367                    :::*                        LISTEN      1425/rpc.statd      
tcp        0      0 :::59611                    :::*                        LISTEN      3034/rpc.mountd     
tcp        0      0 :::44958                    :::*                        LISTEN      3034/rpc.mountd     
tcp        0      0 :::55489                    :::*                        LISTEN      3034/rpc.mountd     
udp        0      0 0.0.0.0:111                 0.0.0.0:*                               1345/rpcbind        
udp        0      0 0.0.0.0:753                 0.0.0.0:*                               1425/rpc.statd      
udp        0      0 0.0.0.0:49675               0.0.0.0:*                               3034/rpc.mountd     
udp        0      0 0.0.0.0:39183               0.0.0.0:*                               3034/rpc.mountd     
udp        0      0 0.0.0.0:672                 0.0.0.0:*                               1345/rpcbind        
udp        0      0 0.0.0.0:60470               0.0.0.0:*                               1425/rpc.statd      
udp        0      0 0.0.0.0:36158               0.0.0.0:*                               3034/rpc.mountd     
udp        0      0 :::49007                    :::*                                    1425/rpc.statd      
udp        0      0 :::111                      :::*                                    1345/rpcbind        
udp        0      0 :::672                      :::*                                    1345/rpcbind        
udp        0      0 :::34479                    :::*                                    3034/rpc.mountd     
udp        0      0 :::39476                    :::*                                    3034/rpc.mountd     
udp        0      0 :::40297                    :::*                                    3034/rpc.mountd

主要的端口是:

rpcbind 启动的 port 在 111 ,同时启动在 UDP 与 TCP;
nfs 本身的服务启动在 port 2049 上头!

其他 rpc.* 服务启动的 port 则是随机产生的,因此需向 port 111 注册。

启动nfs后又修改了/etc/exports,不用重启该服务,使用exports命令即可:

Exports [-aruv]

-a    全部mount或umount文件/etc/exports中的内容

-r     重新mount文件/etc/exports中的共享内容

-u   umount目录

-v    在export的时候,将详细的信息输出到屏幕上

例:

[root@localhost ~]#  exportfs –rv        全部重新export一次 
[root@localhost ~]#  exportfs –au        全部卸载

四、NFS 客户端的设置

1、客户端先rpcbind服务。

[root@jone ~]# /etc/init.d/rpcbind start 
Starting rpcbind:                                          [  OK  ]

2、扫描NFS服务器目录有那些,以及是否可用。

showmount –e  192.168.90.254 (服务器端IP)

3、客户端建立挂载点目录。

[root@jone ~]# mkdir -p /home/nfs/public/

4、使用mount 将服务器直接挂载到相关目录。

mount -t nfs 192.168.90.254 :/home/public /home/nfs/public

5、查看是否挂载成功。

[root@jone ~]# df -h 
Filesystem            Size  Used Avail Use% Mounted on 
/dev/mapper/VolGroup-lv_root 
                      8.5G  1.7G  6.4G  21% / 
tmpfs                 246M     0  246M   0% /dev/shm 
/dev/sda1             485M   32M  429M   7% /boot 
192.168.90.254:/home/public 
                       28G  790M   26G   3% /home/nfs/public

6、使用完毕之后可以使用umount卸载

umount /home/nfs/pulic

PS:

1、用户账号。客户端和服务器端的账号不一致导致文件系统使用上的混乱,NFS比较大弊端。

2、NFS 服务器开放写入权限(/etc/exports 设置有关)

3、文件权限具有可写入(W)的权限。

常与NIS搭配使用。

自动挂载服务:autofs

 

建立主配置文件  /etc/auto.master

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

没有测试成功,继续测试。

 

鸟哥总结的重点,最好记住。

Network FileSystem (NFS) 可以让主机之间透过网络分享彼此的档案与目录;
NFS 主要是透过 RPC 来进行 file share 的目的,所以 Server 与 Client的 RPC 一定要启动才行!
NFS 的配置文件就是 /etc/exports 这个档案; 
NFS 的权限可以观察 /var/lib/nfs/etab,至于的重要登录档可以参考 /var/lib/nfs/xtab 这个档案,还包含相当多有用的信息在其中!
NFS 服务器与客户端的使用者账号名称、UID 最好要一致,可以避免权限错乱:
NFS 服务器预设对客户端的 root 进行权限压缩,通常压缩其成为nfsnobody 或 nobody。 
NFS 服务器在更动 /etc/exports 这个档案之后,可以透过 exportfs 这个 指令来重新挂载分享的目录! 可以使用 rpcinfo 来观察 RPC program 之间的关系!!! 
NFS 服务器在设定之初,就必须要考虑到 client 端登入的权限问题,很多时候无法写入或者无法进行分享,主要是 Linux 实体档案的权限设定问题所致! 
NFS 客户端可以透过使用 showmount, mount 与 umount 来使用 NFS 主机提供的分享的目录!
NFS 亦可以使用挂载参数,如 bg, soft, rsize, wsize, nosuid, noexec, nodev 等参数, 来达到保护自己文件系统的目标!