zoukankan      html  css  js  c++  java
  • NFS服务的配置与应用

    一、NFS服务概述

    NFS(Network File System),即网络文件系统,是使不同计算机之间能够通过网络进行文件共享的一种网络协议,多用于Linux/Unix网络系统中。

    一台NFS服务器就如同一台文件服务器,只要将其文件系统共享出来,NFS客户端就可以将它挂载到本地系统中,从而可以像使用本地文件系统中的文件一样使用那些远程文件系统中的文件。

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

    使用NFS服务,至少需要启动以下3个系统守护进程:

    (1)rpc.nfsd:它是基本的NFS守护进程,主要功能是管理客户端是否能够登入服务器。

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

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

    值得注意的是,虽然portmap只用于RPC,但它对于NFS服务来说是必不可少的。portmap没有运行,NFS客户端就无法查找从NFS服务器中共享的目录

    二、NFS服务的安装

    目前几乎所有的Linux发行版都默认安装了NFS服务,Red Hat也不例外。只要安装默认配置安装完Red Hat Enterprise Linux,NFS服务就会被安装在系统上。由于启动NFS服务时需要nfs-utils和portmap这两个软件包,因此在配置使用NFS之前,可使用下面的命令来检查系统中是否已经安装了这两个包:

    [root@localhost ~]# rpm -q nfs-utils portmap
    nfs-utils-1.0.9-24.el5
    portmap-4.0-65.2.2.1

    可见,系统中已经安装了NFS服务和portmap服务。

    技巧:要检查NFS服务是否正常运行,可以使用rpcinfo -p命令。如果NFS服务运行正常,就可在该命令执行结果中看到关于portmapper等守护进程的条目。

    三、NFS服务的配置

    NFS服务的配置方法相对比较简单,只需在NFS的配置文件/etc/exports中进行设置,然后启动NFS服务即可。

    1、exports文件的格式

    在exports文件中,可以定义NFS系统的输出目录(即共享目录)、访问权限和允许访问的主机等参数。该文件默认为空。

    exports文件中的每一行提供了一个共享目录的设置,其格式为:

    <输出目录> [客户端1(选项1,选项2,...)] [客户端2(选项1,选项2,...)]

    其中,输出目录是必选参数,其他参数都是可选的。

    值得注意的是,格式中的输出目录和客户端之间、客户端与客户端之间都使用空格分隔,但是客户端和选项之间不能有空格(客户端紧跟着左括号,左括号紧跟着选项),选项与选项之间也不能有空格(前一个选项紧跟着逗号,逗号紧跟着下一个选项)。

    (1)输出目录是指NFS系统中需要共享给客户端使用的目录。

    (2)客户端是指网络中可以访问这个NFS输出目录的计算机。客户端的指定非常灵活,可以是单个主机的IP地址或域名,也可以是某个子网或域中的主机等。

    客户端常见的指定方式如下:

    192.168.16.20:指定IP地址的主机。

    192.168.16.0/24(或192.168.16.*):指定子网中所有的主机。

    pcl.gdvcp.net:指定域名的主机。

    *.gdvcp.net:指定域中的所有主机。

    *(或缺省):所有主机。

    (3)选项用来设置输出目录的访问权限、用户映射等。exports文件中的选项一般可以分为以下3类:

           1)访问权限选项:

               ro:设置输出目录为只读                  

               rw:设置输出目录为可读写

           2)用户映射选项:

               在默认情况下,当客户端访问NFS服务器时,若远程访问的用户是root用户,则NFS服务器会将它映射成一个本地的匿名用户(该用户账户为nfsnobody),

          并将它所属的用户组也映射成匿名用户组(该用户组账户也为nfsnobody),这样有助于提高系统的安全性。用户映射选项可以对此进行调整:

              all_squash:将远程访问的所有普通用户及所属用户组都映射为匿名用户或用户组(一般均为nfsnobody)。

              no_all_squash:不将远程访问的所有普通用户及所属用户组都映射为匿名用户或用户组(默认设置)。

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

              no_root_squash:不将root用户及所属用户组都映射为匿名用户或用户组。

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

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

          3)其他选项:

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

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

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

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

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

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

             subtree_check:所输出目录是一个子目录,则NFS服务器将检查其父目录的权限(默认设置)。

            no_subtree_check:即使输出目录是一个子目录,NFS服务器也不检查其父目录的权限,这样做可以提高效率。

    2、NFS服务配置实例

    下面首先给出NFS主配置文件/etc/exports的一个应用实例,然后对有关设置进行说明。

    [root@localhost ~]# cat /etc/exports 
    /nfs/public     192.168.16.0/24(rw,async) *(ro)
    /nfs/liu        192.168.16.20(rw,sync)
    /nfs/root       *.gdvcp.net(ro,no_root_squash)
    /nfs/users      *.gdvcp.net(rw,insecure,all_squash,sync,no_wdelay)
    /mnt/cdrom      192.168.16.*(ro)

    (1)/nfs/public   192.168.16.0/24(rw,async)   *(ro)

    输出目录/nfs/public可供子网192.168.16.0/24中所有客户机进行读写操作,而其他网络中的客户机只能读取该目录中的内容。

    值得注意的是:当某用户使用子网192.168.16.0/24中的客户机访问该共享目录时,能否真正地写入,还要看该目录对该用户有没有开放Linux文件系统权限的写入权限。

    如果该用户是普通用户,那么只有该目录对该用户开放了写入权限,该用户才可以在该共享目录下创建子目录及文件,且新建的子目录及文件的所有者就是该用户。

    如果该用户是root用户,由于默认选项中有root_squash,root用户会被映射为nfsnobody,因此只有该共享目录对nfsnobody开放了写入权限,该用户才能在共享目录中创建子目录及文件,且所有者将变成nfsnobody。

    (2)/nfs/liu   192.168.16.20(rw,sync)

    输出目录/nfs/liu只供IP地址为192.168.16.20的客户机进行读写操作。

    (3)/nfs/root   *.gdvcp.net(ro,no_root_squash)

    对于输出目录/nfs/root,gdvcp.net域中的所有客户机都具有只读权限,并且不将root用户映射到匿名用户。

    (4)/nfs/users   *.gdvcp.net(rw,insecure,all_squash,sync,no_wdelay)

    对于输出目录/nfs/users来说,gdvcp.net域中的所有客户机都具有可读可写的权限,并且将所有用户及所属地用户组都映射为nfsnobody,数据同步写入磁盘。如果有写入操作则立即执行。

    (5) /mnt/cdrom   192.168.16.*(ro)

    对于输出目录/mnt/cdrom来说,子网192.168.16.0/24中的所有客户机都具有只读的权限。

    3、维护NFS服务的输出目录列表

    每当修改了/etc/exports文件的内容后,实际上不需要重新启动NFS服务,而直接使用命令exportfs就可以是设置立即生效。

    exportfs命令就是用来维护NFS服务的输出目录列表的,命令的基本格式如下:

    exportfs [选项]

    其选项有以下几个:

    a:输出在/etc/exports文件中设置的所有目录。

    r:重新读取/etc/exports文件中的设置,并使设置立即生效,而不需要重新启动NFS服务。

    u:停止输出某一目录。

    v:在输出目录时将目录显示到屏幕上。

    (1)重新输出共享目录

    每当修改了/etc/exports文件的内容后,可使用下面的命令来重新输出共享目录:

    [root@localhost ~]# exportfs -rv
    exporting 192.168.16.0/24:/nfs/public
    exporting 192.168.16.20:/nfs/liu
    exporting *.gdvcp.net:/nfs/users
    exporting 192.168.16.*:/mnt/cdrom
    exporting *.gdvcp.net:/nfs/root
    exporting *:/nfs/public

    (2)停止输出所有共享目录

    要停止输出当前主机中NFS服务器的所有共享目录,可使用下面的命令:

    [root@localhost ~]# exportfs -auv

    四、启动和停止NFS服务

    1、启动NFS服务

    为了是NFS服务器能正常工作,需要启动portmap和nfs这两个服务,并且portmap一定要先于nfs启动,具体命令如下:

    [root@localhost ~]# /etc/rc.d/init.d/portmap start
    Starting portmap:                                          [  OK  ]
    [root@localhost ~]# /etc/rc.d/init.d/nfs start
    Starting NFS services:                                     [  OK  ]
    Starting NFS quotas:                                       [  OK  ]
    Starting NFS daemon:                                       [  OK  ]
    Starting NFS mountd:                                       [  OK  ]

    2、停止NFS服务

    在停止NFS服务时,需要先停止NFS服务再停止portmap服务。如果系统中还有其他服务需要使用portmap服务时,则可不用停止portmap服务。具体命令如下:

    [root@localhost ~]# /etc/rc.d/init.d/nfs stop
    Shutting down NFS mountd:                                  [  OK  ]
    Shutting down NFS daemon:                                  [  OK  ]
    Shutting down NFS quotas:                                  [  OK  ]
    Shutting down NFS services:                                [  OK  ]
    [root@localhost ~]# /etc/rc.d/init.d/portmap stop
    Stopping portmap:                                          [  OK  ]

    3、重新启动NFS服务(保证portmap服务已开启):

    [root@localhost ~]# /etc/rc.d/init.d/nfs restart
    Shutting down NFS mountd:                                  [  OK  ]
    Shutting down NFS daemon:                                  [  OK  ]
    Shutting down NFS quotas:                                  [  OK  ]
    Shutting down NFS services:                                [  OK  ]
    Starting NFS services:                                     [  OK  ]
    Starting NFS quotas:                                       [  OK  ]
    Starting NFS daemon:                                       [  OK  ]
    Starting NFS mountd:                                       [  OK  ]

    4、检查portmap和nfs服务的状态:

    [root@localhost ~]# /etc/rc.d/init.d/portmap status
    portmap (pid 10792) is running...
    [root@localhost ~]# /etc/rc.d/init.d/nfs status
    rpc.mountd (pid 10951) is running...
    nfsd (pid 10948 10947 10946 10945 10944 10943 10942 10941) is running...
    rpc.rquotad (pid 10937) is running...

    5、设置自动启动NFS服务

    对于实际应用中的Linux系统,每次开机后都手工启动nfs服务是不现实的,应该设置系统在指定的运行级别(通常为3和5)自动启动portmap和nfs服务。

    [root@localhost ~]# chkconfig --level 35 portmap on
    [root@localhost ~]# chkconfig --level 35 nfs on

    当然,也可以执行ntsysv命令启动服务配置程序进行配置。

    五、测试NFS服务

    1、检查输出目录所使用的选项:

    在配置文件/etc/exports中,即使在命令行中只设置了一两个选项,但在真正输出目录时,实际上还带有很多默认的选项。通过查看/var/lib/nfs/etab文件,就可以了解到真正输出目录时到底使用了什么选项:

    [root@localhost ~]# cat /var/lib/nfs/etab
    /nfs/public     192.168.16.0/24(rw,async,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,mapping=identity,anonuid=65534,anongid=65534)
    /nfs/liu        192.168.16.20(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,mapping=identity,anonuid=65534,anongid=65534)
    /nfs/users      *.gdvcp.net(rw,sync,no_wdelay,hide,nocrossmnt,insecure,root_squash,all_squash,no_subtree_check,secure_locks,acl,mapping=identity,anonuid=65534,anongid=65534)
    /mnt/cdrom      192.168.16.*(ro,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,mapping=identity,anonuid=65534,anongid=65534)
    /nfs/root       *.gdvcp.net(ro,sync,wdelay,hide,nocrossmnt,secure,no_root_squash,no_all_squash,no_subtree_check,secure_locks,acl,mapping=identity,anonuid=65534,anongid=65534)
    /nfs/public     *(ro,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,mapping=identity,anonuid=65534,anongid=65534)

    2、使用showmount命令测试NFS服务器的输出目录状态

    showmount命令的基本格式为:

    showmount [选项] NFS服务器名称或地址

    常用选项有:

    a:显示指定的NFS服务器的所有客户端主机及其所连接的目录。

    d:显示指定的NFS服务器中已被客户端连接的所有输出目录。

    e:显示指定的NFS服务器上所有输出的共享目录。

    (1)查看当前主机中NFS服务器上所有输出的共享目录

    使用不带NFS服务器名称或地址参数的showmount -e命令,可以查看当前主机中NFS服务器上所有输出的共享目录:

    [root@localhost ~]# showmount -e
    Export list for localhost.localdomain:
    /nfs/root   *.gdvcp.net
    /mnt/cdrom  192.168.16.*
    /nfs/users  *.gdvcp.net
    /nfs/liu    192.168.16.20
    /nfs/public (everyone)

    (2)显示当前主机中NFS服务器上被挂载的所有输出目录

    使用不带NFS服务器名称或地址参数的showmount -d命令,可以查看当前主机中NFS服务器上所有被挂载的输出目录:

    [root@localhost ~]# showmount -d
    Directories on localhost.localdomain:

    六、NFS客户端的使用

    在NFS服务器设置完成后,客户端可以先查看NFS服务器上有哪些共享目录,然后使用mount命令将可用的共享目录挂载到本机的文件系统中,甚至还可以实现开机自动挂载,以后用户就可以像使用本地文件系统中的目录一样使用NFS挂载目录了。

    1、查看NFS服务器信息

    在客户端,要查看NFS服务器上有哪些共享目录,可以使用showmount命令。

    例如:如果NFS服务器的IP地址为192.168.1.4,那么可使用下面的命令来查看:

    [root@localhost ~]# showmount -e 192.168.1.4
    Export list for 192.168.1.4:
    /nfs/root   *.gdvcp.net
    /mnt/cdrom  192.168.16.*
    /nfs/users  *.gdvcp.net
    /nfs/liu    192.168.16.20
    /nfs/public (everyone)

    值得注意的是,在使用showmount -e命令查看NFS服务器上的输出目录时,如果出现下面故障:

    [root@localhost ~]# showmount -e 192.168.1.4
    mount clntudp_create: RPC: Port mapper failure - RPC: Unable to receive

    可能是未启动portmap服务。

    [root@localhost ~]# showmount -e 192.168.1.4
    mount clntudp_create: RPC: Program not registered

    可能是未启动nfs服务。

    若是iptables防火墙引起的故障,为了测试NFS服务器功能,可简单地用service iptables stop命令先关掉防火墙。

    2、连接NFS服务器

    在利用showmount命令得知远程NFS服务器上的共享资源后,接下来就是进行实际的挂载操作。

    挂载NFS服务器上的输出目录的命令格式为:

    mount -t nfs 服务器名或IP地址:输出目录 本地挂载目录

    例如:将服务器(192.168.1.4)上的/nfs/public共享目录挂载到本机上的/mnt/nfs目录:

    [root@localhost ~]# mkdir /mnt/nfs
    
    [root@localhost ~]# mount -t nfs 192.168.1.4:/nfs/public /mnt/nfs

    值得注意到是,如果客户端的用户无权访问NFS服务器上的输出目录时,就会无法进行挂载。

    3、卸载NFS服务器

    如果不想再使用已挂载的NFS输出目录,可用umount命令来卸载该目录。

    [root@localhost ~]# umount /mnt/nfs

    技巧:如果当前还有客户端正在连接NFS服务器,此时想要将NFS服务器所在地主机关机,应先关掉portmap和nfs服务,否则可能要等待很久才能正常关机。如果无法正确地关闭portmap和nfs服务,那么可先用netstat -ulp找出它们的PID,然后用kill命令杀掉,这样才能正常关机。当然,还可以先用exportfs -auv命令将当前主机中NFS服务器的所有输出目录停止掉,再关机。

    4、启动时自动连接NFS

    要想让系统在启动时自动挂载NFS服务器上的输出目录,应编辑文件/etc/fstab,在该文件中加入如下格式的语句:

    NFS服务器名或IP地址:输出目录 本地挂载目录 nfs defaults 0 0

    例如:

    192.168.1.4:/nfs/public /mnt/nfs defaults 0 0
  • 相关阅读:
    互联网协议入门(一)(转)
    程序员的自我修养——操作系统篇(转)
    程序员的自我修养(2)——计算机网络(转)
    里氏替换原则
    Windows Phone 自学笔记 : ApplicationBar
    如何写好代码
    C# 通过操作注册表控制系统 (更新)
    优秀PPT 设计的十大秘诀
    设计模式学习--面向对象的5条设计原则
    SOLID (面向对象设计) From 维基百科
  • 原文地址:https://www.cnblogs.com/nufangrensheng/p/3486839.html
Copyright © 2011-2022 走看看