码迷,mamicode.com
首页 > 其他好文 > 详细

第十八章 网络文件系统(NFS)

时间:2015-09-27 22:52:38      阅读:932      评论:0      收藏:0      [点我收藏+]

标签:

一、AIX下NFS原理

        AIX的NFS软件包不仅包括NFS的命令和进程,而且还包括网络信息服务(NIS)和其他一些服务,尽管NFS和NIS作为一个软件包被一起安装,但是它们是相互独立的,可单独地配置和管理。

        NFS是一个分布式的文件系统,它允许用户访问远程系统上的文件和目录,这些文件和目录对用户来说好像是在本地,用户可以使用操作系统命令创建、删除、读/写远程文件和目录,以及设置远程文件和目录的属性,而这一切都是在本地完成的。NFS通过使用RPC(远程过程调用)而不受机器类型、操作系统和网络接口的限制。

        拥有实际的磁盘并且通过NFS将这个磁盘共享的主机叫做NFS服务器,通过NFS访问远程文件系统的主机叫做NFS客户机;服务器个客户机共享文件系统的操作成为导出(Export),客户机在访问服务器导出的文件系统之前,必须在本地安装(Mount)这个文件系统。

        NFS服务器导出的远程文件系统称之为远程资源,并且长写作:hostname:pathname格式。其中hostname是远程NFS服务器的主机名,pathname则是服务器上被导出目录的绝对路径,在客户机上安装远程资源的那个目录叫做安装点(Mount Point)

        NFS是一个应用程序,由几个具有特殊功能的不同协议组成:RPC(远程过程调用协议)和XDR(外部数据表示协议)

1、远程过程调用(RPC)

        RPC由一系列过程组成,这些过程允许一个进程(客户进程)让另一个进程(服务器进程)执行某个过程调用,就好像客户进程在它自己的地址空间中运行这个过程调用一样,由于客户进程和服务器进程是两个独立的进程,因此并不需要让它们运行在同一台主机中(尽管他们也可以运行在同一个主机上)

        通用程序(被成为客户进程)发送一个调用消息给服务器进程,然后等待回应消息。其中,调用消息包括过的相关参数,回应消息包括过程执行的结果,在不同系统之间,RPC提供了一种标准的数据编码方法,称为外部数据表示(XDR)。RPC调用消息和RPC回应消息的数据都是按照XDR的标准来编码的。

        使用RPC程序库开发的应用程序一般由客户程序和服务器程序组成,一对客户程序和服务器程序通过一个RPC程序号来标识,机一对客户程序和服务器程序使用同一个RPC程序号,一般情况下,一个服务进程(RPC)服务器惟一对应一个RPC程序号,它通过程序号来标识它提供的服务。在/etc/rpc文件中包含了服务器名、RPC程序号和服务别名。

技术分享

2、外部数据标识(XDR)

        XDR是一种在RPC报文中的数据编码方法。当vnode指出要访问的文件不在本地而在远程系统上的时候,就是用XDR协议将数据转化成XDR格式,然后再发送出去;相反,当接收到数据后,把收到的数据从XDR格式转化成本地特有的数据格式。

3、无状态(Stateless)

        NFS是无状态的协议。无状态是指NFS服务器不必维护它的每一台客户机的状态信息,客户机必须记住它自己的状态信息。

        缺点是:服务器在应答一个请求之前必须将所有的修改都提交到稳定的存储设备中。这就意味着,服务器在返回每一个应答以前,不仅要把文件数据,也要把inode和间接块之类的元数据写回到磁盘,否则服务器崩溃后有可能丢数据。

二、NFS守护进程

        NFS是通过使用许多用户级的守候进程、一小部分核心代码以及远程过程调用(RPC)的网络应用程序实现的

1、NFS服务器和客户机上的守候进程

        如果不把系统配置成即是NFS服务器也是NFS客户机的情况,那么只需要保留运行所需的NFS守候进程就好了。因为运行在NFS服务器和客户机角色想的守候进程是不同的。

a)NFS服务器所需的守候进程:

            ---->protmap:将远程过程调用(RPC)程序映射为传送层TCP/IP端口号

            ---->rpc.mount:响应客户机发来的文件系统安装请求

            ---->nfsd:执行客户机的I/O请求。

b)NFS客户机所需的守候进程:

            ---->portmap:将远程过程调用(RPC)程序映射为传送层的TCP/IP端口编号

            ---->biod:从客户机的高速缓存中提前读入或延缓写入数据块

c)NFS服务器和客户机上都会运行的进程:

            ---->rpc.stand:为rpc.lockd进程提供冲突和复原功能

            ---->rpc.lockd:处理本地或远端的加锁功能

        NFS守候进程由/etc/rc.nfs启动,启动所有的NFS守候进程之前必须先启动portmap进程。所有的NFS进程由SRC来控制。

技术分享

        下图为服务器守候进程和客户端守候进程之间的联系活动:

技术分享

2、portmap守候进程

        portmap进程由/etc/rc.tcpip命令文件启动。

        portmap进程的主要功能是把RPC程序号转化为Internet的端口号。

        一个RPC服务器对应唯一的一个RPC程序号,RPC服务器告诉portmap进程它在哪个端口号上监听连接请求和为哪个RPC程序号提供服务。通过这个过程,portmap进程就知道了每一个已注册的RPC服务器所用的Internet端口号,而且还知道哪个程序号是可用的。

技术分享

        RPC程序号就是互相之间通信的标志牌,考这个识别/指定/请求相关的服务。

        如图所示,rpc.mount服务器进程向portmap进程注册,指出它的程序号是10005,这次监听的端口号是35005和32829,portmap进程就在它维护的一张映射表上保存这个信息。当客户进程(mount)需要和rpc.mount进程通讯的时候,它首先向服务器端的portmap进程提交查询rpc.mount进程的端口号(客户端知道rpc.mount进程的程序号是10005,这个是不变的,变的是端口号),portmap进程就告诉客户端rpc.mount进程这次注册的端口号是35005和32829,客户端于是就可以通过这个端口号来与服务器端的rpc.mount进程来通讯了。

        对于每一个服务器进程来说,客户端进程只会向portmap进程询问一次,这个信息会保存,以便下次使用。

        由于所有的RPC服务器在启动的时候都要向portmap进程注册,因此在RPC服务器运行的系统上必须有portmap进程运行,这也就是为什么所有RPC服务器启动之前,portmap进程必须要启动的原因

3、rpc.mountd守候进程

        rpc.mountd守候进程响应客户机的安装请求,rpc.mountd进程通过读取/etc/xtab文件(该文件通过#exportfs -a命令产生)来找出服务器上那个文件系统可用户导出(export)。另外,rpc.mountd进程提供一个当前已安装文件系统的列表以及他们被哪个客户进程已安装出来:#showmount -a

        NFS安装图解如下:

技术分享

第1步:客户端mount进程向服务器端portmap进程查询rpc.mountd进程使用的端口号

第2步:服务器上的portmap进程讲rpc.mountd进程对应的端口号发送给客户机上mount进程

第3步:客户机上的mount进程向服务器上的rpc.mountd进程发送安装文件系统的请求,并把要安装的文件系统目录传送给rpc.mountd进程

第4步:服务器上的rpc.mountd进程检查/etc/xtab文件,验证指定的目录(文件系统)的可用性和访问权限

第5步:如果验证通过,rpc.mountd进程就在/etc/rmtab文件中做相应的记录,同时向客户机上的mount进程返回一个文件句柄(指向文件系统目录的指针),表示NFS安装成功,否则返回一个错误请求。

4、biod和nfsd守候进程

        在客户机上运行的biod进程是块输入/输出守候进程,它负责NFS客户机上高速缓存的读/写工作,并可访问远程文件系统,它和NFS服务器上的nfsd进程一起负责完成输入/输出工作。当客户机上的一个用户要读写服务器上的一个文件时,客户机上的biod进程都会首先响应,它执行“预读,延迟写”请求,然后将此请求发送给服务器上的nfsd进程,对远程文件系统的读写操作实际上最终是由服务器的内核进程完成处理,而biod进程和nfsd进程只是起到网络数据通信的作用

biod进程nfsd进程之间的工作不依赖于portmap进程的运行。

技术分享

第1步:客户机上的用户应用程序(进程)向本地内核进程发出读写远程文件系统中的文件的请求

第2步:客户机上内核进程在高速缓存区中查找所需的数据,如果找到直接转到11步,否则转到第3步

第3步:客户机内核进程把对远地文件系统的读写请求送给本地的biod进程

第4步:客户机上的biod进程把对NFS的读写请求发送给远程服务器上的nfsd进程

第5步:服务器上的nfsd进程收到请求后,先查找高速缓存区,如果找到了,就直接到第9步,如果找不到就转第6步

第6步:服务器上的nfsd进程向内核进程提出物理读写NFS的请求

第7步:服务器内核进程对本地磁盘读写数据

第8步:服务器内核进程将读取的数据写到高速缓冲区,并向nfsd进程通知数据处理完成

第9步:服务器上的nfsd进程从高速缓存区去的所需的数据,并将服务器的处理结果以及所需数据返回给客户机的biod进程。

第10步:客户机上的biod进程把从服务器获取的数据存入本地高速缓存,并将处理结果返回给内核进程,通知内核进程处理完成

第11步:客户机内核进程把从高速缓存区取得的数据和从nfsd取得的处理结果一并返回给用户应用程序

(通过第9步和第11步可以得出,不论是客户机还是服务器,对数据的读写一定是从高速缓存区进行的,哪怕高速缓存区没有命中,也宁可从磁盘先把数据读到高速缓存区,然后再去命中,也要保持只对高速缓存区读写的原则)

可以通过#smit chnfs来更改biod和nfsd进程默认启动进程的数量

技术分享

5、lockd和statd进程

        多任务的操作系统中,存在多个用户同时访问一个文件的情况,NFS更是存在次情况,那么如何保证对文件访问的正确性和文件系统的完整性,就需要试试对文件的互斥操作,保证每次只有一个用户对文件执行写操作。lockd和statd这对基于RPC的守候进程就是用于这个作用的。

网络加锁器(lockd)进程只是处理由内核或远程系统上lockd进程发出的请求,而整整对文件和记录的加锁和解锁操作是由内核完成的。客户机上的lockd进程向服务器上的lockd进程发出锁请求时通过RPC/XDR包联系的。lockd进程要求statd进程监视加锁解锁服务,客户机上的lockd进程和服务器上的statd进程互相联系,主要是提供NFS中主机奔溃恢复后对文件重新加锁的服务操作,statd进程总是在启动lockd进城后启动。

技术分享

第1步:客户机的应用程序向内核条用一个fcntl()加锁请求

第2步:内核判断加锁请求是对本地文件还是对远端文件,如果是对本地文件,则由相应的系统调用完成加锁,如果是对远端文件,就将RPC加锁请求送给客户机上的lockd进程

第3步:客户机上的lockd进程向服务器上的lockd进程发出RPC的文件加锁请求

第4步:服务器的lockd的进程就向内核提交这个请求,如果内核发现能加锁,就加锁,然后返回成功的信号,否则返回失败的信号

第5步:服务器上的lockd进程将处理结果(代号)发送给客户机上的lockd进程

第6步:若加锁成功,服务器上的lockd进程要求进程监视客户机上的进程,客户机的lockd进程要求自己的statd进程开始监视服务器上的进程,机两个statd进程通过交换RPC包来互相查询对方的NFS进程状态

第7步:客户机的lockd进程把加锁处理结果返回给自己的内核,内核在自己的系统加锁表中做相应的登记,以便将来使用

第8步:客户机上的内核然后将加锁处理的结构由fctnl()系统调用的方式返回给客户机上的应用程序

        当一个主机因奔溃而重新启动后,其statd进程向别的主机发送一个消息以知识它曾经奔溃过,然后远程主机的statd进程将所有崩溃的主机设过的加锁都清除掉。

6、启动/关闭NFS服务器

(见命令总结)

三、配置NFS服务器

        完成NFS服务功能的文件集是bos.net.nfs.server,因此在配置NFS服务器之前必须要安装了该文件集

1、SMIT工具导出NFS目录

(见云笔记)

2、手动导出NFS目录

        手动配置NFS服务器的NFS有两个步骤:

    a)编辑/etc/exportfs文件

    b)执行#exportfs -a命令来通知rpc.mountd守候进程/etc/exports已经被修改过了

rpc.mountd进程只在启动的时候自动读取一次/etc/expors文件。/etc/xtab文件中保存着当前已被导出的目录或文件系统,该文件不能直接被用户编辑(但是可以用cat等命令查看),它只能被exports命令修改

在/etc/expots文件中,一个被导出目录占一行,格式如下:

技术分享

Directory:带有全路径的目录

option:选项可以带也可以不带,带的话,有下边这几个设置可以一起任意组合(组合之间用逗号隔开)

-ro:远程用户只能以只读的方式访问被导出的目录,如果不指定ro,默认权限是rw

-rw=hostname[:hostname...]:指定多个客户机对导出目录能够进行读写访问,多个用户名之间用“:”隔开,不指定rw选所有人都有rw权限

-anon=uid:如果来自客户机的一个未知用户要访问被导出的文件系统或目录的时候,就用uid作为有效用户UID,root用户(uid为0)总是被NFS服务器认识是未知的用户,除非它包含在下边的root选项中。默认情况下:anon=-2,表示NFS将以匿名的方式接受不安全的请求,用户设置anon=-1,那么表示禁止通过匿名方式访问

-root=hostname[:hostname...]:给hostname分配具有root用户的访问权限,多个主机名之间用“:”隔开,如果不设置此项,证明任何主机不具有root访问权限

-access=client[:client...]:列出具有安装访问权限的客户机名

-sec:当客户机访问这个目录的时候,要求客户机使用安全协议一般这一行写作“-sec=sys:krb5p:krb5i:krb5:dh”如果在服务器端这么定义了,那么在客户机端的/etc/filesystems文件中的NFS那一节的option字段,也要同样写上“-sec=sys:krb5p:krb5i:krb5:dh”

技术分享

另外:如果一个已导出的目录和它的一个父目录或子目录在同一个文件系统上,则不能同时导出他的父目录或子目录。例如/usr和/usr/loca在同一个文件系统上,就不能同时导出这俩目录。

如果某一行只写了Directory,那么该导出目录可以被任意客户机访问

3、/etc/rmtab文件

        /etc/rmtab文件记录着哪些导出的本地文件系统已被哪些客户机安装了。它是以hostname:directory的形式记录着每一个被安装的文件系统,其中hostname指的是客户机的名称,directory指的是本地(服务器上)被安装的目录。该文件由rpc.mountd进程维护,每添加一个NFS时就在其中记录一条,每卸载一个NFS的之后就用#把这行注释掉。

        /etc/rmtab文件中的记录长期有效,它们会一直保存在该文件中直到客户机卸装NFS位置。#showmount -a命令的出处就是这个文件读取并生成的。

4、取消目录的导出

        smit工具下的话:#smit rmnfsexp

        也可以直接编辑/etc/exports文件,然后需要取消哪个目录的导出,就查找到那一行,删除那一行的内容。保存/etc/exports文件。最后执行#exportfs -u /tmp/ptf即可(这里假设要取消导出的目录是/tmp/ptf)

四、配置NFS客户机

        NFS目录安装有三种形式:预定义安装、直接安装和自动安装。

        预定义安装:在/etc/filesystems文件中列出将要安装的目录以及从哪个服务器安装,以便以后能够很方便的安装,常用于在客户机上要长期地使用某一个NFS目录的情况。

        直接安装:直接使用mount命令安装

        自动安装:客户机启动后并没有安装NFS目录,只有当有用户访问该NFS目录的时候,或其中的文件时,系统就自动安装该NFS。

1、预定义安装一个NFS目录

        在/etc/filesystems文件中指出要安装的目录属性,这个文件以节(stanza)的格式描述每一个文件系统,这里边包含本地文件系统和NFS。

技术分享

/datacenter:本地mount点

dev:被安装的远程文件系统的全路径名

vfs:这里应该是nfs,指出被安装的虚拟文件系统是NFS

mount=[true|false]:如果是true,那么当系统引导的时候,这个NFS就是被自动安装;如果是false,则这个NFS不被自动安装

nodename:指出远程文件系统所在的机器的主机名

option:选项,有如下选项

技术分享

    a)当NFS服务器奔溃时,采用soft安装队NFS客户机的状态影响最小

    b)当把文件的完整性看得非常重要的时候,Hard安装类型最适合安装一个可写的NFS文件系统

2、直接安装一个NFS目录

        直接安装必须用mount命令指定所有的选项,并且必须由root用户完成。

#mkdir /server3

#mount -n server3 -o bg,intr,hard server3:/home /server3

mount [ -f ] [ -n Node ] [ -o Options ] [ -p ] [ -r ] [ -v VfsName ] [ -t Type | [ Device | Node:Directory ] Directory

3、自动安装一个NFS目录

        AIX4.3以前自动安装的守候进程是automount,4.3以后自动安装的守候进程是automountd,automount变成了一个命令,不再是一个守候进程了。

        automountd守候进程监视指定的NFS目录的安装点,当对这个安装点要执行一个文件的I/O操作的时候,automountd守候进程就会实行一个RPC调用来安装这个NFS,并且自动创建在客户机上不存在的目录。

        首先需要在客户机上检查服务器导出的NFS目录有哪些。然后创建一个AutoFS映射文件,映射文件分为直接、间接映射两种,文件名任意,放的目录任意。

a)间接映射

技术分享

格式为:

[automountd进程使用的的安装点,相对目录]    [安装选项]    [服务器和在服务器上的目录路径名]

间接映射文件使用时需要在automount命令指出AutoFS安装点目录(这里是S3testfs)的父目录。

b)直接映射

格式为:

技术分享

直接映射文件automount的时候,父目录由“/-”代替

        c)Auto.master映射

当执行不带任何参数的automount命令的时候,automount命令就会查找主映射文件来获得自动安装点列表和他们的映射,这里提供了一个简单的方法:执行一次automount命令同时使用多个映射文件,包括直接映射和间接映射。这个主映射文件可以使/etc/auto.master或/etc/auto_master

技术分享

 

第十八章 网络文件系统(NFS)

标签:

原文地址:http://www.cnblogs.com/lqdflying/p/4842769.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!