还剩12页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
Linux下NFS网络文件系统设定及管理
1.准备工作
2.NFS的由来与其功能
2.1什么是NFSNetworkFileSystem
2.2什么是RPCRemoteProcedureCall
2.3NFS启动的RPCdaemons
2.4NFS的文件存取权限
3.NFSServer端的设定
3.1所需要的套件
3.2NFS的套件结构
3.3/etc/exports配置文件的语法与参数
3.4NFS服务的启动rpcinfo
3.5NFS的连接观察showmount/var/lib/nfs/etabexportfs
3.6NFS的安全性
4.NFS客户端的设定
4.1远端NFS服务器的挂载
4.2客户端可处理的挂载参数与开机挂载
4.3无法挂载的原因分析
4.4自动挂载autofs的使用
5.案例演练
6.参考资料
1、准备工作NFS这个借由网路分享文件系统的服务在架设的时候是很简单的,不过,他最大的问题在于『权限』方面的概念!因为在客户端与服务器端可能必须要具备相同的帐号才能够存取某些目录或档案另外,NFS的启动需要透过所谓的远端程序呼叫RPC,也就是说,我们并不是只要启动NFS就好了,还需要启动RPC这个服务才行!
2、NFS的由来与其功能
2.1什么是NFSNetworkFileSystemNFSNetworkFileSystem是一种分布式文件系统,允许网络中的安装不同操作系统的计算机间共享文件和外设,所以它的通讯协定设计与主机及操作系统无关.它是由SUN公司于1984年推出,使得可以本地机一样的使用另一台联网计算机的文件和外设NFS在文件传送或信息传送过程中依赖于RPC协议500this.width=500;border=0图
一、NFS主机分享目录与Client挂载示意图就如同上面的图示一般,当我们的NFSServer设定好共享出来的/home/sharefile这个目录后,其他的NFSClient端就可以将这个目录挂载到自己系统上面的某个挂载点挂载点可以自定义,例如前面图示中的NFSclient1与NFSclient2挂载的目录就不相同我只要在NFSclient1系统中进入/home/data/sharefile内,就可以看到NFSServer系统内的/home/sharefile目录下的所有资料了当然,权限要足够这个/home/data/sharefile就好像NFSclient1自己机器里面的一个partition只要权限对了,那么您可以使用cpcdmvrm.等等磁盘或文件相关的命令好的,既然NFS是通过网络来进行文件的传输,那么经由socketpair的概念你会知道NFS应该会使用一些port吧那么NFS使用哪个port来进行传输呢答案是.不知道因为NFS用来传输的port是随机选择小于1024以下的端口来使用的那客户端怎么知道你服务器端使用那个port呢此时就得要远程过程调用RemoteProcedureCallRPC的协议来辅助,下面我们就来谈谈什么是RPC
2.2什么是RPCRemoteProcedureCallRPC远程过程调用remoteprocedurecall是能使客户端执行其他系统中程序的一种机制由于使用RPC的程序不必了解支持通信的网络协议的情况,因此RPC提高了程序的互操作性常用于分布式客户端/服务器模型,发出请求的程序是客户程序,而提供服务的程序是服务器因为NFS支持的功能相当的多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些port来传输文件,因此,NFS的功能所对应的port才没有固定,而是采用随机取用一些未被使用的小于1024的端口来作为传输之用但如此一来又造成客户端想要连上服务器时的困拢,因为客户端得要知道服务器端的相关端口才能够连接!此时我们就得需要远程过程调用RPC的服务,RPC最主要的功能就是在指定每个NFS功能所对应的portnumber,并且返回给客户端,让客户端可以连结到正确的端口上去那RPC又是如何知道每个NFS的端口呢这是因为当服务器在启动NFS时会随机取用数个端口,并主动的向RPC注册,因此RPC可以知道每个端口对应的NFS功能,然后RPC又是固定使用port111来监听客户端的需求并返回客户端正确的端口注在启动NFS之前,RPC就要先启动了,否则NFS会无法向RPC注册另外,RPC若重新启动时,原来注册的资料会不见,因此RPC重新启动后,它管理的所有程序都需要重新启动以重新向RPC注册500this.width=500;border=0图
二、NFS与RPC服务及文件系统操作的相关性如上图所示,当客户端有NFS文件存取需求时,它会如何向服务器端请求文件呢
1、客户端会向服务器端的RPCport111发出NFS档案存取功能的询问要求;
2、服务器端找到对应的已注册的NFSdaemon端口后,会返回给客户端;
3、客户端了解正确的端口后,就可以直接与NFSdaemon来建立连接;由于NFS的各项功能都必须要向RPC来注册,如此一来RPC就能了解NFS这个服务的各项功能之portnumberPIDNFS在主机所监听的IP等等,而客户端才能够通过RPC的询问找到正确对应的端口也就是说,NFS必须要有RPC存在时才能成功的提供服务,因此我们称NFS为RPCserver的一种事实上,有很多这样的服务器都是向RPC注册的,举例来说,NISNetworkInformationService也是RPCserver的一种此外,由图二你也会知道,不论是客户端还是服务器端,要使用NFS时,两者都需要启动RPC才行更多的NFS相关协议信息你可以参考下面网页
2.3NFS启动的RPCdaemons我们现在知道NFS服务器在启动的时候就得要向RPC注册,所以NFS服务器也被称为RPCserver之一那么NFS服务器主要的任务是进行文件系统的共享,文件系统的共享则与权限有关所以NFS服务器启动时至少需要两个daemons,一个管理client端是否能够登入的问题,一个管理client端能够取得的权限如果你还想要管理quota的话,那么NFS还得要再载入其他的RPC程序我们以较单纯的NFS主机来说rpc.nfsd这个daemon主要的功能就是在管理Client是否能够登入主机的权限,其中还包含这个登入者的ID的判别rpc.mountd这个daemon主要的功能,则是在管理NFS的文件系统,当Client端顺利的通过rpc.nfsd而登入主机之后,在他可以使用NFS服务器提供的文件之前,还会经过文件使用权限就是那个-rwxrwxrwx与ownergroup那几个权限的认证程序!它会去读NFS的配置文件/etc/exports来比对Client的权限,当通过这一关之后Client就可以取得使用NFS文件的权限注这个也是我们用来管理NFS共享之目录的使用权限与安全设定的地方rpc.lockd非必要这个玩意儿可以用在管理文件的锁定lock用途为何文件需要『锁定』呢因为既然分享的NFS文件可以让客户端使用,那么当多个客户端同时尝试写入某个文件时,就可能对于该文件造成一些问题啦!这个rpc.lockd则可以用来克服这个问题但rpc.lockd必须要同时在客户端与服务器端都开启才行,此外,rpc.lockd也常与rpc.statd同时启用rpc.statd非必要可以用来检查文件的一致性,与rpc.lockd有关!若发生因为客户端同时使用同一文件造成文件可能有所损毁时,rpc.statd可以用来检测并尝试回复该文件与rpc.lockd同样的,这个功能必须要在服务器端与客户端都启动才会生效
2.4NFS的文件存取权限不知道你有没有想过这个问题,在图一的环境下,假如我在NFSclient1上面以dmtsai这个使用者身份想要去存取/home/data/sharefile/这个来自NFSserver所提供的文件系统时,请问NFSserver所提供的文件系统会让我以什么身份去存取是dmtsai还是为什么会这么问呢这是因为NFS本身的服务并没有进行身份登入的识别,所以说,当你在客户端以dmtsai的身份想要存取服务器端的文件系统时,服务器端会以客户端的使用者UID与GID等身份来尝试读取服务器端的文件系统这时有个有趣的问题就产生啦!那就是如果客户端与服务器端的使用者身份并不一致怎么办我们以下面这个图示来说明一下500this.width=500;border=0图
三、NFS的服务器端与客户端的使用者身份确认机制当我以dmtsai这个一般身份使用者要去存取来自服务器端的文件时,你要先注意到的是文件系统的inode所记录的属性为UIDGID而非帐号与群组名那一般Linux主机会主动的以自己的/etc/passwd/etc/group来查询对应的使用者、群组名称所以当dmtsai进入到该目录后,会参照NFSclient1的使用者与群组名称但是由于该目录的文件主要来自NFSserver,所以可能就会发现几个情况NFSserver/NFSclient刚好有相同的帐号与群组则此时使用者可以直接以dmtsai的身份进行服务器所提供的文件系统之存取NFSserver的501这个UID帐号对应为vbird若NFS服务器上的/etc/passwd里面UID501的使用者名称为vbird时,则客户端的dmtsai可以存取服务器端的vbird这个使用者的文件!只因为两者具有相同的UID而已这就造成很大的问题了!因为没有人可以保证客户端的UID所对应的帐号会与服务器端相同,那服务器所提供的资料就可能会被错误的使用者修改NFSserver并没有501这个UID另一个极端的情况是,在服务器端并没有501这个UID的存在,则此时dmtsai的身份在该目录下会被压缩成匿名者,一般NFS的匿名者会以UID为65534为其使用者,早期的Linuxdistributions这个65534的帐号名称通常是nobody,我们的RHEL4则取名为nfsnobody如果使用者身份是root时有个比较特殊的使用者,那就是每个Linux主机都有的UID为0的root想一想,如果客户端可以用root的身份去存取服务器端的文件系统时,那服务器端的资料哪有什么保护性所以在预设的情况下,root的身份会被主动的压缩成为匿名者总之,客户端使用者能做的事情是与UID及其GID有关的,那当客户端与服务器端的UID及帐号的对应不一致时,可能就会造成文件系统使用上的困扰,这个就是NFS文件系统在使用上面的一个很重要的地方!而在了解使用者帐号与UID及文件系统的关系之后,要实际在客户端以NFS取用服务器端的文件系统时,你还得需要具有NFS服务器有开放可写入的权限与/etc/exports设定有关;实际的文件权限具有可写入w的权限当你满足了1使用者帐号,亦即UID的相关身份;2NFS服务器允许有写入的权限;3文件系统确实具有w的权限时,你才具有该文件的可写入权限!尤其是身份UID确认的环节部分,最容易搞错!也因为如此,所以NFS通常需要与NIS这一个可以确认客户端与服务器端身份一致的服务搭配使用,以避免身份的错乱
3、NFSServer端的设定既然要使用NFS的话,就得要安装NFS所需要的套件下面让我们查询一下系统有无安装所需要的套件,NFS套件的架构以及如何设定NFS主机^
3.1所需要的套件以RHEL4为例的话,要设定好NFS服务器我们必须要有两个套件才行,分别是NFS主程序nfs-utilsRPC主程序portmapportmap就如同刚刚提的到,我们的NFS其实可以被视为一个RPC程序,而要启动任何一个RPC程序之前,我们都需要做好port的对应mapping的工作才行,这个工作其实就是『portmap』这个服务所负责的!也就是说,在启动任何一个RPCserver之前,我们都需要启动portmap才行!nfs-utils就是提供rpc.nfsd及rpc.mountd这两个NFSdaemons与其他相关documents与说明文件、执行档等的套件!这个就是NFS的主要套件判断系统中是否已安装NFS相关包RHEL4系统的情况;其它版本的Redhat及Fedora的系统和这相似;#rpm-qa|grepnfsnfs-utils-
1.
0.6-
65.EL4#rpm-qa|grepportmapportmap-
4.0-
633.2NFS的套件结构/etc/exports这个文件就是NFS的主要配置文件系统可能没有预设,所以这个文件不一定会存在,您可能必须要使用vi主动的建立这个文件/usr/sbin/exportfs这个是维护NFS共享资源的命令,我们可以利用这个命令重新共享/etc/exports变更的目录资源、将NFSServer分享的目录卸载或重新分享等等,这个指令是NFS系统里面相当重要的至于指令的用法我们在下面会再介绍/usr/sbin/showmount这是另一个重要的NFS命令exportfs是用在NFSServer端,而showmount则主要用在Client端这个showmount可以用来察看NFS共享出来的目录资源/var/lib/nfs/*tab在NFS服务器的登录档都放置到/var/lib/nfs/目录里面,在该目录下有两个比较重要的登录档,一个是etab,主要记录了NFS所分享出来的目录的完整权限设定值;另一个xtab则记录曾经连结到此NFS主机的相关客户端资料/var/lib/nfs/rmtab状态文件,列出了挂接导出文件的远程客户机清单
3.3/etc/exports配置文件的语法与参数在开始NFS服务器的设置之前,您必须要了解的是,NFS会直接使用到内核功能,所以你的内核必须要有支持NFS才行万一如果你的内核版本小于
2.2版,或者重新自行编译过内核的话,那么就得要很注意,因为你可能会忘记选择NFS的核心支持还好,我们RHEL4或者是其他版本的Linux,预设内核通常是支援NFS功能的,所以你只要确认你的内核版本是目前新的
2.
6.x版,并且使用你的distribution所提供的核心,那应该就不会有问题至于NFS服务器的架设实在很简单,你只要编辑好主要配置文件/etc/exports之后,先启动portmap,然后再启动nfs,你的NFS就成功了!不过这样的设定能否对客户端生效那就得要考虑你权限方面的设定能力了我们就直接来看看/etc/exports应该如何配置,某些distributions并不会主动提供/etc/exports文件,所以请您自行手动建立例如#vi/etc/exports/tmp
192.
168.
1.0/24rolocalhostrw*.ev.ncku.edu.twrosync[分享目录][第一个主机权限][可用主机名][可用域名]这个文件的内容非常简单,每一行由共享路径,客户端列表以及每个客户端后紧跟的访问选项构成[共享的目录][主机名或IP参数参数]其中参数是可选的,当不指定参数时,nfs将使用默认选项默认的共享选项是syncroroot_squashno_delay当主机名或IP地址为空时,则代表共享给任意客户机提供服务当将同一目录共享给多个客户机,但对每个客户机提供的权限不同时,可以这样[共享的目录][主机名1或IP1参数1参数2][主机名2或IP2参数3参数4]下面是一些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通常也就是nobodynfsnobody,适合公用目录root_squash在登入NFS主机使用共享之目录的使用者如果是root时,那么这个使用者的权限将被映射成为匿名使用者,通常他的UID与GID都会变成nobodynfsnobody那个系统帐号的身份的权限;默认no_root_squas登入NFS主机使用共享目录的使用者,如果是root的话,那么对于这个共享的目录来说,他就具有root的权限!这个项目『极不安全』,不建议使用!anonuid=xxx指定NFS服务器/etc/passwd文件中匿名客户的UIDanongid=xxx指定NFS服务器/etc/passwd文件中匿名客户的GID/etc/exports中client的书写规则1单个主机可以用短名及完全限定名,或者用IP地址,例如student
01、student
01.flying.com.cn或者
192.
168.
10.1都是合法的主机名2Net-Group可以列出/etc/netgroup文件中或NFS网组映射中定义的整组主机网组名以@开头3通配符主机.discuz.net*.*.comsenz.com4掩码
192.
168.
1.0/
255.
255.
255.0接下来我们利用上述的几个参数来实际思考一下几个有趣的小习题思考一让root保有root的权限我想将/tmp共享出去给大家使用,由于这个目录本来就是大家都可以读写的,因此想让所有的人都可以存取此外,我要让root写入的文件还是具有root的权限,那如何设计配置文件#vi/etc/exports#任何人都可以用我的/tmp,用通配字符*来处理主机名称,重点在no_root_squash/tmp*rwno_root_squash参考前面的主机名称设定说明,我们可以利用通配字符*这表示无论来自哪里都可以使用我的/tmp这个目录再次提醒,『*rwno_root_squash』这一串设定值中间是没有空格的,而/tmp与*rwno_root_squash则是有空格来隔开的特别注意到no_root_squash的功能!在这个例子中,如果你是客户端,而且您是以root的身份登入您的Linux主机,那么当您mount上我这部主机的/tmp之后,您在该mount的目录当中,将具有『root的权限』思考二同一目录针对不同范围开放不同权限我要将一个公共的目录/home/public公开出去,但是只有限定我的局域网内
192.
168.
0.0/24这个网段可以读写,其他人则只能读取#vi/etc/exports/tmp*rwno_root_squash/home/public
192.
168.
0.0/24rw*ro#继续加在后面,注意,我有将主机与网域分为两段用空格隔开上面的例子说的是,当我的IP是在
192.
168.
0.0/24这个网段的时候,那么当我在Client端挂载了Server端的/home/public后,针对这个被我挂载的目录我就具有可以读写的权限,至于如果我不是在这个网段之内,那么这个目录的文件我就只能读取而已,亦即为只读的属性需要注意的是,通配字符仅能用在主机名称的分辨上面,IP或网段就只能用
192.
168.
0.0/24的状况,不可以使用
192.
168.
0.*思考三仅给某个单一主机使用的目录设置我要将一个私人的目录/home/test开放给
192.
168.
0.100这个Client端的机器来使用,那么我就必需这么写#vi/etc/exports/tmp*rwno_root_squash/home/public
192.
168.
0.0/24rw*ro/home/test
192.
168.
0.100rw#只要设定IP正确即可!这样就设定完成了!而且,只有
192.
168.
0.100这部机器才能对/home/test这个目录进行存取思考四开放匿名登入的情况我要让*.linux.org网域的主机,登入我的NFS主机时,可以存取/home/linux,但是他们存资料的时候,我希望他们的UID与GID都变成40这个身份的使用者,假设我NFS服务器上的UID40已经有设定妥当#vi/etc/exports/tmp*rwno_root_squash/home/public
192.
168.
0.0/24rw*ro/home/test
192.
168.
0.100rw/home/linux*.linux.orgrwall_squashanonuid=40anongid=40#如果要开放匿名,那么重点是all_squash,并且要配合anonuid特别注意到那个all_squash与anonuidanongid的功能!如此一来,当test.linux.org登入这部NFS主机,并且在/home/linux写入文件时,该文件的所有人与所有群组,就会变成/etc/passwd里面对应的UID为40的那个身份的使用者上面四个案例的权限如果依照前一小节的存取设定权限来思考的话,那么权限会是什么情况呢让我们来检查一下客户端与主机端具有相同的UID与帐号假设我在
192.
168.
0.100登入这个NFSIP假设为
192.
168.
0.2主机,并且我在
192.
168.
0.100的帐号为dmtsai这个身份,同时,在这个NFS上面也有dmtsai这个帐号,并具有相同的UID,果真如此的话,那么a由于
192.
168.
0.2这个NFS主机的/tmp权限为-rwxrwxrwt,所以我dmtsai在
192.
168.
0.100上面在/tmp底下具有存取的权限,并且写入的文件所有人为dmtsai;b在/home/public当中,由于我有读写的权限,所以如果在/home/public这个目录的权限对于dmtsai有开放写入的话,那么我就可以读写,并且我写入的文件所有人是dmtsai但是万一/home/public对于dmtsai这个使用者并没有开放可以写入的权限时,那么我还是没有办法写入文件这点请特别留意;c在/home/test当中,我的权限与/home/public相同的状态还需要NFS主机的/home/test对于dmtsai有开放权限;d在/home/linux当中就比较麻烦因为不论您是何种user,您的身份一定会被变成UID=40这个帐号!所以,这个目录就必需要针对UID=40的那个帐号名称,修改他的权限才行客户端与主机端的帐号并未相同时假如我在
192.
168.
0.100的身份为vbird,但是
192.
168.
0.2这部NFS主机却没有vbird这个帐号时,情况会变成怎样呢a我在/tmp底下还是可以写入,但是写入的文件所有人变成nobody了;b我在/home/public里面是否可以写入,还需要视/home/public的权限而定,不过,反正我的身份就被变成nobody了就是;c/home/test的观点与/home/public相同!d/home/linux底下,我的身份就被变成UID=40那个使用者呢!当客户端的身份为root时假如我在
192.
168.
0.100的身份为root,root这个帐号每个系统都会有,权限变成怎样呢a我在/tmp里面可以写入,并且由于no_root_squash的参数,改变了预设的root_squash设定值,所以在/tmp写入的文件所有者为rootb我在/home/public底下的身份还是被压缩成为nobody,因为预设属性里面都具有root_squash,所以,如果/home/public有针对nobody开放写入权限时,那么我就可以写入,但是文件所有者变成nobodyc/home/test与/home/public相同;d/home/linux的情况中,我root的身份也被压缩成为UID=40的那个使用者这样的权限讲解之后,您可以了解了吗这里是最重要的地方,如果这一关通过了,下面的就没有问题啦!当然,您还是得要回到前一小节NFS的文件存取权限好好的瞧一瞧,才能解决NFS的问题
3.4NFS服务的启动NFS的启动还需要portmap的协助,所以需先启动#/etc/init.d/portmapstart#如果portmap本来就已经在执行了,那就不需要启动啊!#/etc/init.d/nfsstart#有时候可能会出现如下的警告讯息exportfs/etc/exports
[3]Nosyncorasyncoptionspecifiedforexport
192.
168.
0.100/home/test.Assumingdefaultbehavioursync.#上面的警告讯息仅是在告知因为我们没有指定sync或async的参数,#则NFS将预设会使用sync的资讯而已你可以不理他,也可以加入/etc/exports#vi/etc/exports/tmp*rwno_root_squashsync/home/public
192.
168.
0.0/24rwsync*rosync/home/test
192.
168.
0.100rwsync/home/linux*.linux.orgrwall_squashanonuid=40anongid=40sync#/etc/init.d/nfsrestartportmap不需要设定,只要直接启动就行,启动之后,会出现一个port111的sunrpc的服务,那就是portmap啦!至于nfs则会启动至少两个以上的daemon出现!然后就开始在监听Client端的请求你必须要很注意屏幕上面的输出资讯,因为如果配置文件写错的话,屏幕上会显示出错误此外,如果你想要增加一些NFS服务器的文件一致性功能时,可能需要用到rpc.lockd及rpc.statd等RPC服务,那么或许你可以增加一个服务,那就是nfslock#/etc/init.d/nfslockstart启动之后,请赶快到/var/log/messages里面看看有没有被正确的启动呢#vi/var/log/messagesSep22000137linuxnfs StartingNFSservicessucceededSep22000137linuxnfs rpc.rquotadstartupsucceededSep22000137linuxnfsd
[1050]nfssvc_versbits+2+3+4Sep22000137linuxnfs rpc.nfsdstartupsucceededSep22000137linuxnfs rpc.mountdstartupsucceededSep22000137linuxrpcidmapd rpc.idmapd-SIGHUPsucceeded在确认没有问题之后,接下来我们来看一看NFS到底开了哪些端口#netstat-ultnActiveInternetconnectionsonlyserversProtoRecv-QSend-QLocalAddressStatePID/Programnametcp
000.
0.
0.02049LISTEN-tcp
000.
0.
0.0803LISTEN1047/rpc.rquotadtcp
000.
0.
0.0111LISTEN32503/portmaptcp
000.
0.
0.0819LISTEN1064/rpc.mountdudp
000.
0.
0.02049-udp
000.
0.
0.08001047/rpc.rquotadudp
000.
0.
0.08161064/rpc.mountdudp
000.
0.
0.011132503/portmap注意看到上面,总共产生了好多的port,真是可怕!不过主要的端口是portmap启动的port在111;NFS启动的port在2049;其它rpc.daemons启动的port则是随机产生的,因此需向port111注册好了,那我怎么知道每个RPC服务的注册状况你可以使用rpcinfo来处理的#rpcinfo[-p][IP|hostname]参数-p显示出所有的port与porgram的信息;范例一显示出目前这部主机的RPC状态#rpcinfo-plocalhostprogramversprotoport1000002tcp111portmapper1000002udp111portmapper1000111udp800rquotad1000112udp800rquotad1000111tcp803rquotad1000112tcp803rquotad1000032udp2049nfs1000033udp2049nfs1000032tcp2049nfs1000033tcp2049nfs1000051udp816mountd1000051tcp819mountd1000052udp816mountd1000052tcp819mountd1000053udp816mountd1000053tcp819mountd#NFS版本端口服务名称上面出现的信息当中除了程序名称与端口的对应可以与netstat-tlunp输出的结果作比对之外,还需要注意到NFS版本支持!新的NFS版本传输速度较快,由上表看起来,我们的NFS至少支持到第3版,应该还算合理,如果你的rpcinfo无法输出,那就表示注册的资料有问题,可能需要重新启动portmap与nfs
3.5NFS的连接观察在你的NFS服务器设定好之后,我们可以先自我测试一下是否可以连接showmount[-ae][hostname|IP]参数-a这个参数是一般在NFSSERVER上使用,是用来显示已经mount上本机nfs目录的cline机器-e显示主机的/etc/exports所共享的目录范例一请显示出刚刚我们所设定好的相关exports信息#showmount-elocalhostExportlistforlocalhost/tmp*/home/linux*.linux.org/home/publiceveryone/home/test
192.
168.
0.100很简单吧!所以,当您要查看某一台主机提供的NFS共享的目录时,就使用showmount-eIP或hostname即可!非常的方便吧!这也是NFSclient端最常用的指令事实上NFS关于目录权限设定的资料非常之多!我们可以检查一下/var/lib/nfs/etab就知道了!#tail/var/lib/nfs/etab/home/public*rosyncwdelayhidenocrossmntsecureroot_squashno_all_squashsubtree_checksecure_locksmapping=identityanonuid=-2anongid=-2#上面是同一行,可以看出除了rosyncroot_squash等等,#其实还有anonuid及anongid等等的设定!/tmp*rwsyncwdelayhidenocrossmntsecureno_root_squashno_all_squashsubtree_checksecure_locksmapping=identityanonuid=-2anongid=-2#同样的,在/tmp也有很多的权限相关的参数上面仅仅是一个小范例,只是.怎么anonuid会是-2其实那个数值是65536-2,所以得到65534,比对/etc/passwd,会发现RHEL4出现的是nfsnobody这个帐号在不同的版本都可能会不一样另外,如果有其他客户端挂载了你的NFS文件系统时,那么该客户端与文件系统信息就会被记录到/var/lib/nfs/xtab另外,如果你想要重新处理/etc/exports文件,是不是我们每次修改了配置文件都需要重启nfs服务呢这个时候我们就可以用exportfs命令重新扫描/etc/exports文件,来使改动立刻生效exportfs[-aruv]参数-a全部挂载或卸载/etc/exports文件内的设置-r重新挂载/etc/exports里面的设置,此外,亦同步更新/etc/exports及/var/lib/nfs/xtab的内容!-u卸载某一目录-v在export的时候,将分享的目录显示到屏幕上!范例一重新挂载一次/etc/exports的设置#exportfs-arvexporting
192.
168.
0.100/home/testexporting
192.
168.
0.0/24/home/publicexporting*.linux.org/home/linuxexporting*/home/publicexporting*/tmp范例二全部卸载#exportfs-auv
3.6NFS的安全性在NFS的安全性上面,有些地方是你必须知道的!下面我们分别来看一看a利用iptables做大范围连接的限制假设我们的NFS主要是针对内部网路开放而已,而对于外部网路只有对
140.
116.
0.0/16这个网段,那么你可以在iptables.allow内增加如下的语法#vi/usr/local/virus/iptables/iptables.allowiptables-AINPUT-i$EXTIF-pTCP-s
192.
168.
0.0/24--dport111-jACCEPTiptables-AINPUT-i$EXTIF-pUDP-s
192.
168.
0.0/24--dport111-jACCEPTiptables-AINPUT-i$EXTIF-pTCP-s
140.
116.
0.0/16--dport111-jACCEPTiptables-AINPUT-i$EXTIF-pUDP-s
140.
116.
0.0/16--dport111-jACCEPT这样大致上就可以让
192.
168.
0.0/24这个CClass的网域与
140.
116.
0.0/16这个BClass的网段到您的主机里面来,而其它的连接就视您的原本的iptables的状态而定那为什么是限制port111而不是每个RPCserver所开启的端口呢因为RPCserver所开启的端口都是随机产生的,要对他开放实在是.而且客户端想要连上NFS服务器之前,都是透过port111来向NFS服务器询问连接的端口的,所以当然先就port111来进行限制b利用TCPWrappers限制但是不同的RPC毕竟提供的服务不一样,如果你想要针对某些服务来阻止的话,那可以透过TCPWrappers这个根据programname来阻止网路包,还记得我们刚刚使用过rpcinfo这个指令,不是会输出很多的RPCprogramname吗没错!你可以这样做#vi/etc/hosts.allow#让来自
140.
116.
44.0/
255.
255.
255.0的主机可以使用mountdmountd
140.
116.
44.0/
255.
255.
255.0#vi/etc/hosts.deny#让所有人都不能使用mountdmountd ALL为什么使用的是mountd呢去到前一小节的rpcinfo指令处看一下,你就会知道为何需要使用到mountdc使用/etc/exports设定更安全的权限这就牵涉到您的逻辑思考了!怎么设置都没有关系,但是在『便利』与『安全』之间,要找到您的平衡点善用root_squash及all_squash等功能,再利用anonuid等等的设定来规范登入您主机的使用者身份!应该还是有办法提供一个较为安全的NFS主机的!另外,当然啦,你的NFS服务器的文件系统之权限设定也需要很留意!不要随便设定成为-rwxrwxrwx,这样会造成你的系统『很大的困扰』d更安全的partition规划如果您的工作环境中,具有多部的Linux主机,并且预计彼此共享出目录时,那么在安装Linux的时候,最好就可以规划出一块partition作为预留之用因为『NFS可以针对目录来分享』,因此,您可以将预留的partition挂载在任何一个挂载点,再将该挂载点就是目录由/etc/exports的设定中分享出去,那么整个工作环境中的其他Linux主机就可以使用该NFS主机的那块预留的partition所以,在主机的规划上面,主要需要留意的只有partition而已此外,由于共享的partition可能较容易被入侵,最好可以针对该partition设定比较严格的参数在/etc/fstab当中eNFS服务器关机前的注意事项需要注意的是,由于NFS使用的这个RPC在client端连上服务器时,那么您的服务器想要关机,那可就会成为『不可能的任务』!如果您的Server上面还有Client在连接,那么您要关机,可能得要等到数个钟头才能够正常的关机成功!真的假的不相信吗不然您自已试试看!所以,建议您的NFSServer想要关机之前,能先『关掉portmap与nfs』如果无法正确的将这两个daemons关掉,那么先以netstat-utlp找出PID,然后以kill将他杀掉先,这样才有办法正常的关机成功请特别的注意!当然,你也可以利用showmount-alocalhost查出来那个客户端还在连接,或者是查阅/var/lib/nfs/rmtab或xtab等文件来检查亦可找到这些客户端后,可以直接call他们啊!让他们能够帮帮忙先!事实上,客户端以NFS连接到服务器端时,如果他们可以下达一些比较不那么『硬』的挂载参数时,就能够减少这方面的问题相关的安全性可以参考下一小节的客户端可处理的挂载参数与开机挂载
4、NFS客户端的设定既然NFS服务器最主要的工作就是共享文件系统给网路上其他的客户端,所以客户端当然得要挂载这个玩意儿!此外,主机端可以加设防火墙来保护自己的文件系统,那么客户端挂载该文件系统后,难道不需要保护自己所以下面我们要来谈一谈几个NFS客户端
4.1远端NFS服务器的挂载你要如何挂载NFS服务器所提供的文件系统基本上,可以这样做a确认本地端已经启动了portmap服务!b查看NFS服务器共享的目录有哪些,并了解我们是否可以使用showmount;c在本地端建立预计要挂载的挂载点目录mkdir;d利用mount将远端主机直接挂载到相关目录好,现在假设客户端在
192.
168.
0.100这部机器上,而服务器是
192.
168.
0.2,那么赶紧来检查一下我们是否已经有portmap的启动,另外远端主机有什么可用的目录!#/etc/init.d/portmapstart#/etc/init.d/nfslockstart#一般来说,系统预设会启动portmap#另外,如果服务器端有启动nfslock的话,客户端也要启动才能生效!#showmount-e
192.
168.
0.2Exportlistfor
192.
168.
0.2/tmp*/home/linux*.linux.org/home/publiceveryone==这是等一下我们要挂载的目录/home/test
192.
168.
0.100接下来我想要将远端主机的/home/public挂载到本地端主机的/home/nfs/public,所以我就得要在本地端主机先建立起这个挂载点目录才行啊!然后就可以用mount这个命令直接挂载NFS的文件系统!#mkdir-p/home/nfs/public#mount-tnfs
192.
168.
0.2/home/public/home/nfs/public#注意一下挂载的语法!『-tnfs』指定文件系统类型#IP/dir则是指定某一部主机的某个提供的目录!#dfFilesystem1K-blocksUsedAvailableUse%Mountedon.中间省略.
192.
168.
0.2/home/public100805122135072743334423%/home/nfs/public
4.2客户端可处理的挂载参数与开机挂载如果你刚刚挂载到本机/home/nfs/public的文件系统当中,含有一个script,且这个script的内容为『rm-rf/』且该文件权限为555,如果你因为好奇给它执行下去,整个系统都会被删掉!所以说,除了NFS服务器需要保护之外,我们取用人家的NFS文件系统也需要自我保护才行那要如何自我保护啊可以透过mount的指令参数!包括底下这些主要的参数可以尝试加入suid、nosuid如果挂载的partition上面有任何suid的binary程序时,你只要使用nosuid就能够取消SUID的功能系统预设值suidrw、ro你可以指定该partition是只读ro或可读写系统预设值rwdev、nodev是否可以保留装置文件的特殊功能一般来说只有/dev才会有特殊的装置,因此你可以选择nodev系统预设值devexec、noexec是否具有执行binaryfile的权限如果你想要挂载的仅是资料区例如/home,那么可以选择noexec系统预设值execuser、nouser是否允许使用者进行文件的挂载与卸载功能如果要保护文件系统,最好不要提供使用者进行挂载与卸载系统预设值nouserautonoauto这个auto指的是『mount-a』时,会不会被挂载的项目如果你不需要这个partition随时被挂载,可以设定为noauto系统预设值auto一般来说,如果你的NFS服务器所提供的只是类似/home下面的个人资料,应该不需要可执行、SUID与装置文件,因此当你在挂载的时候,可以这样挂载#mount-tnfs-onosuidnoexecnodevrw
192.
168.
0.2/home/public/home/nfs/public#mount
192.
168.
0.2/home/publicon/home/nfs/publictypenfsrwnoexecnosuidnodevaddr=
192.
168.
0.2这样一来你所挂载的这个文件系统就只能作为文件存取之用,相对来说,对于客户端是比较安全一些的关于NFS特殊的挂载参数除了上述的mount参数之外,其实针对NFS服务器,Linux还提供不少有用的额外参数因为NFS使用的是RPC服务,这个RPC必须要客户端与服务器端两者都有启动RPC才能运作在一般的模式下面,你想要在客户端挂载服务器端的NFS文件系统时,一次命令只能挂载一次,如果该次挂载由于某些问题例如服务器未开机、RPC忘记开等等导致无法顺利挂载时,你只能等到连接超时timeout后,才能够继续工作另外,当建立连接后,RPC会不断的在客户端与服务器两者之间进行呼叫,此时如果有一个主机失去连接,那么RPC将会持续不断的呼叫,直到服务器或客户端恢复连接为止此一行为将导致RPC服务出现延迟问题,结果常常就造成你在执行df或者是mount等命令时,出现『等等等等』的情况为了避免这些困扰,我们还有一些额外的NFS挂载参数可用例如fg、bg当执行挂载时,该挂载的行为会在前台fg还是在后台bg执行若在前台执行时,则mount会持续尝试挂载,直到成功或timeout为止,若为后台执行,则mount会在后台持续多次进行mount,而不会影响到前台的程序操作如果你的网路连接有点不稳定,或是服务器常常需要开关机,那建议使用bg比较妥当预设参数fgsofthard上面不是谈到挂载时会使用RPC呼叫,如果是hard的情况,则当两者之间有任何一个主机离线,则RPC会持续的呼叫,直到对方恢复连接为止如果是soft的话,那RPC会在timeout后『重复』呼叫,而非『持续』呼叫,因此系统的延迟会比较不这么明显同上,如果你的服务器可能开开关关,建议用soft预设参数hardintr当你使用上面提到的hard方式挂载时,若加上intr这个参数,则当RPC持续呼叫中,该次的呼叫是可以被中断的interrupted预设参数无rsizewsize读出rsize与写入wsize的区块大小blocksize这个设定值可以影响客户端与服务器端传输资料的缓存记忆容量一般来说,如果在局域网路内LAN,并且客户端与服务器端都具有足够的内存,那这个值可以设置大一点,比如说8192bytes等,提升缓存记忆区块将可提升NFS文件系统的传输能力但要注意设定的值也不要太大,最好是达到网路能够传输的最大值为限举例来说,如果你的MTU可达9000,那设定成8192才会有意义预设参数rsize=1024wsize=1024更多的参数可以参考mannfs,通常如果你的NFS是用在高速运作的环境当中的话,那么可以建议加上这些参数#mount-tnfs-onosuidnoexecnodevrwbgsoftrsize=8192wsize=
8192192.
168.
0.2/home/public/home/nfs/public则当你的
192.
168.
0.2这个服务器因为某些因素离线时,你的NFS可以继续在后台中重复的呼叫!直到NFS服务器再度上线为止这对于系统的持续操作还是有帮助的,rsize与wsize的大小则需要依据你的实际网路环境而定启动时自动挂载NFS修改客户机的/etc/fstab文件,加入类似如下行#vi/etc/fstab
192.
168.
0.2/home/public/home/nfs/publicnfsnosuidnoexecnodevrwbgsoftrsize=8192wsize=819200#注意!上面的设定是同一行
4.3自动挂载autofs的使用在传统的NFS文件系统的使用中,如果客户端要使用服务器端所提供的NFS文件系统时
1、在/etc/fstab当中设定开机时挂载,
2、要手动利用mount来挂载此外,客户端得要预先手动的建立好挂载点目录不过有个小问题,我们知道NFS服务器与客户端的连接或许可能不会永远存在,而RPC这个服务,如果挂载了NFS服务器后,任何一方离线都可能造成另外一方老是在等待超时换个思考的角度可不可以让客户端在有使用到NFS文件系统的需求时才挂载并且不需要事先建立挂载点另外,当NFS文件系统使用完毕后,可不可以让NFS自动卸载,以避免可能的RPC错误在现在的Linux环境下采用autofs服务是可以达成autofs使用automount守护进程来管理你的挂载点,它只在文件系统被访问时才动态地挂载它们autofs查询主配置文件/etc/auto.master来决定要定义哪些挂载点然后,它使用适用于各个挂载点的参数来启动automount进程主配置中的每一行都定义一个挂载点,然后用单独的配置文件定义在该挂载点下要挂载的文件系统autofs可以预先定义好客户端『预计挂载来自服务器端的上层目录』,以及其相关的对应NFS服务器共享目录至于在该目录下面的对应目录则可以不需要额外设置让我们看看下面的图示500this.width=500;border=0图
四、自动挂载的设定档内容如上图所示,我们的autofs主要设定档为/etc/auto.master,这个文件的内容很简单,如上所示,我只要定义出最上层目录/home/nfs即可,至于后续的文件则是该目录底下各次目录的对应在etc/auto.nfs这个文件的文件名可自定义里面则可以定义出每个次目录所欲挂载的远端服务器目录然后『当我们在客户端要使用/home/nfs/public的资料时,此时autofs才会去
192.
168.
0.2挂载/home/public』且『当隔了5分钟没有使用该目录下的文件后,则/home/nfs/public将会主动的卸载』建立主要配置文件/etc/auto.master这个主要配置文件的内容很简单,只要有预设目录及『资料对应文件』即可那个资料对应文件的文件名是可以自行定义的,在这个例子当中我使用/etc/auto.nfs来命名#vi/etc/auto.master/home/nfs/etc/auto.nfs#mkdir/home/nfs#注意!此时/home/nfs内并没有其他的目录存在建立资料对应文件内的挂载资讯刚刚我们所指定的/etc/auto.nfs是自行设定的,所以这个文件是不存在的该文件的格式[本地端目录][-挂载参数][服务器所提供的目录]参数本地端目录指的就是在/etc/auto.master内指定的目录之次目录-挂载参数就是前一小节提到的rwbgsoft等等的参数;服务器所提供的目录例如
192.
168.
0.2/home/public等#vi/etc/auto.nfspublic-rwbgsoftrsize=8192wsize=
8192192.
168.
0.2/home/publictesting-rwbgsoftrsize=8192wsize=
8192192.
168.
0.2/home/testtemp-rwbgsoftrsize=8192wsize=
8192192.
168.
0.2/tmp#参数部分,只要最前面加个-符号即可!这样就可以建立对应了!要注意的是,那些/home/nfs/public是不需要事先建立的public目录是由automount动态地创建的,它不应该在客户机器上实际存在实际运作与观察配置文件配置好后,启动autofs#/etc/init.d/autofsstart假设你目前并没有挂载任何来自
192.
168.
0.2这个NFS服务器的目录,让我们实际来看看,如果我要进入/home/nfs/public时,文件系统会如何变化呢#mount;df#你不会看到任何跟
192.
168.
0.2这个主机有关的NFS挂载信息#cd/home/nfs/public#mount;df
192.
168.
0.2/home/publicon/home/nfs/publictypenfsrwbgsoftrsize=8192wsize=8192addr=
140.
116.
44.179#上面的输出是同一行Filesystem1K-blocksUsedAvailableUse%Mountedon
192.
168.
0.2/home/public100804882144288742413623%/home/nfs/public#文件的挂载也出现没错!#pwd/home/nfs/public#应当注意public目录是由automount动态地创建的,它不应该在客户机器上实际存在
4.4无法挂载的原因分析使用者或客户端身份权限不符以上面的例子来说明,我的/home/test只能提供
192.
168.
0.0/24这个网域,所以如果我在
192.
168.
0.2这部服务器中,以localhost
127.
0.
0.1来挂载时,就会无法挂载上,这个权限概念没问题吧!那么您可以试试看#mount-tnfslocalhost/home/test/home/nfsmount localhost/home/testfailedreasongivenbyserver Permissiondenied服务器或客户端某些服务未启动如果您发现您的mount的讯息是这样,说明未启动portmap或服务器nfs这个服务#mount-tnfslocalhost/home/test/home/nfsmount RPCPortmapperfailure-RPC Unabletoreceive#mount-tnfslocalhost/home/test/home/nfsmount RPCProgramnotregistered被防火墙阻挡这个原因很多人都忽视了,在有严格要求的网络环境中,我们一般会关闭linux上的所有端口,当需要使用哪个端口的时候才会去打开而NFS默认是使用111端口,所以我们先要检测是否打开了这个端口,另外也要检查TCP_Wrappers的设定
5、案例演练假设环境假设我的Linux主机为
192.
168.
0.100这一台;预计将/tmp以可读写,并且不限制使用者身份的方式分享给所有
192.
168.
0.0/24这个网域中的所有Linux工作站;预计开放/home/nfs这个目录,使用的属性为唯读,可提供除了网域内的工作站外,向外亦提供资料内容;预计开放/home/upload做为
192.
168.
0.0/24这个网域的资料上传目录,其中,这个/home/upload的使用者及所属群组为nfs-upload这个名字,他的UID与GID均为210;预计将/home/andy这个目录仅分享给
192.
168.
0.50这部Linux主机,以提供该主机上面andy这个使用者来使用,也就是说,andy在
192.
168.
0.50及
192.
168.
0.100均有帐号,且帐号均为andy,所以预计开放/home/andy给andy使用他的家目录啦!实地演练
1、首先,就是要建立/etc/exports这个文件的内容,您可以这样写#vi/etc/exports/tmp
192.
168.
0.*rwno_root_squash/home/nfs
192.
168.
0.*ro*roall_squash/home/upload
192.
168.
0.*rwall_squashanonuid=210anongid=210/home/andy
192.
168.
0.50rw
2、再来,就是要建立每个对应的目录的实际Linux权限a./tmp#ll-d/tmpdrwxrwxrwt5rootroot20480Sep222252/tmpb./home/nfs#mkdir-p/home/nfs#chmod755-R/home/nfs#修改较为严格的文件权限将目录与文件设定成只读!不能写入的状态,会更保险一点!c./home/upload#groupadd-g210nfs-upload#useradd-g210-u210-Mnfs-upload#先建立对应的帐号与群组名称及UID#mkdir-p/home/upload#chown-Rnfs-upload nfs-upload/home/upload#修改拥有者!如此,则使用者与目录的权限都设定妥当!
3、启动portmap与nfs服务#/etc/init.d/portmapstart#/etc/init.d/nfsstart#/etc/init.d/nfslockstart
4、在
192.
168.
0.50这部机器上面测试一下a.确认远端服务器的可用目录#/etc/init.d/portmapstart#/etc/init.d/nfslockstart#showmount-e
192.
168.
0.100Exportlistfor
192.
168.
0.100/tmp
192.
168.
0.*/home/nfseveryone/home/upload
192.
168.
0.*/home/andy
192.
168.
0.50b.建立挂载点#mkdir-p/home/zzz/tmp#mkdir-p/home/zzz/nfs#mkdir-p/home/zzz/upload#mkdir-p/home/zzz/andyc.实际挂载#mount-tnfs
192.
168.
0.100/tmp/home/zzz/tmp#mount-tnfs
192.
168.
0.100/home/nfs/home/zzz/nfs#mount-tnfs
192.
168.
0.100/home/upload/home/zzz/upload#mount-tnfs
192.
168.
0.100/home/andy/home/zzz/andy整个步骤大致上就是这样特别声明1资料来源于互联网,版权归属原作者2资料内容属于网络意见,与本账号立场无关3如有侵权,请告知,立即删除。