|
最近更新日期:2003/09/10
NFS为 Network FileSystem 的简称,最早之前是由
Sun 这家公司所发展出来的,他的目的就是想让不同的机器、不同的操作系统可以彼此分享个别的档案啦!目前在
Unix Like 当中用来做为 file server 是相当不错的一个方案喔!基本上, Unix
Like 主机连接到另一部 Unix Like 主机来分享彼此的档案时,使用 NFS 要比 SAMBA
快速且方便的多了!此外, NFS 的设定真的很简单,几乎只要记得启动 Remote
Procedure Call 这个咚咚 ( 就是 portmap 这个套件啦! ) 就一定可以架设的起来!真是不错啊!不过,如果要达成
Windows 与 Linux 之间的沟通,那么还是以 SAMBA 比较容易啊!无论如何, NFS
还是可以做为小公司或学校单位内部 Unix Like 机器共享 file 的一个 Server
喔!
|
NFS 的由来与其功能
什么是
NFS ( Network FileSystem )
在开始进行 NFS 的设定之前,我们得先来了解一下,什么是 NFS 呢?不然讲了一堆也没有用,对吧!
^_^!所谓的 NFS 就是 Network FileSystem 的缩写,最早之前是由 Sun 这家公司所发展出来的。他最大的功能就是可以透过网络,让不同的机器、不同的操作系统、可以彼此分享个别的档案
( share file ),所以,您也可以简单的将他看做是一个 file server 呢!这个
NFS Server 可以让您的 PC 来将网络远程的 NFS 主机分享的目录,挂载到本地端的机器当中,所以,在本地端的机器看起来,那个远程主机的目录就好像是自己的一个磁盘分区槽一样
( partition )!使用上面相当的便利!
图一、NFS 主机分享目录与
Client 挂载示意图
就如同上面的图示一般,当我们的 NFS Server 设定好了分享出来的 /home/sharefile
这个目录后,其他的 Client 端就可以将这个目录挂载到自己系统上面的某个挂载点(挂载点可以自定义!),例如前面图示中的
Personal Computer 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... 等等磁盘或档案相关的指令!真是他X的方便吶!
那么您或许会问啦:『咦!那么这个 NFS 是藉由什么样的协议来进行传输的呢?』虽然
NFS 有属于自己的协议与使用的 port number ,但是在数据传送或者其他相关讯息传递的时候,
NFS 使用的则是一个称为远程过程调用( Remote Procedure
Call, RPC )的协定来协助 NFS 本身的运作!
什么是
RPC ( Remote Procedure Call )
那么什么是 RPC 呢?由字面上的意思来看『远程过程调用』不就是一些程序(
Program )在执行远程联机时,需要用到的程序吗?呵呵!是这样没错啦!简单的来说,当我们在使用某些服务来进行远程联机的时候,有些信息,例如主机的
IP、服务的 port number、与对应到的服务之 PID 等等,都需要管理与对应!这些管理
port 的对应与服务相关性的工作,就是这个 Remote Procedure Call, RPC 的任务了!
好了,如果我们将 NFS 与 RPC 两者的相关性连接起来的话,那么您应该就可以知道:
NFS 本身的服务并没有提供数据传递的协议,但是 NFS 却能让我们进行档案的分享,这其中的原因,就是
NFS 使用到一些其他相关的传输协议!而这些传输的协议,就是使用到这个所谓的
RPC 的功能啰!这也就是说, 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 协议的信息您可以参考底下的网页:
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 server program 之前,我们都需要做好 port 的对应 ( mapping ) 的工作才行,这个工作其实就是『
portmap 』这个服务所负责的!也就是说,在启动任何一个
RPC server 之前,我们都需要启动 portmap 才行呢!那么这个 portmap
到底在干嘛呢?就如同这个服务的名称,哈哈!就是作 port 的 mapping 啊!举个例子来说:当
Client 端尝试来使用 RPC server 所提供的服务时,由于 Client 需要取得一个可以连接的
port 才能够使用 RPC server 所提供的服务,因此, Client 首先就会去跟 portmap
讲『喂!可不可以通知一下,给我个 port number ,好让我可以跟 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 主机呢?呵呵!就是看这个档案的内容即可啰! ^_^
就说不难吧!主要就是这几个啰!
主机的规划技巧建议
如果您的工作环境中,具有多部的 Linux 主机,并且预计彼此分享出目录时,那么在安装
Linux distribution 的时候,最好可以规划出一块 partition 作为预留之用。因为『
NFS
可以针对目录来分享』,因此,您可以将预留的 partition 挂载在任何一个挂载点,再将该挂载点(就是目录啦!)由
/etc/exports 的设定中分享出去,那么整个工作环境中的其他 Linux 主机就可以使用该
NFS 主机的那块预留的 partition 了!所以,在主机的规划上面,主要需要留意的只有
partition 而已。此外,由于分享的 partition 可能较容易被入侵,最好可以针对该
partition 设定比较严格的参数在 /etc/fstab 当中喔!
设定流程(/etc/exports)
我们在原理的部分对于 NFS 稍微解释了一下,哇!怎么看起来好像粉难喔!其实一点也不!为什么呢?因为
portmap 只要一支 scripts 就可以启动, NFS 只要设定一个档案就可以顺利运作!那么怎么能说不简单呢!呵呵!这个
NFS 真是他 X 的太太太.....简单了~在开始 NFS 之前,让我们先以 Windows 的系统当中的『资源共享』来说明一下整个流程吧:
-
在 Windows Server 上面,开启档案总管,在某个目录上面右键单击选择启动资源共享;
-
在资源共享的内容当中,需要设定『用户权力』(
以 Windows 2000 为例 );
-
在 Client 端需要登入 Windows
server 时,需要启动『网络上的芳邻』来寻找可用的网络上面分享的目录,然后点选该目录,若可以登入该
Windows server 时,则可以依据步骤一的权限使用该目录下的档案!
呵呵!没错! 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!每个咚咚的细部项目就来谈一谈吧:
-
系统需求:
嗄!NFS 有最低硬件需求吗?呵呵!您误会了!这里的需求其实指的是『软件需求』啦!需要的是:
-
除了刚刚我们已经提到的两个套件『
portmap 与 nfs-utils 』必需要存在之外;
-
您的核心版本最好能够高于 2.2.xx
以后比较好!
-
此外,如果重新编译过核心,您必需『一定要选择』NFS
支援才行!
目前,如果您使用的是安装时候的 Linux distribution 预设核心时,那么您都不用太担心,因为系统已经默认有支持
NFS 啰!所以底下的咚咚您都可以玩!但是,如果您已经重新编译过核心,并且不知道您是怎么编译的
( 例如道听途说啦、试试看新鲜玩意啦等等的来编译您的核心时,所以没有注意到这个项目的选择
) ,这个时候请拿出『鸟哥的 Linux 私房菜 -- 基础学习篇』好好的再次的读一遍『核心编译』!
-
/etc/exports:
好了,已经确认『一切OK』之后,我们就真的要来玩弄 NFS 啦!这个东西真的很简单的啦,只要一个档案就可以搞定了!那就是编辑
/etc/exports 这个档案,请注意,这个档案如果不存在,请自行建立!并且,档名不要写错了喔!这个档案的内容很简单啦,我们列出他的规则:
[root@test
root]# vi /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 的权限!那么您可以这么写喔!
[root@test
root]# vi /etc/exports
/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 这个网域可以读写,其他人则只能读取:
[root@test
root]# vi /etc/exports
/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 端的机器来使用,那么我就必需这么写:
[root@test
root]# vi /etc/exports
/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 这个身份的使用者:
[root@test
root]# vi /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) |
特别注意到那个 all_squash 与 anonuid, anongid 的功能!如此一来,当 test.linux.org
登入这部 NFS 主机,并且在 /home/linux 写入档案时,该档案的所有人与所有群组,就会变成
/etc/passwd 里面对应的 UID 为 40 的那个身份的使用者了!
-
关于权限问题:
无论任何时候,权限的问题都是需要考虑到的!让我们来看看刚刚建立的 /etc/exports
档案的内容:
[root@test
root]# vi /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下去!
[root@test
root]# /etc/rc.d/init.d/portmap start<==启动
portmap !
[root@test
root]# /etc/rc.d/init.d/nfs start
<==启动 NFS |
那个 portmap 根本就不需要设定!只要直接启动他就可以啦!启动之后,会出现一个
port 111 的 sunrpc 的服务!那就是 portmap
啦!至于 nfs 则会启动至少两个以上的 daemon 出现!然后就开始在监听 Client
端的需求啦!启动之后,请赶快到 /var/log/messages 里面看看有没有被正确的启动呢?
[root@test
root]# 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 的用法了:
语法:
[root@test
root]# exportfs [-aruv]
参数说明:
-a :全部挂载(或卸除)
/etc/exports 档案内的设定
-r :重新挂载
/etc/exports 里面的设定,此外,亦同步更新 /etc/exports
及 /var/lib/nfs/xtab
的内容!
-u :卸除某一目录
-v :在 export
的时候,将分享的目录显示到屏幕上!
范例:
[root@test
root]# 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
[root@test root]#
exportfs -au <==全部都卸除了! |
要熟悉一下这个指令的用法喔!这样一来,就可以直接重新
export 我们的记录在 /etc/exports 的目录数据啰!
-
检验目录 /var/lib/nfs/xtab
好了,当您顺利的将您的目录都分享出去之后,您怎么知道每个目录的分享权限呢?不要忘记了,因为我们有相当多的默认属性呢!因此,这个时候就得需要检验一下您所分享的目录内容啰!看一下
/var/lib/nfs/xtab 这个档案吧!他有点像这样:
[root@test
root]# 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
的指令嘛!怎么用呢?
语法:
[root@test
root]# showmount [-ae] hostname
-a :在屏幕上显示目前主机与
Client 所连上来的使用目录状态
-e :显示 hostname
这部机器的 /etc/exports 里面的分享目录!
范例:
[root@test
root]# showmount -e localhost
Export list
for localhost:
/tmp
*
/home/linux
*.linux.org
/home/public
(everyone)
/home/test
192.168.0.100 |
很简单吧!所以,当您要扫瞄某一部主机他提供的 NFS
分享的目录时,就使用 showmount -e IP(或hostname)即可!非常的方便吧!
-
观察启动的 port number:
OK!来看看我们启动 NFS 之后,到底启动了多少的
port 呢?要注意的是,我们有启动 portmap 与 nfs 两支 scripts 喔!
[root@test
root]# netstat -utln
Active Internet
connections (only servers)
Proto Recv-Q
Send-Q Local Address
Foreign Address State
tcp
0 0 0.0.0.0:111
0.0.0.0:*
LISTEN <==来自 portmap
tcp
0 0 0.0.0.0:817
0.0.0.0:*
LISTEN <==来自 rpc.xxxx
tcp
0 0 0.0.0.0:1266
0.0.0.0:*
LISTEN <==来自 rpc.xxxx
udp
0 0 0.0.0.0:2049
0.0.0.0:* <==就是
nfs 的 port
udp
0 0 0.0.0.0:814
0.0.0.0:* <==来自
rpc.xxxx
udp
0 0 0.0.0.0:1327
0.0.0.0:* <==来自
rpc.xxxx
udp
0 0 0.0.0.0:111
0.0.0.0:* <==来自
portmap |
注意看到上面喔!总共产生了好多的 port 喔!真是可怕!先注意到 nfs 自己所开启的
port ,就是那个 2049 的 port 啦!那个就是 NFS 主要产生的 port 啰。那么其他的
rpc.xxxx 的 port 又是从何而来? NFS server 在前面我们就提过了,他是 RPC
server 的一种,而 NFS 由于提供了多个 program ( 例如 rpc.mountd, rpc.rquotad,
rpc.nfsd... ) ,因此就需要启动多个 port 了!而且这些 port 是『随机产生的』,也就是那个
port number 不会是固定的啦!每次 restart nfs 都会得到不一样的 port number
呢!那么 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 这个指令了!先来谈一谈这个指令的用法吧!
语法:
[root@test
root]# rpcinfo [-p] hostname(orIP)
-p :显示所有的
port 与 program 的信息!
范例:
[root@test
root]# rpcinfo -p test.linux.org
program vers proto port
100000 2 tcp 111
portmapper
100000 2 udp 111
portmapper
100011 1 udp 1014 rquotad
100011 2 udp 1014 rquotad
100011 1 tcp 1017 rquotad
100011 2 tcp 1017 rquotad
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100021 1 udp 1339 nlockmgr
100021 3 udp 1339 nlockmgr
100021 4 udp 1339 nlockmgr
100005 1 udp 1340 mountd
100005 1 tcp 1271 mountd
100005 2 udp 1340 mountd
100005 2 tcp 1271 mountd
100005 3 udp 1340 mountd
100005 3 tcp 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 一下啰!
[root@test
root]# 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 这个目录!有点像这样:
[root@test
root]# mkdir -p /home/nfs/public <==建立
public 这个目录,加 -p 可以持续增加目录
[root@test
root]# mount -t nfs test.linux.org:/home/public
/home/nfs/public
挂载的格式:
[root@test
root]# mount -t nfs hostname(orIP):/directory
/mount/point
[root@test
root]# df
Filesystem
1K-blocks Used Available Use% Mounted on
/dev/hda1
1904920 1235380 572776 69% /
/dev/hdb1
976344 115212 810736 13% /backup
test.linux.org:/home/public
1904920
1235376 572776 69% /home/nfs/public
<==这个是远程主机的容量 |
先注意一下挂载 NFS 档案的格式范例喔!呵呵!这样就可以将数据挂载进来啦!请注意喔!以后,只要您进入您的目录
/home/nfs/public 就等于到了 test.linux.org 那部远程主机的 /home/public
那个目录中啰!很不错吧!那么如何将挂载的 NFS 目录卸除呢?就使用 umount
啊!
[root@test
root]# umount /home/nfs/public |
可能发生的问题:
通常无法挂载的原因有底下这几个:
-
使用者的权限不符:以上面的例子来说明,我的
/home/test 只能提供 192.168.0.0/24 这个网域,所以,如果我在 test.linux.org
这部机器中,以 localhost 来挂载时,就会无法挂载上,这个权限概念没问题吧!那么您可以试试看:
[root @test
root]# mount -t nfs localhost:/home/test /home/nfs
mount: localhost:/home/test
failed, reason given by server: Permission denied |
所以啰!如果您发现上面的显示的讯息时,就表示您的主机权限不能够进入该目录啰!如果确定您的
IP 没有错误,那么请回到 /etc/exports 这个档案中,针对您自己的 IP 来进行修正吧!
-
忘记启动 portmap :
这个最容易被忘记了!就是忘记了启动 portmap 这个服务啦!如果您发现您的
mount 的讯息是这样:
[root@test
root]# mount -t nfs localhost:/home/test /home/nfs
mount: RPC:
Port mapper failure - RPC: Unable to receive |
或者是:
[root@test
root]# mount -t nfs localhost:/home/test /home/nfs
mount: RPC:
Program not registered |
那么就赶紧将 portmap 启动吧!!并且也需要将 nfs 重新启动喔!
[root@test
root]# /etc/rc.d/init.d/portmap start
[root@test
root]# /etc/rc.d/init.d/nfs restart |
-
被防火墙挡掉了:
这个也很容易忘记了!那就是重新设定一下您的防火墙,这包含了两部份,包括
iptables 与 TCP_Wrappers !因为我们启动了 portmap ,这个东西有两个数据需要分享出来,一个是
port 111 需要提供出去,因此您的 iptables 规则当中,需要开放这个 port 喔!有点像这样的几行字要加入您的
iptables rules 当中:
iptables -A
INPUT -p TCP --dport 111 -j ACCEPT
iptables -A
INPUT -p UDP --dport 111 -j ACCEPT |
如果您已经开放了这个 port 的连接权限,却还是无法连接成功,那么应该就是
TCP_Wrappers 的问题了!检查一下您的 /etc/hosts.deny 里头是否有这行:
[root@test
root]# vi /etc/hosts.deny
ALL: ALL |
果真如此的话,由于 portmap 是由 portmap 这个 daemon 所启动的,所以您就必须要在
/etc/hosts.allow 里面加入这一行:
[root@test
root]# 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 -j ACCEPT
iptables -A
INPUT -i eth0 -p TCP -s 140.0.0.0/8 --dport 111 -j ACCEPT
iptables -A
INPUT -i eth0 -p UDP -s 140.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 主机,那么我可以写成这样:
[root@test
root]# vi /etc/hosts.allow
portmap: 192.168.0.0/255.255.255.0
portmap: 140.116.44.125
portmap: .ncku.edu.tw
[root@test root]#
vi
/etc/hosts.deny
portmap: ALL |
呵呵!这样可就设定好啰!很简单的吧!
-
使用 /etc/exports 设定更安全的权限:
这就牵涉到您的逻辑思考了!怎么设定都没有关系,但是在『便利』与『安全』之间,要找到您的平衡点吶!善用
root_squash 及 all_squash 等功能,再利用 anonuid 等等的设定来规范登入您主机的用户身份!应该还是有办法提供一个较为安全的
NFS 主机的!
-
Client 端挂载的问题:
基本上,在 Client 端挂载的时候,为了担心会不小心刚 NFS 端挂进来的具有
SUID 权限档案的程序执行!这个很可能会危害到系统的安全呢!因为 SUID 本来就不是很安全的嘛!所以呢,您这个
root 也可以将 NFS 所分享的目录以较为安全的情况挂载进来!例如:
[root@test
root]# mount -t nfs -o nosuid,ro hostname:/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 这个档案的内容啰,您可以这样写吧!
[root @test
root]# 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
[root @test
root]# ll /
drwxrwxrwt
6 root root
4096 Nov 16 09:07 tmp
2. /home/nfs
[root @test
root]# mkdir -p /home/nfs
<==建立所需要的目录
[root @test
root]# chmod 755 -R /home/nfs
<==修改较为严格的档案权限
将目录与档案设定成只读!不能写入的状态,会更保险一点!
3. /home/upload
[root @test
root]# groupadd -g 210 nfs-upload
<==先建立所需要的 210 这个群组
[root @test
root]# useradd -g 210 -u 210 -M nfs-upload
<==建立需要的使用者名称
[root @test
root]# mkdir -p /home/upload
<==建立起目录了!
[root @test
root]# chown -R nfs-upload:nfs-upload /home/upload
<==修改拥有者!
如此,则用户与目录的权限都设定妥当啰!
4. /home/andy
[root @test
root]# ll /home
drwx------
3 andy andy
4096 Oct 28 13:37 andy |
这样子一来,权限的问题大概就可以解决啰!
-
启动 portmap 与 nfs 服务:
[root @test
root]# /etc/rc.d/init.d/portmap start
[root @test
root]# /etc/rc.d/init.d/nfs start |
-
在 192.168.0.50 这部机器上面演练一下:
1. 确认可用目录
[andy @linux50
andy]$ 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. 建立挂载点:
[andy @linux50
andy]$ mkdir -p /home/zzz/tmp
[andy @linux50
andy]$ mkdir -p /home/zzz/nfs
[andy @linux50
andy]$ mkdir -p /home/zzz/upload
[andy @linux50
andy]$ mkdir -p /home/zzz/andy
3. 实际挂载:
[andy @linux50
andy]$ su <==通常
Linux 只允许 root 来挂载!
[root @linux50
andy]# mount -t nfs 192.168.0.100:/tmp /home/zzz/tmp
[root @linux50
andy]# mount -t nfs 192.168.0.100:/home/nfs
/home/zzz/nfs
[root @linux50
andy]# mount -t nfs 192.168.0.100:/home/upload
/home/zzz/upload
[root @linux50
andy]# mount -t nfs 192.168.0.100:/home/andy
/home/zzz/andy
[root @linux50
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 主机提供的分享的目录!
本章与LPI 的关系
在 LPI 网站 http://www.lpi.org
里面提到的,关于 NFS 的考试题库的地方,只有在 LPI level 1 的 102 ,里面的
topic 113 Networking Services ,第四点当中,简易的 NFS 设定。强调的是『应试者需了解
NFS 的设定、启动与关闭的关系』至于会考的档案与指令可能有这些:
-
/etc/exports
-
/etc/fstab
-
mount
-
umount
参考资源:
本章习题练习
-
NFS 的主要配置文件为何?而在该档案内主要设定项目为何?
-
在 NFS 主要的配置文件当中仅有少许的参数说明,至于预设的参数说明则没有在该档案当中出现,请问,如果要查阅更详细的分享出来的档案的属性,要看那个档案?
-
如果已经启动了 nfs 这个服务器,但是却又修改过主要配置文件,请问可以使用那个指令来重新挂载分享出来的目录与
client 端权限的设定值?
-
在 client 端如果要挂载 NFS 所提供分享的档案,可以使用那个指令?
-
在 NFS 主要配置文件当中,可以透过那个参数来控制不让
client 端以 root 的身份使用您所分享出来的目录与档案?
-
我在 client 端挂载了 NFS Server
的某个目录在我的 /home/data 底下,当我执行其中某个程序时,却发现我的系统被破坏了?您认为可能的原因为何?该如何克服这样的问题,尤其是当我的
Client 端主机其实是多人共享的环境,怕其他的使用者也同样发生类似的问题呢?!
前往参考解答
简易
NFS 服务器机设定
2002/11/17:第一次完成
2003/03/09:修改部分内容,并且新增
LPI 相关性与重点整理部分!
2003/09/10:又重新修改版面,以及新增主机的规划等部分。
|
|