1 . NFS 的由来 : NFS(Network File System) 是一种分布式文件系统,允许网络中的安装不同操作系统 (Linux Unix ) 的计算机间共享文件和外设,所以它的通讯协定设计与主机及操作系统无关 . 它是由 SUN 公司于 1984 年推出,使得可以本地机一样的使用另一台联网计算机的文件和外设。 NFS 在文件传送或信息传送过程中依赖于 RPC 协议 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

功能: 当我们的 NFS Server 设定好共享目录后,其他的 NFS Client 端就可以将这个目录挂载到自己系统上面的某个挂载点 ( 挂载点可以自定义 ) ,进入这个挂载点即可查看共享的文件。

缺陷:   a. 明文传输

         b. 只能用于 Linux Unix 间操作系统中

           c. 新版的 NFS 服务是置于系统内核中的。

2 . RPC RPC, 远程过程调用 (remote procedure call) 是能使客户端执行其他系统中程序的一种机制。由于使用 RPC 的程序不必了解支持通信的网络协议的情况,因此 RPC 提高了程序的互操作性。常用于分布式 C/S 模型,发出请求的程序是客户程序,而提供服务的程序是服务器。

功能: NFS 支持的功能相当的多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些 端口 来传输文件,因此, NFS 的功能所对应的端口不固定,而是采用随机取用一些未被使用的小于 1024 的端口来使用,但客户端又不知道服务器端的相关端口,所以需要远程过程调用 (RPC) 的服务, RPC 最主要的功能就是在指定每个 NFS 功能所对应的 port number ,并且返回给客户端,让客户端可以连结到正确的端口上去。 当服务器在启动 NFS 时会随机取用数个端口,并主动的向 RPC 注册,因此 RPC 可以知道每个端口对应的 NFS 功能,然后 RPC 又是固定使用 port 111 来监听客户端的需求并返回客户端正确的端口。

可以指定的静态端口: MOUNT_PORT=”4002”

                    STATD_PORT=”4003”

                    LOCKD_TCPPORT=”4004”

                    LOCKD_UDPPORT=”4004”

                    ROUOTAD_PORT=”4005”

                    STATD_OUTGOING_PORT=”4006”

3. NFS nfs-utils-<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />1.0.6-65.EL4

  脚本 nfs nfslock

  端口 2049 Tcp/Udp nfsd 其他半随机 111Tcp/Udp, 及其他的小于 1024 的随机端口。

配置文件 :/ etc/exports, /etc/sysconfig/nfs

进程: rpc.mounted  ß -------mount

       lockd ß --------NLM

       rpc.statd ß ------NLM

NFS 主程序: nfs-utils
RPC
主程序: portmap

/var/lib/nfs/*tab
  在 NFS 服务器的登录档都放置到 /var/lib/nfs/ 目录里面,在该目录下有两个比较重要的登录档,一个是 etab ,主要记录了 NFS 所分享出来的目录的完整权限设定值;另一个 xtab 则记录曾经连结到此 NFS 主机的相关客户端资料。

  /var/lib/nfs/rmtab
 状态文件,列出了挂接导出文件的远程客户机清单。
  

4 . 服务器端得应用及其规则

A 安装 nfs 软件包 yum list all|grep nfs

yum install nfs-utils.i386

B .启动 RPC 服务: service portmap start portmap 不需要设定,只要直接启动就行,启动之后,会出现一个 port 111 sunrpc 的服务

  查看 RPC 服务的状态 service portmap status

rpcinfo -p localhost (查看当前主机的 RPC 状态)

启动 nfs 服务 service nfs restart (开启 nfs 服务)

chkconfig nfs on (将其加入开机自启行列)

C 编辑 nfs 的配置文件 vi /etc/exports( 默认为空 )

假设为下面所示:

/var/guest 192.168.1.0/24(rw,async)

/var/ftp 192.168.0.0/24(rw,no_root_squash,sync)

保存退出!

注意 下面是一些 NFS 共享的常用参数
  
 
ro: read-only
,只读访问权限

rw: read-write
,可读写的权限

sync:
资料同步写入到内存与硬盘

async:
资料会先暂存于内存中,而非直接写入硬盘(异步)

secure: NFS
通过 1024 以下的安全 TCP/IP 端口发送

insecure: NFS
通过 1024 以上的端口发送

wdelay:
如果多个客户要写入 NFS 目录,则归组写入(默认)

no_wdelay:
如果多个客户要写入 NFS 目录,则立即写入,当使用 async 时,无需此设置。

hide:
NFS 共享目录中不共享其子目录

no_hide:
共享 NFS 目录的子目录

subtree_check:
如果共享 /usr/bin 之类的子目录时,强制 NFS 检查父目录的权限(默认)

no_subtree_check:
和上面相对,不检查父目录权限

no_all_squash:
保留共享文件的 UID GID (默认)
   
all_squash
  不论登入 NFS 的使用者身份为何, 他的 UID GID 映射匿名客户 anonymous( 通常也就是 nobody(nfsnobody)) ,适合公用目录。
      
root_squash 
  在登入 NFS 主机使用共享之目录的使用者如果是 root 时,那么这个使用者的权限将被映射成为匿名使用者,通常他的 UID GID 都会变成 nobody(nfsnobody) 那个系统帐号的身份的权限; uid gid 0 变为 65534.
      
no_root_squash         
  登入 NFS 主机使用共享目录的使用者,如果是 root 的话,那么对于这个共享的目录来说,他就具有 root 的权限!这个项目『极不安全』,不建议使用!
      
anonuid=xxx:
指定 NFS 服务器 /etc/passwd 文件中匿名客户的 UID
      
anongid=xxx:
指定 NFS 服务器 /etc/passwd 文件中匿名客户的 GID

D .此时我们不需重启服务,可以使用命令将其重新读取:

exportfs –a 

注意 -a :全部挂载 ( 或卸载和 -u 连用时 )/etc/exports 文件内的设置
-r
重新挂载 /etc/exports 里面的设置,此外,亦同步更新 /etc/exports /var/lib/nfs/xtab 的内容!
-u
:卸载某一目录
-v
:在 export 的时候,将分享的目录显示到屏幕上

exportfs -arv 重新挂载一次 /etc/exports 的设置

  exportfs –auv 全部卸载

E 此时我们可以自己先检查一下 NFS 服务器是否可以连接

 showmount –e localhost

   showmount -a localhost

注意: showmount [-ae] [hostname|IP]

-p :显示出所有的 port porgram 的信息;

参数:
-a
:这个参数是一般在 NFS 服务器上使用,是用来显示已经挂载上本机 nfs 目录的客户机

- d :查看哪个目录已被挂载到 NFS 服务器上。(一般也在 NFS 服务器上使用)
-e
:显示主机的 /etc/exports 所共享的目录

     

5. 客户端的配置及规则:

A 当客户端访问服务器时我们需要首先建立挂载点

 Eg mkdir  mnt

B .挂载共享目录

mount -t  nfs 192.168.1.0:/var/ftp mnt/

C. 此时我们可以切换到挂载目录中查看共享目录

showmount –e IP (服务器的 ip 地址)

cd mnt

ls

如果是 root 用户,即可查看里面的文件,但是只读权限(规定为可读可写,为何为只读呢 ?

Reason: 因为 root_squash 参数,没有规定时,都将 root 用户映射为匿名用户,将其 uid gid 0 变为 65534 ,权限缩减。除非声明声明 no_root_squash root 用户登录时才可以保持共享目录中规定的权限。修改如下:

/ var/guest  192.168.1.0/24(rw, no_root_squash async)

6. 案例:

1.     假如说服务器上有个用户 natasha ,并且他是 /var/guest 目录的所有者,即将目录的用户和组都改为 natasha ,假如 natasha uid 2001 ,在客户机上有个 natasha mary 两个用户,但 natasha uid 2000 mary uid 2001 ,此时 natasha 将无法登录,而 mary 却可以查看(原因很简单, NFS 是靠 uid gid 来识别用户的身份的。)

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

    # vi /etc/exports
/home/public  192.168.0.0/24(rw)    *(ro)

即将主机与网域分为两段 ( 用空格隔开 ) 此时当客户机处于 192.168.0.0/24 这个网段中时,针对这个被挂在的目录就具有可读可写的权限;而其他网段的客户机挂载目录后就只有可读权限。

3.     开放匿名登入的情况    

# vi /etc/exports

/home/linux  *.linux.org(rw,all_squash,anonuid=40,anongid=40)
#
如果要开放匿名,那么重点是 all_squash ,并且要配合 anonuid

 

test.linux.org 登入这部 NFS 主机,并且在 /home/linux 写入文件时,该文件的所有人与所有群组,就会变成 /etc/passwd 里面对应的 UID 40 的那个身份的使用者

 

总结 /etc/exports client 的书写规则

   (1) 单个主机
  可以用短名及完全限定名( QFDN ),或者用 IP 地址,例如 student1 student1.test.com.cn 或者 192.168.10.1

 

   (2)Net-Group
  可以列出 /etc/netgroup 文件中或 NFS 网组映射中定义的整组主机。网组名以 @ 开头。

   (3) 通配符主机( * ,?)
   .discuz.net *.  *.comsenz.com

* 匹配零个或多个

:只匹配一个
   (4) 掩码
   192.168.1.0/255.255.255.0