13NFS 服务器.docx
《13NFS 服务器.docx》由会员分享,可在线阅读,更多相关《13NFS 服务器.docx(39页珍藏版)》请在冰点文库上搜索。
13NFS服务器
NFS服务器1
本章的行前准备工作1
NFS的由来与其功能1
什么是NFS(NetworkFileSystem)1
什么是RPC(RemoteProcedureCall)2
NFS启动的RPCdaemons4
NFS的档案存取权限5
NFSServer端的设定6
所需要的套件6
portmap7
nfs-utils7
NFS的套件结构7
/etc/exports设定文件的语法与参数8
启动NFS12
NFS的联机观察15
NFS的安全性16
利用iptables做大范围联机的限制:
17
利用TCPWrappers限制17
使用/etc/exports设定更安全的权限18
更安全的partition规划:
18
NFS服务器关机前的注意事项:
18
NFS客户端的设定19
远程NFS服务器的挂载19
客户端可处理的挂载参数与开机挂载20
关于NFS特殊的挂载参数21
将NFS开机即挂载23
无法挂载的原因分析23
自动挂载autofs的使用24
建立主要设定档/etc/auto.master25
建立数据对应文件内的挂载信息25
实际运作与观察26
案例演练27
重点回顾29
课后练习30
NFS服务器
NFS为NetworkFileSystem的简称,最早之前是由Sun这家公司所发展出来的,他的目的就是想让不同的机器、不同的操作系统可以彼此分享个别的档案啦!
目前在UnixLike当中用来做为fileserver是相当不错的一个方案喔!
基本上,UnixLike主机连接到另一部UnixLike主机来分享彼此的档案时,使用NFS要比SAMBA这个服务器快速且方便的多了!
此外,NFS的设定真的很简单,几乎只要记得启动RemoteProcedureCall这个咚咚(RPC,就是portmap这个套件啦!
)就一定可以架设的起来!
真是不错啊!
不过,如果要达成Windows与Linux之间的沟通,那么还是以SAMBA比较容易啊!
无论如何,NFS还是可以做为小公司或学校单位内部UnixLike机器共享file的一个Server喔!
本章的行前准备工作
NFS这个藉由网络分享档案系统的服务在架设的时候是很简单的,不过,他最大的问题在于『权限』方面的概念!
因为在客户端与服务器端可能必须要具备相同的账号才能够存取某些目录或档案。
另外,NFS的启动需要透过所谓的远程过程调用(RPC),也就是说,我们并不是只要启动NFS就好了,还需要启动RPC这个服务才行啊!
因此,你必须要拥有的基础知识有:
*必须要了解档案系统的权限概念,可以参考基础篇的Linux档案属性与目录配置
*了解网络基础,防火墙与关闭SELinux模块等等。
NFS的由来与其功能
在开始进行NFS的设定之前,我们得先来了解一下,什么是NFS呢?
不然讲了一堆也没有用,对吧!
^_^!
底下就来谈一谈什么是NFS,且NFS的启动还需要什么样的协议啊!
什么是NFS(NetworkFileSystem)
NFS就是NetworkFileSystem的缩写,最早之前是由Sun这家公司所发展出来的。
他最大的功能就是可以透过网络,让不同的机器、不同的操作系统、可以彼此分享个别的档案(sharefiles)。
所以,您也可以简单的将他看做是一个档案服务器(fileserver)呢!
这个NFS服务器可以让您的PC来将网络远程的NFS主机分享的目录,挂载到本地端的机器当中,在本地端的机器看起来,那个远程主机的目录就好像是自己的一个磁盘分割槽一样(partition)!
使用上面相当的便利!
图一、NFS主机分享目录与Client挂载示意图
就如同上面的图示一般,当我们的NFSServer设定好了分享出来的/home/sharefile这个目录后,其它的NFSClient端就可以将这个目录挂载到自己系统上面的某个挂载点(挂载点可以自订),例如前面图示中的NFSclient1与NFSclient2挂载的目录就不相同。
我只要在NFSclient1系统中进入/home/data/sharefile内,就可以看到NFSServer系统内的/home/sharefile目录下的所有数据了(当然,权限要足够啊!
^_^)!
这个/home/data/sharefile就好像NFSclient1自己机器里面的一个partition喔!
只要权限对了,那么您可以使用cp,cd,mv,rm...等等磁盘或档案相关的指令!
真是他X的方便吶!
好的,既然NFS是透过网络来进行数据的传输,那么经由socketpair的概念你会知道NFS应该会使用一些port吧?
那么NFS使用哪个port来进行传输呢?
答案是....不知道!
@_@!
因为NFS用来传输的port是随机选择小于1024以下的埠口来使用的。
咦!
那客户端怎么知道你服务器端使用那个port啊?
此时就得要远程过程调用(RemoteProcedureCall,RPC)的协议来辅助啦!
底下我们就来谈谈什么是RPC?
什么是RPC(RemoteProcedureCall)
因为NFS支持的功能相当的多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些port来传输数据,因此,NFS的功能所对应的port才没有固定住,而是采用随机取用一些未被使用的小于1024的埠口来作为传输之用。
但如此一来又造成客户端想要连上服务器时的困扰,因为客户端得要知道服务器端的相关埠口才能够联机吧!
此时我们就得需要远程过程调用(RPC)的服务啦!
RPC最主要的功能就是在指定每个NFS功能所对应的portnumber,并且回报给客户端,让客户端可以连结到正确的埠口上去。
那RPC又是如何知道每个NFS的埠口呢?
这是因为当服务器在启动NFS时会随机取用数个埠口,并主动的向RPC注册,因此RPC可以知道每个端口口对应的NFS功能,然后RPC又是固定使用port111来监听客户端的需求并回报客户端正确的埠口,所以当然可以让NFS的启动更为轻松愉快了!
Tips:
所以你要注意,要启动NFS之前,RPC就要先启动了,否则NFS会无法向RPC注册。
另外,RPC若重新启动时,原本注册的数据会不见,因此RPC重新启动后,他管理的所有程序都需要重新启动以重新向RPC注册。
图二、NFS与RPC服务及档案系统操作的相关性
如上图所示,当客户端有NFS档案存取需求时,他会如何向服务器端要求数据呢?
1.客户端会向服务器端的RPC(port111)发出NFS档案存取功能的询问要求;
2.服务器端找到对应的已注册的NFSdaemon埠口后,会回报给客户端;
3.客户端了解正确的埠口后,就可以直接与NFSdaemon来联机。
由于NFS的各项功能都必须要向RPC来注册,如此一来RPC才能了解NFS这个服务的各项功能之portnumber,PID,NFS在主机所监听的IP等等,而客户端才能够透过RPC的询问找到正确对应的埠口。
也就是说,NFS必须要有RPC存在时才能成功的提供服务,因此我们称NFS为RPCserver的一种。
事实上,有很多这样的服务器都是向RPC注册的,举例来说,NIS(NetworkInformationService)也是RPCserver的一种呢。
此外,由图二你也会知道,不论是客户端还是服务器端,要使用NFS时,两者都需要启动RPC才行喔!
更多的NFS相关协议信息你可以参考底下网页:
*http:
//www.faqs.org/rfcs/rfc1094.html
*http:
//www.tldp.org/HOWTO/NFS-HOWTO/index.html
NFS启动的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与owner,group那几个权限啦)的认证程序!
他会去读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同样的,这个功能必须要在服务器端与客户端都启动才会生效。
NFS的档案存取权限
不知道你有没有想过这个问题,在图一的环境下,假如我在NFSclient1上面以dmtsai这个使用者身份想要去存取/home/data/sharefile/这个来自NFSserver所提供的档案系统时,请问NFSserver所提供的档案系统会让我以什么身份去存取?
是dmtsai还是?
为什么会这么问呢?
这是因为NFS本身的服务并没有进行身份登入的识别,所以说,当你在客户端以dmtsai的身份想要存取服务器端的档案系统时,服务器端会以客户端的使用者UID与GID等身份来尝试读取服务器端的档案系统。
这时有个有趣的问题就产生啦!
那就是如果客户端与服务器端的使用者身份并不一致怎么办?
我们以底下这个图示来说明一下好了:
图三、NFS的服务器端与客户端的使用者身份确认机制
当我以dmtsai这个一般身份使用者要去存取来自服务器端的档案时,你要先注意到的是:
档案系统的inode所记录的属性为UID,GID而非账号与群组名。
那一般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,我们的CentOS则取名为nfsnobody。
*如果使用者身份是root时
有个比较特殊的使用者,那就是每个Linux主机都有的UID为0的root。
想一想,如果客户端可以用root的身份去存取服务器端的档案系统时,那服务器端的数据哪有什么保护性?
所以在预设的情况下,root的身份会被主动的压缩成为匿名者。
总之,客户端使用者能做的事情是与UID及其GID有关的,那当客户端与服务器端的UID及账号的对应不一致时,可能就会造成档案系统使用上的困扰,这个就是NFS档案系统在使用上面的一个很重要的地方!
而在了解使用者账号与UID及档案系统的关系之后,要实际在客户端以NFS取用服务器端的档案系统时,你还得需要具有:
*NFS服务器有开放可写入的权限(与/etc/exports设定有关);
*实际的档案权限具有可写入(w)的权限。
当你满足了
(1)使用者账号,亦即UID的相关身份;
(2)NFS服务器允许有写入的权限;(3)档案系统确实具有w的权限时,你才具有该档案的可写入权限喔!
尤其是身份(UID)确认的环节部分,最容易搞错啦!
也因为如此,所以NFS通常需要与NIS这一个可以确认客户端与服务器端身份一致的服务搭配使用,以避免身份的错乱啊!
^_^
NFSServer端的设定
既然要使用NFS的话,就得要安装NFS所需要的套件了!
底下让我们查询一下系统有无安装所需要的套件,NFS套件的架构以及如何设定NFS主机吧!
^_^
所需要的套件
以CentOS4.x为例的话,要设定好NFS服务器我们必须要有两个套件才行,分别是:
*NFS主程序:
nfs-utils
*RPC主程序:
portmap
portmap
就如同刚刚提的到,我们的NFS其实可以被视为一个RPC程序,而要启动任何一个RPC程序之前,我们都需要做好port的对应(mapping)的工作才行,这个工作其实就是『portmap』这个服务所负责的!
也就是说,在启动任何一个RPCserver之前,我们都需要启动portmap才行!
nfs-utils
就是提供rpc.nfsd及rpc.mountd这两个NFSdaemons与其它相关documents与说明文件、执行档等的套件!
这个就是NFS的主要套件啦!
一定要有喔!
好了,知道我们需要这两个套件之后,现在干嘛?
赶快去您的系统先用RPM看一下有没有这两个套件啦!
没有的话赶快用RPM或yum去安装喔!
不然就玩不下去了!
例题:
请问我的主机是以RPM为套件管理的Linuxdistribution,例如RedHat,CentOS与SuSE等版本,那么我要如何知道我的主机里面是否已经安装了portmap与nfs相关的套件呢?
答:
简单的使用rpm-qa|grepnfs与rpm-qa|grepportmap即可知道啦!
如果没有安装的话,在CentOS内可以使用『yuminstallnfs-utils』来安装!
NFS的套件结构
NFS这个咚咚真的是很简单,上面我们提到的NFS套件中,设定档只有一个,执行档也不多,记录文件也三三两两而已吶!
赶紧先来看一看吧!
^_^
*/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主机的相关客户端数据。
就说不难吧!
主要就是这几个啰!
/etc/exports设定文件的语法与参数
在开始NFS服务器的设定之前,您必须要了解的是,NFS会直接使用到核心功能,所以你的核心必须要有支持NFS才行。
万一如果你的核心版本小于2.2版,或者重新自行编译过核心的话,那么就得要很注意啦!
因为你可能会忘记选择NFS的核心支持啊!
还好,我们CentOS或者是其它版本的Linux,预设核心通常是支持NFS功能的,所以你只要确认你的核心版本是目前新的2.6.x版,并且使用你的distribution所提供的核心,那应该就不会有问题啦!
至于NFS服务器的架设实在很简单,你只要编辑好主要设定档/etc/exports之后,先启动portmap,然后再启动nfs,你的NFS就成功了!
不过这样的设定能否对客户端生效?
那就得要考虑你权限方面的设定能力了。
废话少说,我们就直接来看看那个/etc/exports应该如何设定吧!
某些distributions并不会主动提供/etc/exports档案,所以请您自行手动建立他吧。
[root@linux~]#vi/etc/exports
/tmp192.168.1.0/24(ro)localhost(rw)*.ev.ncku.edu.tw(ro,sync)
#[分享目录][第一部主机(权限)][可用主机名][可用万用字符]
您看看,这个设定档有够简单吧!
每一行最前面是要分享出来的目录,注意喔!
是以目录为单位啊!
然后这个目录可以依照不同的权限分享给不同的主机,像鸟哥上面的例子说明是:
要将/tmp分别分享给三个不同的主机或网域的意思。
记得主机后面以小括号()设计权限参数,若权限参数不止一个时,则以逗号(,)分开。
且主机名与小括号是连在一起的喔!
在这个档案内也可以利用#来批注呢。
至于主机名称的设定主要有几个方式:
*可以使用完整的IP或者是网域,例如192.168.1.10或192.168.1.0/24,或192.168.1.0/255.255.255.0都可以接受!
*可以使用主机名称,这个主机名称要在/etc/hosts内或使用DNS可以被找到才行啊!
重点是可找到IP就是了。
如果是主机名称的话,那么他可以支持万用字符,例如*或?
均可接受。
至于权限方面(就是小括号内的参数)常见的参数则有:
*rw:
read-write,可擦写的权限;
*ro:
read-only,只读的权限;
*sync:
数据同步写入到内存与硬盘当中;
*async:
数据会先暂存于内存当中,而非直接写入硬盘!
*no_root_squash:
登入NFS主机使用分享目录的使用者,如果是root的话,那么对于这个分享的目录来说,他就具有root的权限!
这个项目『极不安全』,不建议使用!
*root_squash:
在登入NFS主机使用分享之目录的使用者如果是root时,那么这个使用者的权限将被压缩成为匿名使用者,通常他的UID与GID都会变成nobody(nfsnobody)那个系统账号的身份;
*all_squash:
不论登入NFS的使用者身份为何,他的身份都会被压缩成为匿名使用者,通常也就是nobody(nfsnobody)啦!
*anonuid:
anon意指anonymous(匿名者)前面关于*_squash提到的匿名使用者的UID设定值,通常为nobody(nfsnobody),但是您可以自行设定这个UID的值!
当然,这个UID必需要存在于您的/etc/passwd当中!
*anongid:
同anonuid,但是变成groupID就是了!
这是几个比较常见的权限参数,如果你有兴趣玩其它的参数时,请自行manexports可以发现很多有趣的数据。
接下来我们利用上述的几个参数来实际思考一下几个有趣的小习题:
思考一:
让root保有root的权限
我想将/tmp分享出去给大家使用,由于这个目录本来就是大家都可以读写的,因此想让所有的人都可以存取。
此外,我要让root写入的档案还是具有root的权限,那如何设计设定档?
[root@linux~]#vi/etc/exports
#任何人都可以用我的/tmp,用万用字符来处理主机名称,重点在no_root_squash
/tmp*(rw,no_root_squash)
参考前面的主机名称设定说明,我们可以利用万用字符的。
这表示无论来自哪里都可以使用我的/tmp这个目录。
再次提醒,『*(rw,no_root_squash)』这一串设定值中间是没有空格符的喔!
而/tmp与*(rw,no_root_squash)则是有空格符来隔开的!
特别注意到那个no_root_squash的功能!
在这个例子中,如果你是客户端,而且您是以root的身份登入您的Linux主机,那么当您mount上我这部主机的/tmp之后,您在该mount的目录当中,将具有『root的权限!
』
思考二:
同一目录针对不同范围开放不同权