NFS全称"网络文件系统",主要配置件/etc/exports和etc/sysconfig/nfs...NFS能使不同计算机之间能通过网络进行文件共享的一种网络协议,多用于UNIX/Linux网络系统中,使用NFS既可以提高资源的使用率,又可以大大节省客户端本地硬盘的空间,因为你根本不需要将所有文件复制到本地硬盘中,同时也便于对资源进行集中管理.

      虽然NFS可以在网络中进行文件共享,但是NFS协议本身并没有提供数据传输的功能,它必须借助于远程过程调用(RPC)协议来实现数据传输.RPC定义了一种进程间通过网络进行交互通信的机制,它允许客户端进程通过网络向远程服务器上的服务进程请求服务,而不需要了解底层通信协议细节.可以将NFS服务器看成是RPC服务器,而将NFS客户端看成RPC客户端,这样NFS服务器和NFS客户端之间就可以通过RPC协议协议进行数据传输...

     要使用NFS服务器,至少有三个守护进程在行,rpc.nfsd rpc.mount   portmap 还有一个守护进程lockd,用来锁定用户权限的..

 

rpc.nfsd  他是基本的NFS守护进程,主要功能是管理客户端是否能够登入服务器..
rpc.mount  他是RPC安装守护进程,主要功能是管理NFS的文件系统.当客户端顺利地通过了rpc.nsfd登入NFS服务器后,在使用NFS服务器所提供的文件前,还必须通过文件使用权限的验证.rpc.mountd会读取NFS的配置文件/etc/exports来对比客户端权限...portmap  主要功能是进行端口映射工作,当客户端尝试连接并使用RPC服务器提供服务(如NFS服务)时,portmap会将所管理的与服务对应的端口号提供给客户端,从而使客户端可以通过该端口向服务器请求服务...要主意的是portmap只用于RPC,但它对NFS服务来说是必不可少的.portmap没有运行,NFS客户端就无法查找从NFS服务器中共享的目录...这个一定要记住...

 

用户映射选项:

all_squash 将远程访问的所有用户及属主和属组都映射为匿名用户和用户组,一般均为nfsnobody....

no_all_squash 不将远程访问的所有用户及属组都映射为匿名用户...

root_squash  将root用户及所属组都映射为匿名用户(默认设置)

no_root_squash 不将root用户及属组映射为匿名用户.

anonuid=xxx 将远程访问的所有用户都映射为匿名用户,并制定该匿名用户账为本地用户(UID=xxx)

anongid=xxx  将远程访问的所有用户组都映射为匿名用户组账户,并制定该匿名组账户为本地用户组账户(GID=xxx)

 

常用其他选项.

secure 限制客户端只能从小于1024的TCP/IP端口连接NFS服务器(默认设置)

insecure 允许客户端从大于1024的TCP/IP端口连接NFS服务器.

sync  将数据同步写入内存缓冲区于磁盘中,虽然这样做效率很低,但可以保证数据的一致性...

async 将数据先保存在内存缓冲区,必要时才写入磁盘..

wdelay 检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可提高效率..(默认设置)..

no_wdelay 若有写操作,则立即执行,应与sync配合使用..

subtree_check 若输出目录时一个子目录,则NFS Server将检查其父目录的权限(默认设置)..

no_subtree_check 即使输出目录是一个子目录,NFS Server也不检查其父目录的权限,这样做客提高效率...

 

下面我们来配置NFS服务,我的SERVER IP:92.168.0.195..CLIENT IP:192.168.0.197先的安装一个名为nfs-utils和另一个为portmap两个包,默认情况下Redhat安装了这两

个包...使用下面命令查看是否安装了这两个包....

#rpm -qa |grep nfs-utils

#rpm -qa |grep portmap

我这已经安装了,就不再演示怎么去装了,然后我们创建四个目录....
#mkdir  -p  /var/{test,pub,wendy,natasha}

#cd /var/test;touch a.txt b.txt;ls  -l

-rw-r--r-- 1 root root 0 Mar  4 22:15 a.txt
-rw-r--r-- 1 root root 0 Mar  3 22:15 b.txt
#vim   /etc/exports

/var/test       192.168.0.197(rw,async)
/var/pub        *(ro)
/var/wendy      192.168.1.0/24(ro,no_root_squash)
/var/natasha    *.zzu.com(rw,all_squash,sync,no_wdelay)

 

解说:/var/test目录可供192.168.0.197访问,数据异步写入磁盘...

/var/pub目录任何网段的客户机都可以访问,且具有只读的权限.

/var/wendy目录只允许192.168.1.0网段机器访问,且具只读权限.并且不将root用户映射到匿名用户..

/var/nastasha目录允许.*zzu.com中的所有客户机访问,且具备读写权限,并且将所有用户及所属的组都映射为nfsnobody,数据同步写入磁盘,如果有写入操作,立即执行...
然后重启服务...

#service nfs restart

#service portmap restart

查看服务的状态...

#service nfs  status

nfsd (pid 5126 5125 5124 5123 5122 5121 5120 5119) is running...
rpc.rquotad (pid 5114) is running...

 

#service  portmap status

portmap (pid 3211) is running...

其实每次修改了配置文件我们可以不重启动服务,让其重新读取一下配置文件使用下面的命令...

#exportfs  -r (重新读取所有文件系统,相当于重启服务)
#exportfs  -u (关闭所有已挂载的文件系统)

#exportfs  -v (重启服务后用此命令可查看配置文件中的信息)

#exportfs  -au(关闭所有的要被挂载的文件系统)

查看监听的端口,及其进程..

#rpcninfo -p  localhost;netstat -tunlp |grep 2049

      program vers proto   port
    100000    2   tcp    111  portmapper
    100000    2   udp    111  portmapper
    100024    1   udp    883  status
    100024    1   tcp    886  status
    100011    1   udp    823  rquotad
    100011    2   udp    823  rquotad
    100011    1   tcp    826  rquotad
    100011    2   tcp    826  rquotad
    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100021    1   udp  34831  nlockmgr
    100021    3   udp  34831  nlockmgr
    100021    4   udp  34831  nlockmgr
    100003    2   tcp   2049  nfs
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100021    1   tcp  40888  nlockmgr
    100021    3   tcp  40888  nlockmgr
    100021    4   tcp  40888  nlockmgr
    100005    1   udp    837  mountd
    100005    1   tcp    840  mountd
    100005    2   udp    837  mountd
    100005    2   tcp    840  mountd
    100005    3   udp    837  mountd
    100005    3   tcp    840  mountd
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:*                               -

查看本机都有哪些共享目录..使用

#showmount -e localhost

 

下面我们进入客户端先创建一个目录,执行此命令进行挂载..

#mkdir  /mnt/a

#mount  -t  nfs 192.168.0.195:/var/test/  /mnt/a

#cd /mnt/a;ls  -l

-rw-r--r-- 1 root root 0 Mar  3 22:15 a.txt

-rw-r--r-- 1 rootroot 0 Mar  3 22:15 b.txt

 

我们不能将其这两个小文件删除,因为我们没有给192.168.0.197的no_root_squash,如果给它这个权限,他是可以删掉的,这些我都测试过,默认情况下都是root_squash,服务器会将其转换成来宾的账号...

在服务器端执行下面的命令,查看本机有哪些文件被挂载了...

[root@station18 ~]# showmount -a localhost
All mount points on localhost:
192.168.0.197:/var/test

 

     来做个小测试,在服务器上创建一个randy的用户UID为1000,密码为redhat,在客户机上创建一个用户solaris,UID为 1000,密码redhat

服务器:

#useradd -u 1000 randy

#passwd randy

客户机:

#useradd -u 1000 solaris

#passwd solaris

   修改服务器上/var/test/上a.txt和b.txt属主和属组都为randy还要修改test目录的所属组和属主位randy

#cd  /var/test

#chown  -R  randy.randy   ../test/;ls -l;ls -ld ../test

-rw-r--r-- 1 randy randy 0 Mar  4 07:51 a.txt
-rw-r--r-- 1 randy randy 0 Mar  3 22:15 b.txt

drwxr-xr-x 2 randy randy 4096 Mar  3 23:00 ../test/

 

    在去客户机从新挂载次文件,再切换到solaris用户然后删除看一下是否具备删权限,发现可以删除的...有的人会发现在服务器上两文件属主属组都randy,且配置文件中没no_root_squash权限,在客户机上此文件属主和属组solaris,但是客户机可以将其删除,不可思议吧!那是因为两用户的UID一样,NFS靠UID来识别用户,只要双方UID一样,对方就能将文件进行修改.这点大可以看出NFS很不安全的,但是很好用,很多场合也得用到它

 


转载于:https://blog.51cto.com/zhangcz/1343891