【IT168 服务器学院】Server 端的设定:
前面对于 NFS 稍微解释了一下,哇!怎么看起来好象粉难喔!其实一点也不!为什么呢?因为 portmap 只要一支 scripts 就可以激活, NFS 只要设定一个档案就可以顺利运作!那么怎么能说不简单呢!呵呵!这个 NFS 真是他 X 的太太太.....简单了~在开始 NFS 之前,让我们先以 Windows 的系统当中的『资源共享』来说明一下整个流程吧:
1. 在 Windows Server 上面,开启档案总管,在某个目录上面按右键选择激活资源共享;
2. 在资源共享的内容当中,需要设定『使用者权限』( 以 Windows 2000 为例 );
3. 在 Client 端需要登入 Windows server 时,需要激活『网络上的芳邻』来寻找可用的网络上面分享的目录,然后点选该目录,若可以登入该 Windows server 时,则可以依据步骤一的权限使用该目录下的档案!
呵呵!没错! NFS 的整个流程也差不多是这样:
· 首先,需要确认一下你的 Linux 主机是否可以支持 NFS 这项服务,然后再设定一下使用者的来源IP或主机名称以及分享出去的目录的权限,之后呢,激活 NFS 即可将刚刚设定的目录给他分享出去了!
· 那么在 Client 端怎么使用这个分享出来的目录?就是先以 showmount 检查 Linux Server 是否有可以使用的 NFS 目录,如果有的话,就将他 mount 在本机上面,如果可以 mount ,那么就可以使用 NFS 主机提供的资源了!
哈哈!果然很简单吧!所以底下我们就来一个一个步骤的说明一下 NFS 怎么设定啰:
1. 系统需求
2. /etc/exports
3. 关于权限问题
4. 激活服务 portmap, nfsd
5. exportfs
6. 检验目录 /var/lib/nfs/xtab
7. showmount
8. 观察激活的 port number
OK!每个咚咚的细部项目就来谈一谈吧:
o 系统需求:
嗄!NFS 有最低硬件需求吗?呵呵!您误会了!这里的需求其实指的是『软件需求』啦!需要的是:
1. 除了刚刚我们已经提到的两个套件『 portmap 与 nfs-utils 』必需要存在之外;
2. 您的核心版本最好能够高于 2.2.xx 以后比较好!
3. 此外,如果重新编译过核心,你必需『一定要选择』NFS 支持才行!
目前,如果你使用的是安装时候的 Linux distribution 预设核心时,那么你都不用太担心,因为系统已经预设有支持啰!所以底下的咚咚妳都可以玩!但是,如果你已经重新编译过核心,并且不知道你是怎么编译的 ( 例如道听途说啦、试试看新鲜玩意啦等等的来编译你的核心时,所以没有注意到这个项目的选择 ) ,这个时候请到底下的网页再看一看你的核心资料吧:『核心编译』!
o /etc/exports:
好了,已经确认『一切OK』之后,我们就真的要来玩弄 NFS 啦!这个东西真的很简单的啦,只要一个档案就可以搞定了!那就是编辑 /etc/exports 这个档案,请注意,这个档案如果不存在,请自行建立!并且,档名不要写错了喔!这个档案的内容很简单啦,我们列出他的规则:
![]() |
上面的规则是这样的:欲分享的目录主要是要分享给主机名称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 的权限!那么你可以这么写喔!
![]() |
样一来,无论来自哪里(*万用字符!表示万事OK!)都可以使用我的 /tmp 这个目录。请注意,那个 *(rw,no_root_squash) 中间没有空格符喔!而 /tmp 与 *(rw,no_root_squash) 则是有空格符来隔开的!特别注意到那个 no_root_squash 的功能!
思考二:我要将一个公共的目录 /home/public 公开出去,但是只有限定我的局域网络内 192.168.0.0/24 这个网域可以读写,其它人则只能读取:这
![]() |
请注意,在上面的例子中,倒数两行的格式都可以适用!所以只要写一行即可!上面的例子说的是,当我的 IP 是在 192.168.0.0/24 这个网段的时候,那么 /home/public 我就可以读写~至于如果我不是在这个网段之内,那么这个目录的资料我就仅能读取而已,亦即为只读的属性啦!
思考三:我要将一个私人的目录 /home/test 开放给 192.168.0.100 这个 Client 端的机器来使用,那么我就必需这么写:
![]() |
这样就设定完成了!而且,只有 192.168.0.100 这部机器才能对 /home/test 这个目录进行存取喔!
思考四:我要让 *.linux.org 网域的主机,登入我的 NFS 主机时,可以存取 /home/linux ,但是他们存资料的时候,我希望他们的 UID 与 GID 都变成 40 这个身份的使用者:
![]() |
特别注意到那个 all_squash 与 anonuid, anongid 的功能!如此一来,当 test.linux.org 登入这部 NFS 主机,并且在 /home/linux 写入档案时,该档案的所有人与所有群组,就会变成 /etc/passwd 里面对应的 UID 为 40 的那个身份的使用者了!
o 关于权限问题:
无论任何时候,权限的问题都是需要考虑到的!让我们来看看刚刚建立的 /etc/exports 档案的内容:
![]() |
假设我在 192.168.0.100 登入这部 NFS ( IP 假设为 192.168.0.2 ) 主机,并且我在 192.168.0.100 的帐号为 test 这个身份,同时,在这部 NFS 上面也有 test 这个帐号,果真如此的话,那么:
1. 由于 192.168.0.2 这部 NFS 主机的 /tmp 权限为 -rwxrwxrwt ,所以我 ( test 在 192.168.0.100 上面 ) 在 /tmp 底下具有存取的权限,并且写入的档案所有人为 test ;
2. 在 /home/public 当中,由于我有读写的权限,所以如果在 /home/public 这个目录的权限对于 test 有开放写入的话,那么我就可以读写,并且我写入的档案所有人是 test 。但是万一 /home/public 对于 test 这个使用者并没有开放可以写入的权限时,那么我还是没有办法写入档案喔!这点请特别留意!
3. 在 /home/test 当中,我的权限与 /home/public 相同的状态!还需要 NFS 主机的 /home/test 对于 test 有开放权限;
4. 在 /home/linux 当中就比较麻烦!因为不论你是何种 user ,你的身份一定会被变成 UID=40 这个帐号!所以,这个目录就必需要针对 UID = 40 的那个帐号名称,修改他的权限才行!
那么假如我在 192.168.0.100 的身份为 test2 ,但是 192.168.0.2 这部 NFS 主机却没有 test2 这个帐号时,情况会变成怎样呢?
1. 我在 /tmp 底下还是可以写入,但是写入的档案所有人变成 nobody 了;
2. 我在 /home/public 里面是否可以写入,还需要视 /home/public 的权限而定,不过,反正我的身份就被变成 nobody 了就是;
3. /home/test 的观点与 /home/public 相同!
4. /home/linux 底下,我的身份就被变成 UID = 40 那个使用者就是了!
那么假如我在 192.168.0.100 的身份为 root 呢? root 这个帐号每个系统都会有呀!呵呵!权限变成怎样呢?
1. 我在 /tmp 里面可以写入,并且由于 no_root_squash 的参数,改变了预设的 root_squash 设定值,所以在 /tmp 写入的档案所有人为 root 喔!
2. 我在 /home/public 底下的身份还是被压缩成为 nobody 了!因为预设属性里面都具有 root_squash 呢!所以,如果 /home/public 有针对 nobody 开放写入权限时,那么我就可以写入,但是档案所有人变成 nobody 就是了!
3. /home/test 与 /home/public 相同;
4. /home/linux 的情况中,我 root 的身份也被压缩成为 UID = 40 的那个使用者了!
这样的权限讲解之后,您可以了解了吗?这里是最重要的地方,如果这一关通过了,底下的咚咚就没有问题啦! ^_^
o 激活服务 portmap, nfsd
好了,设定OK也没有权限的问题之后 ( 有问题也没关系,可以事后在好好的检视与修改一番!) ,再来自然就是激活他啰!如何激活呢?简单的很,直接给他OK下去!
![]() |
那个 portmap 根本就不需要设定!只要直接激活他就可以啦!激活之后,会出现一个 port 111 的 sunrpc 的服务!那就是 portmap 啦!至于 nfs 则会激活至少两个以上的 daemon 出现!然后就开始在监听 Client 端的需求啦!激活之后,请赶快到 /var/log/messages 里面看看有没有被正确的激活呢?
![]() |
要正常的出现上面的字样之后,才算是正确的激活喔!
o exportfs:
好了,那么如果我们修改了 /etc/exports 这个档案之后,是否需要重新激活 nfs 呢?呵呵,并不需要,只要使用 exportfs 重新扫瞄一次 /etc/exports 这的档案,并且重新将设定加载即可!因此,就要来了解一下 exportfs 的用法了:
![]() |
要熟悉一下这个指令的用法喔!这样一来,就可以直接重新 export 我们的记录在 /etc/exports 的目录资料啰!
o 检验目录 /var/lib/nfs/xtab
好了,当你顺利的将你的目录都分享出去之后,你怎么知道每个目录的分享权限呢?不要忘记了,因为我们有相当多的预设属性呢!因此,这个时候就得需要检验一下你所分享的目录内容啰!看一下 /var/lib/nfs/xtab 这个档案吧!他有点像这样:
![]() |
看到没?这个就是 /home/test 这个分享出去的目录的预设 NFS 里面的属性啦!这个属性状态里头有个比较奇怪的,那就是 anonuid=-2 这个,怎么有 uid=-2 的呢?呵呵!其实它说的是将 65536 - 2 的值,也就是 65534 的那个 UID 啦!对照一下 /etc/passwd ,你就会发现,哇!原来那就是 nobody 的啦!
o showmount:
showmount 顾名思义,就是看看有没有可以 mount 的指令嘛!怎么用呢?
![]() |
很简单吧!所以,当你要扫瞄某一部主机他提供的 NFS 分享的目录时,就使用 showmount -e IP(或hostname)即可!非常的方便吧!
o 观察激活的 port number:
OK!来看看我们激活 NFS 之后,到底激活了多少的 port 呢?要注意的是,我们有激活 portmap 与 nfs 两支 scripts 喔!
![]() |
注意看到上面喔!总共产生了好多的 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 啦!
