安哥网络 发表于 2014-1-7 09:31:04

NFS实现Linux网络磁盘挂载-it论坛-计算机论坛

NFS实现Linux网络磁盘挂载-it论坛-计算机论坛
什么是 NFS ( Network FileSystem )
 
NFS 就是 Network FileSystem 的缩写,最早之前是由 Sun这家公司所发展出来的。他最大的功能就是可以透过网络,让不同的机器、不同的操作系统、可以彼此分享个别的档案( share file ),所以,您也可以简单的将他看做是一个 file server 呢!这个 NFS Server 可以让您的PC 来将网络远程的 NFS主机分享的目录,挂载到本地端的机器当中,所以,在本地端的机器看起来,那个远程主机的目录就好像是自己的一个磁盘分割槽一样 (partition )!使用上面相当的便利!

就如同上面的图示一般,当我们的 NFS Server 设定好了分享出来的 /home/sharefile 这个目录后,其它的Client 端就可以将这个目录挂载到自己系统上面的某个挂载点(挂载点可以自订!),例如前面图示中的 PersonalComputer 1 与 Personal Computer 2 挂载的目录就不相同。我只要在 Personal Computer 1系统中进入 /home/data/sharefile 内,就可以看到 NFS Server 系统内的 /home/sharefile目录下的所有数据了 。这个 /home/data/sharefile 就好像我自己 Personal Computer 1 里面的一个partition 喔!只要权限对了,那么您可以使用 cp, cd, mv, rm... 等等磁盘或档案相关的指令
 
那 么您或许会问啦:『咦!那么这个 NFS 是藉由什么样的协议来进行传输的呢?』虽然 NFS 有属于自己的协议与使用的 portnumber ,但是在数据传送或者其它相关讯息传递的时候, NFS 使用的则是一个称为远程过程调用( Remote ProcedureCall, RPC )的协定来协助 NFS 本身的运作!
 
--------------------------------------------------------------------------------
什么是 RPC ( Remote Procedure Call )
 
那 么什么是 RPC 呢?由字面上的意思来看『远程过程调用』不就是一些程序( Program)在执行远程联机时,需要用到的程序吗?呵呵!是这样没错啦!简单的来说,当我们在使用某些服务来进行远程联机的时候,有些信息,例如主机的IP、服务的 port number、与对应到的服务之 PID 等等,都需要管理与对应!这些管理 port的对应与服务相关性的工作,就是这个 Remote Procedure Call, RPC 的任务了!
 
好了,如果我们将 NFS 与 RPC 两者的相关性连接起来的话,那么您应该就可以知道: NFS本身的服务并没有提供数据传递的协议,但是 NFS 却能让我们进行档案的分享,这其中的原因,就是 NFS使用到一些其它相关的传输协议!这也就是说, NFS 本身就是使用 RPC 的一个 program 就是了!说的更白话一点, NFS也可以视作是一个 RPC server 啦!同时要注意到的是,在某些状况中,不但跑 NFS 的 Server 需要启动 RPC的服务,连带的,要挂载 NFS partition 的 Client 机器,也需要同步启动 RPC 才行!这样 Server 端与Client 端才能藉由 RPC 的协议来进行 program port 的对应喔!
 
OK!简单的说, NFS 也可以看做是 RPC server 的一种,因为他是使用这种协议的 program 呀!那么为什么 NFS要使用 RPC 执行呢?这是因为 NFS本身可以被看做是一个档案系统,那么一来的话,您的使用者联机常常变化,而且您的档案内容啦、分享的目录啦,还有其它档案相关的信息等等,也都会常常在变化,这个时候,使用类似这种可以对应 program number 与 port number 的 RPC就相当的方便了!也就是说,NFS 主要在管理分享出来的目录,而至于数据的传递,就直接将他丢给 RPC的协定来运作就是了!

--------------------------------------------------------------------------------
NFS 启动的 RPC daemons
 
NFS server 总共需要启用到至少两个 daemons ,一个管理 Client 是否可以登入的问题,另一个管理登入主机后的Client 能够使用的档案权限!如果您还要管理 quota 的话,那么 NFS 还会自动的再加载其它相关的 RPC program呢!我们这里以最简单的方式来设定 NFS,说明如下:
rpc.nfsd:这个 daemon 主要的功能就是在管理 Client 是否能够登入主机的权限啦,其中还包含这个登入者的 ID的判别喔!
rpc.mountd: 这个 daemon 主要的功能,则是在管理 NFS 的档案系统哩!当 Client 端顺利的通过rpc.nfsd 而登入主机之后,在他可以使用 NFS server 提供的档案之前,还会经过档案使用权限 ( 就是那个-rwxrwxrwx 与 owner, group 那几个权限啦 ) 的认证程序!他会去读 NFS 的设定档/etc/exports来比对 Client 的权限,当通过这一关之后, Client 就可以取得使用 NFS档案的权限啦!(注:这个也是我们用来管理 NFS 分享之目录的使用权限与安全设定的地方哩!)
--------------------------------------------------------------------------------
需要的套件
要启动 NFS 我们必须要有两个套件才行,分别是:
nfs-utils 与 nfs-utils-clients (有时后仅有一个)
portmap
portmap:
就 如同刚刚提的到,我们的 NFS 其实可以被视为一个 RPC server program,而要启动任何一个 RPC serverprogram 之前,我们都需要做好 port 的对应 ( mapping ) 的工作才行,这个工作其实就是『 portmap』这个服务所负责的!也就是说,在启动任何一个 RPC server 之前,我们都需要启动 portmap 才行呢!那么这个portmap 到底在干嘛呢?就如同这个服务的名称,哈哈!就是作 port 的 mapping 啊!举个例子来说:当 Client端尝试来使用 RPC server 所提供的服务时,由于 Client 需要取得一个可以连接的 port 才能够使用 RPCserver 所提供的服务,因此, Client 首先就会去跟 portmap 讲『喂!可不可以通知一下,给我个 portnumber ,好让我可以跟 RPC 联络吧!』这个时候 portmap 就自动的将自己管理的 port mapping 告知Client ,好让他可以连接上来 server 呢!所以啰:『启动 NFS 之前,请先启动 portmap !』
nfs-utils:
就是提供 rpc.nfsd 及 rpc.mountd 这两个 NFS daemons 与其它相关 documents与说明文件、执行档等的套件!这个就是 NFS 的主要套件啦!一定要有喔!
好了,知道我们需要这两个套件之后,现在干嘛?!赶快去您的系统先用 RPM 看一下有没有这两个套件啦!没有的话赶快用 RPM去安装喔!不然就玩不下去了!
  例题:
请问我的主机是以 RPM 为套件管理的 Linux distribution ,例如 Red Hat, Mandrake 与OpenLinux 等版本,那么我要如何知道我的主机里面是否已经安装了 portmap 与 nfs 相关的套件呢?
答:
简单的使用 rpm -qa | grep nfs 与 rpm -qa | grep portmap 即可知道啦!

--------------------------------------------------------------------------------
Server 端的设定:
--------------------------------------------------------------------------------
NFS 的套件结构
 
NFS 这个咚咚真的是很简单,上面我们提到的 NFS套件中,设定档只有一个,执行文件也不多,记录文件也三三两两而已吶!赶紧先来看一看吧! ^_^
 
/etc/exports:这个档案就是 NFS 的主要设定档了!不过,系统并没有默认值,所以这个档案『不一定会存在』,所以您必须要使用vi 主动的建立起这个档案喔!我们等一下要谈的设定也仅只是这个档案而已吶!
 
/usr /sbin/exportfs:这个是维护 NFS 分享资源的指令,我们可以利用这个指令重新分享 /etc/exports变更的目录资源、将 NFS Server 分享的目录卸载或重新分享等等,这个指令是 NFS 系统里面相当重要的一个喔。
 
/usr/sbin/showmount:这是另一个重要的 NFS 指令。exportfs 是用在 NFS Server 端,而showmount 则主要用在 Client 端。这个 showmount 可以用来察看 NFS 分享出来的目录资源喔!
 
/var/lib/nfs/xtab:这个档案则是主要的 NFS 的纪录文件咯!当我们的 NFS 分享出目录资源后,到底有哪些Client 端曾经连接上我们的 NFS 主机呢?呵呵!就是看这个档案的内容即可啰

--------------------------------------------------------------------------------
设定流程(/etc/exports)

NFS 的整个流程:
 
首先,需要确认一下您的 Linux 主机是否可以支持 NFS这项服务,然后再设定一下使用者的来源IP或主机名称以及分享出去的目录的权限,之后呢,启动 NFS即可将刚刚设定的目录给他分享出去了!

那 么在 Client 端怎么使用这个分享出来的目录?就是先以 showmount 这支程序检查 Linux Server是否有可以使用的 NFS 目录,如果有的话,就将他 mount 在本机上面,如果可以 mount ,那么就可以使用 NFS主机提供的资源了!
 
哈哈!果然很简单吧!所以底下我们就来一个一个步骤的说明一下 NFS 怎么设定啰:
 
系统需求
/etc/exports
关于权限问题
启动服务 portmap, nfsd
exportfs
检验目录 /var/lib/nfs/xtab
showmount
观察启动的 port number
 
OK!每个咚咚的细部项目就来谈一谈吧:
系统需求:
除了刚刚我们已经提到的两个套件『 portmap 与 nfs-utils 』必需要存在之外;
您的核心版本最好能够高于 2.2.xx 以后比较好!
此外,如果重新编译过核心,您必需『一定要选择』NFS 支援才行!
/etc/exports:
好了,已经确认『一切OK』之后,我们就真的要来玩弄 NFS 啦!这个东西真的很简单的啦,只要一个档案就可以搞定了!那就是编辑/etc/exports这个档案,请注意,这个档案如果不存在,请自行建立!并且,档名不要写错了喔!这个档案的内容很简单啦,我们列出他的规则:
[欲分享的目录][主机名称1或IP1(参数1,参数2)][主机名称2或IP2(参数3,参数4)]
 
上面的规则是这样的:[欲分享的目录]主要是要分享给[主机名称1]及[主机名称2],但是提供给这两者的权限并不一样,其中,给主机名称1的权限是参数1与参数2,至于给主机名称2的 Client 权限则是参数3与参数4。好了,那么那个『权限』也就是『参数』主要有哪些呢?
rw:可擦写的权限;
ro:只读的权限;
no_root_squash:登入 NFS 主机使用分享目录的使用者,如果是 root 的话,那么对于这个分享的目录来说,他就具有root 的权限!这个项目『极不安全』,不建议使用!
root_squash:在登入 NFS 主机使用分享之目录的使用者如果是 root时,那么这个使用者的权限将被压缩成为匿名使用者,通常他的 UID 与 GID 都会变成 nobody 那个系统账号的身份;
all_squash:不论登入 NFS 的使用者身份为何,他的身份都会被压缩成为匿名使用者,通常也就是 nobody 啦!
anonuid:前面关于 *_squash 提到的匿名使用者的 UID 设定值,通常为 nobody,但是您可以自行设定这个 UID的值!当然,这个 UID 必需要存在于您的 /etc/passwd 当中!
anongid:同 anonuid ,但是变成 group ID 就是了!
sync:数据同步写入到内存与硬盘当中;
async:数据会先暂存于内存当中,而非直接写入硬盘!
大致的参数就是这几样啰!那么我们来假设几个例子好了:
思 考一:我要将 /tmp 分享出去给大家使用,由于这个目录本来就是大家都可以读写的,因此我要让所有的人都可以存取。此外,我要让root 写入的档案还是具有 root 的权限!那么您可以这么写喔!
/tmp*(rw,no_root_squash)
这 样一来,无论来自哪里(*万用字符!表示万事OK!)都可以使用我的 /tmp 这个目录。请注意,那个*(rw,no_root_squash) 中间没有空格符喔!而 /tmp 与 *(rw,no_root_squash)则是有空格符来隔开的!特别注意到那个 no_root_squash 的功能!在这个例子中,如果您是 client 端,而且您是以root 的身份登入您的 Linux 主机,那么当您 mount 上我这部主机的 /tmp 之后,您在该 mount的目录当中,将具有『root 的权限!』
 
思考二:我要将一个公共的目录 /home/public 公开出去,但是只有限定我的局域网络内 192.168.0.0/24这个网域可以读写,其它人则只能读取
/tmp     *(rw,no_root_squash)
/home/public 192.168.0.*(rw)   *(ro)
/home/public 192.168.0.0/24(rw) *(ro)
请 注意,在上面的例子中,倒数两行的格式都可以适用!所以只要写一行即可!上面的例子说的是,当我的 IP 是在192.168.0.0/24 这个网段的时候,那么当我在 Client 端挂载了 Server 端的 /home/public后,针对这个被我挂载的目录我就具有可以读写的权限~至于如果我不是在这个网段之内,那么这个目录的数据我就仅能读取而已,亦即为只读的属性啦!
 
思考三:我要将一个私人的目录 /home/test 开放给 192.168.0.100 这个 Client端的机器来使用,那么我就必需这么写
/tmp     *(rw,no_root_squash)
/home/public 192.168.0.*(rw)   *(ro)
/home/test  192.168.0.100(rw)
这样就设定完成了!而且,只有 192.168.0.100 这部机器才能对 /home/test 这个目录进行存取喔!
 
思 考四:我要让 *.linux.org 网域的主机,登入我的 NFS 主机时,可以存取 /home/linux,但是他们存数据的时候,我希望他们的 UID 与 GID 都变成 40 这个身份的使用者
/tmp     *(rw,no_root_squash)
/home/public 192.168.0.*(rw)   *(ro)
/home/test  192.168.0.100(rw)
/home/linux  *.linux.org(rw,all_squash,anonuid=40,anongid=40)
特 别注意到那个 all_squash 与 anonuid, anongid 的功能!如此一来,当 test.linux.org登入这部 NFS 主机,并且在 /home/linux 写入档案时,该档案的所有人与所有群组,就会变成 /etc/passwd里面对应的 UID 为 40 的那个身份的使用者了!
关于权限问题:
无论任何时候,权限的问题都是需要考虑到的!让我们来看看刚刚建立的 /etc/exports 档案的内容:
/tmp     *(rw,no_root_squash)
/home/public 192.168.0.*(rw)   *(ro)
/home/test  192.168.0.100(rw)
/home/linux  *.linux.org(rw,all_squash,anonuid=40,anongid=40)
假设我在 192.168.0.100 登入这部 NFS ( IP 假设为 192.168.0.2 ) 主机,并且我在192.168.0.100 的账号为 test 这个身份,同时,在这部 NFS 上面也有 test这个账号,果真如此的话,那么:
由于 192.168.0.2 这部 NFS 主机的 /tmp 权限为 -rwxrwxrwt ,所以我 ( test 在192.168.0.100 上面 ) 在 /tmp 底下具有存取的权限,并且写入的档案所有人为 test ;
在 /home/public 当中,由于我有读写的权限,所以如果在 /home/public 这个目录的权限对于 test有开放写入的话,那么我就可以读写,并且我写入的档案所有人是 test 。但是万一 /home/public 对于 test这个使用者并没有开放可以写入的权限时,那么我还是没有办法写入档案喔!这点请特别留意!
在 /home/test 当中,我的权限与 /home/public 相同的状态!还需要 NFS 主机的 /home/test 对于test 有开放权限;
在 /home/linux 当中就比较麻烦!因为不论您是何种 user ,您的身份一定会被变成 UID=40这个账号!所以,这个目录就必需要针对 UID = 40 的那个账号名称,修改他的权限才行!
 
那么假如我在 192.168.0.100 的身份为 test2 ,但是 192.168.0.2 这部 NFS 主机却没有 test2这个账号时,情况会变成怎样呢?
我在 /tmp 底下还是可以写入,但是写入的档案所有人变成 nobody 了;
我在 /home/public 里面是否可以写入,还需要视 /home/public 的权限而定,不过,反正我的身份就被变成nobody 了就是;
/home/test 的观点与 /home/public 相同!
/home/linux 底下,我的身份就被变成 UID = 40 那个使用者就是了!
 
那么假如我在 192.168.0.100 的身份为 root 呢? root这个账号每个系统都会有呀!呵呵!权限变成怎样呢?
我在 /tmp 里面可以写入,并且由于 no_root_squash 的参数,改变了预设的 root_squash 设定值,所以在/tmp 写入的档案所有人为 root 喔!
我 在 /home/public 底下的身份还是被压缩成为 nobody 了!因为预设属性里面都具有 root_squash呢!所以,如果 /home/public 有针对 nobody 开放写入权限时,那么我就可以写入,但是档案所有人变成 nobody就是了!
/home/test 与 /home/public 相同;
/home/linux 的情况中,我 root 的身份也被压缩成为 UID = 40 的那个使用者了!
 
这样的权限讲解之后,您可以了解了吗?这里是最重要的地方,如果这一关通过了,底下的咚咚就没有问题啦! ^_^
启动服务 portmap, nfsd
好 了,设定OK也没有权限的问题之后 ,再来自然就是启动他啰!如何启动呢?简单的很,直接给他OK下去! # /etc/rc.d/init.d/portmap start<==启动 portmap!
# /etc/rc.d/init.d/nfs start   <==启动NFS
那 个 portmap 根本就不需要设定!只要直接启动他就可以啦!启动之后,会出现一个 port 111 的 sunrpc的服务!那就是 portmap 啦!至于 nfs 则会启动至少两个以上的 daemon 出现!然后就开始在监听 Client端的需求啦!启动之后,请赶快到 /var/log/messages 里面看看有没有被正确的启动呢? #vi /var/log/messages
Nov 16 15:04:45 test portmap: portmap startup succeeded
Nov 16 15:04:53 test nfs: Starting NFS services: succeeded
Nov 16 15:04:54 test nfs: rpc.rquotad startup succeeded
Nov 16 15:04:54 test nfs: rpc.mountd startup succeeded
Nov 16 15:04:54 test nfs: rpc.nfsd startup succeeded
要正常的出现上面的字样之后,才算是正确的启动喔!
exportfs:
好 了,那么如果我们修改了 /etc/exports 这个档案之后,是否需要重新启动 nfs 呢?呵呵,并不需要,只要使用exportfs 重新扫瞄一次 /etc/exports 这的档案,并且重新将设定加载即可!因此,就要来了解一下 exportfs的用法了: 语法:
# exportfs [-aruv]
参数说明:
-a :全部挂载(或卸载) /etc/exports 档案内的设定
-r :重新挂载 /etc/exports 里面的设定,此外,亦同步更新 /etc/exports
   及 /var/lib/nfs/xtab 的内容!
-u :卸载某一目录
-v :在 export 的时候,将分享的目录显示到屏幕上!
范例:
# exportfs -rv <==全部重新 export 一次!
exporting 192.168.0.100:/home/test
exporting 192.168.0.*:/home/public
exporting *.linux.org:/home/linux
exporting *:/home/public
exporting *:/tmp
reexporting 192.168.0.100:/home/test to kernel
# exportfs -au <==全部都卸载了!

要熟悉一下这个指令的用法喔!这样一来,就可以直接重新 export 我们的记录在 /etc/exports 的目录数据啰!
检验目录 /var/lib/nfs/xtab
好了,当您顺利的将您的目录都分享出去之后,您怎么知道每个目录的分享权限呢?不要忘记了,因为我们有相当多的预设属性呢!因此,这个时候就得需要检验一下您所分享的目录内容啰!看一下 /var/lib/nfs/xtab 这个档案吧!他有点像这样: # vi/var/lib/nfs/xtab
/home/test 192.168.0.100(rw,sync,wdelay,hide,secure,root_squash,
no_all_squash,subtree_check,secure_locks,mapping=identity,anonuid=-2,
anongid=-2)
看 到没?这个就是 /home/test 这个分享出去的目录的预设 NFS 里面的属性啦!这个属性状态里头有个比较奇怪的,那就是anonuid=-2 这个,怎么有 uid=-2 的呢?呵呵!其实它说的是将 65536 - 2 的值,也就是 65534 的那个UID 啦!对照一下 /etc/passwd ,您就会发现,哇!原来那就是 nobody 的啦!
showmount:
showmount 顾名思义,就是看看有没有可以 mount 的指令嘛!怎么用呢? 语法:
# showmount [-ae] hostname
-a :在屏幕上显示目前主机与 Client 所连上来的使用目录状态
-e :显示 hostname 这部机器的 /etc/exports 里面的分享目录!
范例:
# showmount -e localhost
Export list for localhost:
/tmp      *
/home/linux*.linux.org
/home/public (everyone)
/home/test   192.168.0.100
很简单吧!所以,当您要扫瞄某一部主机他提供的 NFS 分享的目录时,就使用 showmount -eIP(或hostname)即可!非常的方便吧!
观察启动的 port number:
OK!来看看我们启动 NFS 之后,到底启动了多少的 port 呢?要注意的是,我们有启动 portmap 与 nfs 两支scripts 喔! # netstat -utln
Active Internet connections (only servers)
Proto Recv-Q Send-Q LocalAddress          ForeignAddress      State
tcp       0   00.0.0.0:111            0.0.0.0:*            LISTEN <==来自 portmap
tcp       0   00.0.0.0:817            0.0.0.0:*            LISTEN <==来自 rpc.xxxx
tcp       0   00.0.0.0:1266         0.0.0.0:*            LISTEN <==来自 rpc.xxxx
udp       0   00.0.0.0:2049         0.0.0.0:*           <==就是 nfs 的 port
udp       0   00.0.0.0:814            0.0.0.0:*           <==来自 rpc.xxxx
udp       0   00.0.0.0:1327         0.0.0.0:*           <==来自 rpc.xxxx
udp       0   00.0.0.0:111            0.0.0.0:*           <==来自portmap
注 意看到上面喔!总共产生了好多的 port 喔!真是可怕!先注意到 nfs 自己所开启的 port ,就是那个 2049 的port 啦!那个就是 NFS 主要产生的 port 啰。那么其它的 rpc.xxxx 的 port 又是从何而来? NFSserver 在前面我们就提过了,他是 RPC server 的一种,而 NFS 由于提供了多个 program ( 例如rpc.mountd, rpc.rquotad, rpc.nfsd... ) ,因此就需要启动多个 port 了!而且这些 port是『随机产生的』,也就是那个 port number 不会是固定的啦!每次 restart nfs 都会得到不一样的 portnumber 呢!那么 Client 端怎么知道要连接上那个 port 来呼叫需要的 program 呢?呵呵!那就是 sunrpc( port 111 ) 那个 portmap 服务所产生的 port number 的功用啦!Client 会先连接到 sunrpc那个 port 去知道应该到那个 port 去呼叫所需要的程序!所以啰, rpc.xxxx 等之类的 daemon自然就不需要有固定的 port number 啰!
OK!这样一来, Server 端的设定就 OK 啦!
 
--------------------------------------------------------------------------------
RPC server 的相关指令:
 
好了,既然我们知道这个 NFS 其实使用的是 RPC 这个咚咚,所以当然要知道 RPC 的每个 port在干什么呀!这个时候,就不能不知道 rpcinfo 这个指令了!先来谈一谈这个指令的用法吧!
  语法:
# rpcinfo [-p] hostname(orIP)
-p :显示所有的 port 与 program 的信息!
范例:
# rpcinfo -p test.linux.org
   program versproto   port
   100000   2tcp   111portmapper
   100000   2udp   111portmapper
   100011   1udp   1014 rquotad
   100011   2udp   1014 rquotad
   100011   1tcp   1017 rquotad
   100011   2tcp   1017 rquotad
   100003   2udp   2049 nfs
   100003   3udp   2049 nfs
   100021   1udp   1339 nlockmgr
   100021   3udp   1339 nlockmgr
   100021   4udp   1339 nlockmgr
   100005   1udp   1340 mountd
   100005   1tcp   1271 mountd
   100005   2udp   1340 mountd
   100005   2tcp   1271 mountd
   100005   3udp   1340 mountd
   100005   3tcp   1271 mountd
 
这样就可以知道每个 port number 所对应的 program 啰!您也就知道这个 RPC server 提供给您的program 是什么了!当然了,要让这个 rpcinfo 可以正确的动作,您的 portmap 得真的动起来才行吶!加油啰!
--------------------------------------------------------------------------------
Client 端的设定:
挂载远程主机:
好了, Server 端已经设定完毕,接着下来自然就是要使用 Client 端连接上 Server 端啰!那么连接上 Server的步骤是怎样呢?
扫瞄可以使用的 Server 目录;
在 Client 本地端建立 mount point;
使用 mount 将远程主机分享的目录挂载进来;
可能发生的问题解决(被防火墙挡掉了!?)。
OK啦!所以我们得先知道一下我们的主机里面有什么?假设我的主机名称是 test.linux.org ,那么我要知道里头有些什么藉由NFS 分享出来的目录,就给他 showmount 一下啰!
  # showmount -e test.linux.org
Export list for localhost:
/tmp      *
/home/linux*.linux.org
/home/public (everyone)
/home/test   192.168.0.100
 
然后呢?假设我要将 /home/public 挂载在我的 /home/nfs/public底下,那么我就得先有这个目录才行呀!然后再利用 mount 这个指令来挂载 /home/public这个目录!有点像这样:
  # mkdir -p /home/nfs/public <==建立public 这个目录,加 -p 可以持续增加目录
# mount -t nfs test.linux.org:/home/public/home/nfs/public
挂载的格式:
# mount -t nfs hostname(orIP):/directory/mount/point
# df
Filesystem          1K-blocks   Used Available Use% Mounted on
/dev/hda1             19049201235380   57277669% /
/dev/hdb1            976344   115212   81073613% /backup
test.linux.org:/home/public
                      19049201235376   57277669% /home/nfs/public<==这个是远程主机的容量
 
先 注意一下挂载 NFS 档案的格式范例喔!呵呵!这样就可以将数据挂载进来啦!请注意喔!以后,只要您进入您的目录/home/nfs/public 就等于到了 test.linux.org 那部远程主机的 /home/public那个目录中啰!很不错吧!那么如何将挂载的 NFS 目录卸载呢?就使用 umount 啊!
  # umount /home/nfs/public
 
可能发生的问题:
 
忘记启动 portmap :
这个最容易被忘记了!就是忘记了启动 portmap 这个服务啦!如果您发现您的 mount 的讯息是这样: # mount -t nfs localhost:/home/test /home/nfs
mount: RPC: Port mapper failure - RPC: Unable to receive
或者是: # mount -t nfs localhost:/home/test/home/nfs
mount: RPC: Program not registered
那么就赶紧将 portmap 启动吧!!并且也需要将 nfs 重新启动喔! #/etc/rc.d/init.d/portmap start
# /etc/rc.d/init.d/nfs restart
 
被防火墙挡掉了:
这 个也很容易忘记了!那就是重新设定一下您的防火墙,这包含了两部份,包括 iptables 与 TCP_Wrappers!因为我们启动了 portmap ,这个东西有两个数据需要分享出来,一个是 port 111 需要提供出去,因此您的 iptables规则当中,需要开放这个 port 喔!有点像这样的几行字要加入您的 iptables rules 当中: iptables -AINPUT -p TCP --dport 111 -j ACCEPT
iptables -A INPUT -p UDP --dport 111 -j ACCEPT
如果您已经开放了这个 port 的连接权限,却还是无法连接成功,那么应该就是 TCP_Wrappers 的问题了!检查一下您的/etc/hosts.deny 里头是否有这行: # vi /etc/hosts.deny
ALL: ALL
果真如此的话,由于 portmap 是由 portmap 这个 daemon 所启动的,所以您就必须要在/etc/hosts.allow 里面加入这一行: # vi/etc/hosts.allow
portmap: ALL
或者是将 ALL 改成您所想要让他使用 NFS的网域即可!这样说可以了解了吗?若想进一步了解一下防火墙,请参考前面章节提过的:简易防火墙建置。
--------------------------------------------------------------------------------
关机或结束时的注意事项:
需 要注意的是,由于 NFS 使用的这个 RPC 在 client端连上主机时,那么您的主机想要关机,那可就会成为『不可能的任务』!如果您的 Server 上面还有 Client在联机,那么您要关机,可能得要等到数个钟头才能够正常的关机成功!嗄!真的假的!不相信吗?不然您自个儿试试看! ^_^!所以啰,建议您的NFS Server 想要关机之前,能先『关掉 portmap 与 nfs 』这两个东西!如果无法正确的将这两个 daemons关掉,那么先以 netstat -utlp 找出 PID ,然后以 kill将他关掉先!这样才有办法正常的关机成功喔!这个请特别特别的注意呢!
--------------------------------------------------------------------------------
安全设定(被防火墙挡掉了):
好了!一些注意事项讲完了之后,再来呢?对了!又是最重要的安全设定方面的问题了!那么 NFS可以设定安全的地方有哪里呢?其实还不少呢?由外而内可以这样看:
iptables 防火墙设定;
TCP_Wrappers 防火墙设定;
/etc/exports 权限设定。
防火墙的基本概念请参考『简易防火墙建置』一文,最好能将该篇文章给他看完,否则还真难了解底下在干嘛~嗯!假设您已经看完该篇短文了,接着下来我们就得要一步一步的接着建立防火墙啰!
使用 iptables 限制大范围联机:
假 设我们的 NFS 主要是针对内部网络开放而已,而对于外部网络只有对学术网络开放,亦即是 140.0.0.0/8,那么您可以使用这样的语法: iptables -A INPUT -i eth0 -p TCP -s 192.168.0.0/24--dport 111 -j ACCEPT
iptables -A INPUT -i eth0 -p UDP -s 192.168.0.0/24 --dport 111 -jACCEPT
iptables -A INPUT -i eth0 -p TCP -s140.0.0.0/8   --dport 111 -j ACCEPT
iptables -A INPUT -i eth0 -p UDP -s140.0.0.0/8   --dport 111 -j ACCEPT
这样大致上就可以让 192.168.0.0/24 这个 C Class 的网域与 140.0.0.0/8 这个 A Class的网域到您的主机里面来,而其它的联机就视您的原本的 iptables 的状态而定喔!
 
使用 TCP_Wrappers 限制更细的范围:
事 实上,如果您不懂得如何设定 iptables 的话,那也没关系,我们可以使用 TCP_Wrappers 阿!因为要使用 NFS就必须要通过 portmap 这一关( 因为要使用 RPC 啦! ),而这个 portmap 可以藉由 TCP_Wrappers来管理!呵呵!太好了!那么就将他联机的范围限制的更小啰!我们可以在 /etc/hosts.allow 里面规定连上 NFS 主机的主机IP 与名称,假设限制中的主机只有 192.168.0.0/24 这个 C class 及 140.116.44.125这个主机,以及后面接的是 ncku.edu.tw 的网域可以连上我的 NFS 主机,那么我可以写成这样: # vi /etc/hosts.allow
portmap: 192.168.0.0/255.255.255.0
portmap: 140.116.44.125
portmap: .ncku.edu.tw
# vi /etc/hosts.deny
portmap: ALL

呵呵!这样可就设定好啰!很简单的吧!
 
使用 /etc/exports 设定更安全的权限:
这 就牵涉到您的逻辑思考了!怎么设定都没有关系,但是在『便利』与『安全』之间,要找到您的平衡点吶!善用 root_squash 及all_squash 等功能,再利用 anonuid 等等的设定来规范登入您主机的使用者身份!应该还是有办法提供一个较为安全的 NFS主机的!
Client 端挂载的问题:
基 本上,在 Client 端挂载的时候,为了担心会不小心刚 NFS 端挂进来的具有 SUID权限档案的程序执行!这个很可能会危害到系统的安全呢!因为 SUID 本来就不是很安全的嘛!所以呢,您这个 root 也可以将 NFS所分享的目录以较为安全的情况挂载进来!例如: # mount -t nfs -o nosuid,rohostname:/directory /mount/point
选择 nosuid 也是一个很不错的抉择喔!
通常我们都会约略的建议,不要启动 NFS Server,即使要启动,最好也是针对某个范围来进行目录的分享!并且,『要分使用者层级来管理』会比较好一些喔!底下我们就来实际的在您的机器上面搞一个简单的NFS server 吧!
--------------------------------------------------------------------------------
实际演练:
假设环境:
假设我的 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 使用他的家目录啦!
实地演练:
好了,那么请您先不要看底下的答案,先自己动笔或者直接在自己的机器上面动手作作看,等到得到您要的答案之后,在看底下的说明吧!
首先,就是要建立 /etc/exports 这个档案的内容啰,您可以这样写吧! # vi/etc/exports
/tmp     192.168.0.*(rw,no_root_squash)
/home/nfs  192.168.0.*(ro)*(ro,all_squash)
/home/upload 192.168.0.*(rw,all_squash,anonuid=210,anongid=210)
/home/andy  192.168.0.50(rw)
大概就是这样子吧!您可以自行测试看看!
 
再来,就是要建立每个对应的目录的实际 Linux 权限了!我们一个一个来看: 1. /tmp
# ll /
drwxrwxrwt    6root    root      4096 Nov 16 09:07 tmp
2. /home/nfs
# mkdir -p/home/nfs         <==建立所需要的目录
# chmod 755 -R/home/nfs   <==修改较为严格的档案权限
将目录与档案设定成只读!不能写入的状态,会更保险一点!
3. /home/upload
# groupadd -g 210 nfs-upload <==先建立所需要的 210 这个群组
# useradd -g 210 -u 210 -M nfs-upload<==建立需要的使用者名称
# mkdir -p/home/upload      <==建立起目录了!
# chown -R nfs-upload:nfs-upload /home/upload<==修改拥有者!
如此,则使用者与目录的权限都设定妥当啰!
4. /home/andy
# ll /home
drwx------    3andy    andy      4096 Oct 28 13:37 andy

这样子一来,权限的问题大概就可以解决啰!
 
启动 portmap 与 nfs 服务: # /etc/rc.d/init.d/portmapstart
# /etc/rc.d/init.d/nfs start
 
在 192.168.0.50 这部机器上面演练一下: 1. 确认可用目录
$ showmount -e 192.168.0.100
Export list for 192.168.0.100:
/tmp      192.168.0.*
/home/nfs   (everyone)
/home/upload 192.168.0.*
/home/andy   192.168.0.50
2. 建立挂载点:
$ mkdir -p /home/zzz/tmp
$ mkdir -p /home/zzz/nfs
$ mkdir -p /home/zzz/upload
$ mkdir -p /home/zzz/andy
3. 实际挂载:
$ su<==通常 Linux 只允许 root 来挂载!
# mount -t nfs 192.168.0.100:/tmp/home/zzz/tmp
# mount -t nfs 192.168.0.100:/home/nfs/home/zzz/nfs
# mount -t nfs 192.168.0.100:/home/upload/home/zzz/upload
# mount -t nfs 192.168.0.100:/home/andy/home/zzz/andy
# exit

整个步骤大致上就是这样吶!加油喔!
--------------------------------------------------------------------------------
重点回顾
Network FileSystem (NFS) 可以让主机之间透过网络分享彼此的档案与目录;
NFS 主要是透过 RPC 来进行 file share 的目的,所以 Server 与 Client 的 RPC一定要启动才行!
NFS 主机可以控制联机的 Client 端的登入与权限;
NFS 的设定档就是 /etc/exports 这个档案;
NFS 的重要登录档可以参考 /var/lib/nfs/xtab 这个档案,还包含相当多有用的信息在其中!
NFS 主机要关机之前,请务必先关闭 portmap 与 nfs server ,否则关机无法顺利成功;
NFS 主机在更动 /etc/exports 这个档案之后,可以透过 exportfs 这个指令来重新挂载分享的目录!
可以使用 rpcinfo 来观察 RPC program 之间的关系!!!
NFS 主机在设定之初,就必须要考虑到 client 端登入的权限问题,很多时候无法写入或者无法进行分享,主要是 Linux实体档案的权限设定问题所致!
NFS 的防火墙设定可以透过控制 RPC 的主要 port ,亦即是 111 这个 port 来管理!此外,亦可透过TCP_Wrappers 来管理!
NFS 客户端只要成功 mount NFS 主机分享的目录之后,使用上面就好像自己的 partition 一般;
NFS 客户端可以透过使用 showmount, mount 与 umount 来使用 NFS 主机提供的分享的目录!
摘自:http://blog.sina.com.cn/s/blog_5f5716580100qd5x.html

页: [1]
查看完整版本: NFS实现Linux网络磁盘挂载-it论坛-计算机论坛