13.3 NFS 客户端的设定

既然 NFS 服务器最主要的工作就是分享文件系统给网络上其他的客户端,所以客户端当然得要挂载这个玩意儿啰! 此外,服务器端可以加设防火墙来保护自己的文件系统,那么客户端挂载该文件系统后,难道不需要保护自己? 呵呵!所以底下我们要来谈一谈几个 NFS 客户端的课题。


13.3.1 手动挂载 NFS 服务器分享的资源

你要如何挂载 NFS 服务器所提供的文件系统呢?基本上,可以这样做:

  1. 确认本地端已经启动了 rpcbind 服务!
  2. 扫瞄 NFS 服务器分享的目录有哪些,并了解我们是否可以使用 (showmount);
  3. 在本地端建立预计要挂载的挂载点目录 (mkdir);
  4. 利用 mount 将远程主机直接挂载到相关目录。

好,现在假设客户端在 192.168.100.10 这部机器上,而服务器是 192.168.100.254 , 那么赶紧来检查一下我们是否已经有 rpcbind 的启动,另外远程主机有什么可用的目录呢!

# 1\. 启动必备的服务:若没有启动才启动,有启动则保持原样不动。
[root@clientlinux ~]# /etc/init.d/rpcbind start
[root@clientlinux ~]# /etc/init.d/nfslock start
# 一般来说,系统默认会启动 rpcbind ,不过鸟哥之前关闭过,所以要启动。
# 另外,如果服务器端有启动 nfslock 的话,客户端也要启动才能生效!

# 2\. 查询服务器提供哪些资源给我们使用呢?
[root@clientlinux ~]# showmount -e 192.168.100.254
Export list for 192.168.100.254:
/tmp         *
/home/linux  *.centos.vbird
/home/test   192.168.100.10
/home/public (everyone)   <==这是等一下我们要挂载的目录

接下来我想要将远程主机的 /home/public 挂载到本地端主机的 /home/nfs/public , 所以我就得要在本地端主机先建立起这个挂载点目录才行啊!然后就可以用 mount 这个指令直接挂载 NFS 的文件系统啰!

# 3\. 建立挂载点,并且实际挂载看看啰!
[root@clientlinux ~]# mkdir -p /home/nfs/public
[root@clientlinux ~]# mount -t nfs 192.168.100.254:/home/public \
> /home/nfs/public
# 注意一下挂载的语法!『 -t nfs 』指定文件系统类型,
# IP:/dir 则是指定某一部主机的某个提供的目录!另外,如果出现如下错误:
mount: 192.168.100.254:/home/public failed, reason given by server: No such file 
or directory
# 这代表你在 Server 上面并没有建立 /home/public 啦!自己在服务器端建立他吧!

# 4\. 总是得要看看挂载之后的情况如何,可以使用 df 或 mount 啦!
[root@clientlinux ~]# df
文件系统               1K-区段      已用     可用 已用% 挂载点
....(中间省略)....
192.168.100.254:/home/public
                       7104640    143104   6607104   3% /home/nfs/public

先注意一下挂载 NFS 档案的格式范例喔!呵呵!这样就可以将数据挂载进来啦!请注意喔! 以后,只要你进入你的目录 /home/nfs/public 就等于到了 192.168.100.254 那部远程主机的 /home/public 那个目录中啰!很不错吧!至于你在该目录下有什么权限? 那就请你回去前一小节查一查权限的思考吧! ^_^ !那么如何将挂载的 NFS 目录卸除呢?就使用 umount 啊!

[root@clientlinux ~]# umount /home/nfs/public

13.3.2 客户端可处理的挂载参数与开机挂载

瞧!客户端的挂载工作很简单吧!不过不晓得你有没有想过,如果你刚刚挂载到本机 /home/nfs/public 的文件系统当中,含有一支 script ,且这支 script 的内容为『 rm -rf / 』且该档案权限为 555 , 夭寿~如果你因为好奇给他执行下去,可有的你受的了~因为整个系统都会被杀光光!真可怜!

所以说,除了 NFS 服务器需要保护之外,我们取用人家的 NFS 文件系统也需要自我保护才行啊! 那要如何自我保护啊?可以透过 mount 的指令参数喔!包括底下这些主要的参数可以尝试加入:

参数 参数代表意义 系统默认值
suid nosuid 晓得啥是 SUID 吧?如果挂载的 partition 上面有任何 SUID 的 binary 程序时, 你只要使用 nosuid 就能够取消 SUID 的功能了!嗄?不知道什么是 SUID ?那就不要学人家架站嘛!@_@! 赶紧回去基础学习篇第三版复习一下第十七章、程序与资源管理啦! suid
rw ro 你可以指定该文件系统是只读 (ro) 或可擦写喔!服务器可以提供给你可擦写, 但是客户端可以仅允许只读的参数设定值! rw
dev nodev 是否可以保留装置档案的特殊功能?一般来说只有 /dev 这个目录才会有特殊的装置,因此你可以选择 nodev 喔! dev
exec noexec 是否具有执行 binary file 的权限? 如果你想要挂载的仅是数据区 (例如 /home),那么可以选择 noexec 啊! exec
user nouser 是否允许使用者进行档案的挂载与卸除功能? 如果要保护文件系统,最好不要提供使用者进行挂载与卸除吧! nouser
auto noauto 这个 auto 指的是『mount -a』时,会不会被挂载的项目。 如果你不需要这个 partition 随时被挂载,可以设定为 noauto。 auto

一般来说,如果你的 NFS 服务器所提供的只是类似 /home 底下的个人资料, 应该不需要可执行、SUID 与装置档案,因此当你在挂载的时候,可以这样下达指令喔:

[root@clientlinux ~]# umount /home/nfs/public
[root@clientlinux ~]# mount -t nfs -o nosuid,noexec,nodev,rw \
> 192.168.100.254:/home/public /home/nfs/public

[root@clientlinux ~]# mount | grep addr
192.168.100.254:/home/public on /home/nfs/public type nfs (rw,noexec,nosuid,
nodev,vers=4,addr=192.168.100.254,clientaddr=192.168.100.10)

这样一来你所挂载的这个文件系统就只能作为资料存取之用,相对来说,对于客户端是比较安全一些的。 所以说,这个 nosuid, noexec, nodev 等等的参数可得记得啊!

  • 关于 NFS 特殊的挂载参数

除了上述的 mount 参数之外,其实针对 NFS 服务器,咱们的 Linux 还提供不少有用的额外参数喔!这些特殊参数还非常有用呢! 为什么呢?举例来说,由于文件系统对 Linux 是非常重要的东西,因为我们进行任何动作时,只要有用到文件系统, 那么整个目录树系统就会主动的去查询全部的挂载点。如果你的 NFS 服务器与客户端之间的联机因为网络问题, 或者是服务器端先关机了,却没有通知客户端,那么客户端只要动到文件系统的指令 (例如 df, ls, cp 等等) ,整个系统就会慢到爆!因为你必须要等到文件系统搜寻等待逾时后,系统才会饶了你!(鸟哥等过 df 指令 30 分钟过...)

为了避免这些困扰,我们还有一些额外的 NFS 挂载参数可用!例如:

参数 参数功能 预设参数
fg bg 当执行挂载时,该挂载的行为会在前景 (fg) 还是在背景 (bg) 执行? 若在前景执行时,则 mount 会持续尝试挂载,直到成功或 time out 为止,若为背景执行, 则 mount 会在背景持续多次进行 mount ,而不会影响到前景的程序操作。 如果你的网络联机有点不稳定,或是服务器常常需要开关机,那建议使用 bg 比较妥当。 fg
soft hard 如果是 hard 的情况,则当两者之间有任何一部主机脱机,则 RPC 会持续的呼叫,直到对方恢复联机为止。如果是 soft 的话,那 RPC 会在 time out 后『重复』呼叫,而非『持续』呼叫, 因此系统的延迟会比较不这么明显。同上,如果你的服务器可能开开关关,建议用 soft 喔! hard
intr 当你使用上头提到的 hard 方式挂载时,若加上 intr 这个参数, 则当 RPC 持续呼叫中,该次的呼叫是可以被中断的 (interrupted)。 没有
rsize wsize 读出(rsize)与写入(wsize)的区块大小 (block size)。 这个设定值可以影响客户端与服务器端传输数据的缓冲记忆容量。一般来说, 如果在局域网络内 (LAN) ,并且客户端与服务器端都具有足够的内存,那这个值可以设定大一点, 比如说 32768 (bytes) 等,提升缓冲记忆区块将可提升 NFS 文件系统的传输能力! 但要注意设定的值也不要太大,最好是达到网络能够传输的最大值为限。 rsize=1024 wsize=1024

更多的参数可以参考 man nfs 的输出数据喔! 通常如果你的 NFS 是用在高速运作的环境当中的话,那么可以建议加上这些参数的说:

[root@clientlinux ~]# umount /home/nfs/public
[root@clientlinux ~]# mount -t nfs -o nosuid,noexec,nodev,rw \
> -o bg,soft,rsize=32768,wsize=32768 \
> 192.168.100.254:/home/public /home/nfs/public

则当你的 192.168.100.254 这部服务器因为某些因素而脱机时,你的 NFS 可以继续在背景当中重复的呼叫! 直到 NFS 服务器再度上线为止。这对于系统的持续操作还是有帮助的啦! 当然啦,那个 rsize 与 wsize 的大小则需要依据你的实际网络环境而定喔!

Tips: 在鸟哥的实际案例中,某些大型的模式运算并不允许 soft 这个参数喔!举例来说,鸟哥惯用的 CMAQ 空气质量模式, 这个模式的丛集架构分享文件系统中,就不允许使用 soft 参数!这点需要特别留意喔!

  • 将 NFS 开机即挂载

我们知道开机就挂载的挂载点与相关参数是写入 /etc/fstab 中的,那 NFS 能不能写入 /etc/fstab 当中呢?非常可惜的是, 不可以呢!为啥呢?分析一下开机的流程,我们可以发现网络的启动是在本机挂载之后,因此当你利用 /etc/fstab 尝试挂载 NFS 时,系统由于尚未启动网络,所以肯定是无法挂载成功的啦!那怎办?简单!就写入 /etc/rc.d/rc.local 即可!

[root@clientlinux ~]# vim /etc/rc.d/rc.local
mount -t nfs -o nosuid,noexec,nodev,rw,bg,soft,rsize=32768,wsize=32768 \
192.168.100.254:/home/public /home/nfs/public

13.3.3 无法挂载的原因分析

如果客户端就是无法挂载服务器端所分享的目录时,到底是发生什么问题?你可以这样分析看看:

  • 客户端的主机名或 IP 网段不被允许使用:

以上面的例子来说明,我的 /home/test 只能提供 192.168.100.0/24 这个网域,所以如果我在 192.168.100.254 这部服务器中,以 localhost (127.0.0.1) 来挂载时,就会无法挂载上,这个权限概念没问题吧!不然你可以在服务器上试试看:

[root@www ~]# mount -t nfs localhost:/home/test /mnt
mount.nfs: access denied by server while mounting localhost:/home/test

看到 access denied 了吧?没错啦~权限不符啦!如果确定你的 IP 没有错误,那么请通知服务器端,请管理员将你的 IP 加入 /etc/exports 这个档案中。

  • 服务器或客户端某些服务未启动:

这个最容易被忘记了!就是忘记了启动 rpcbind 这个服务啦!如果你在客户端发现 mount 的讯息是这样:

[root@clientlinux ~]# mount -t nfs 192.168.100.254:/home/test /mnt
mount: mount to NFS server '192.168.100.254' failed: System Error: Connection refused.
# 如果你使用 ping 却发现网络与服务器都是好的,那么这个问题就是 rpcbind 没有开啦!

[root@clientlinux ~]# mount -t nfs 192.168.100.254:/home/test /home/nfs
mount: mount to NFS server '192.168.100.254' failed: RPC Error: Program not registered.
# 注意看最后面的数据,确实有连上 RPC ,但是服务器的 RPC 告知我们,该程序无注册

要嘛就是 rpcbind 忘记开 (第一个错误),要嘛就是服务器端的 nfs 忘记开。最麻烦的是, 重新启动了 rpcbind 但是却忘记重新启动其他服务 (上述第二个错误)!解决的方法就是去重新启动 rpcbind 管理的其他所有服务就是了!

  • 被防火墙档掉了:

由于 NFS 几乎不对外开放,而内部网域又通常是全部的资源都放行,因此过去玩 NFS 的朋友 (包括鸟哥本人啦!) 都没有注意过 NFS 的防火墙问题。最近这几年鸟哥在管理计算机教室时,有掌管一部计算机教室主控防火墙, 为了担心太厉害的学生给鸟哥乱搞,因此该 Linux 防火墙预设是仅放行部分资源而已。但由于计算机教室的区网内需要用到 Linux 的 NFS 资源,结果呢?竟然没办法放行啊!原来就是 iptables 没有放行 NFS 所使用到的埠口~

所以,当你一直无法顺利的连接 NFS 服务器,请先到服务器端,将客户端的 IP 完全放行,若确定这样就连的上, 那代表就是防火墙有问题啦!怎么解决呢?上一小节介绍过了,参考将 NFS 服务器埠口固定的方式吧!


13.3.4 自动挂载 autofs 的使用

在一般 NFS 文件系统的使用情况中,如果客户端要使用服务器端所提供的 NFS 文件系统时,要嘛就是得在 /etc/rc.d/rc.local 当中设定开机时挂载,要嘛就得要登入系统后手动利用 mount 来挂载。 此外,客户端得要预先手动的建立好挂载点目录,然后挂载上来。但是这样的使用情况恐怕有点小问题。

  • NFS 文件系统与网络联机的困扰:

我们知道 NFS 服务器与客户端的联机或许不会永远存在,而 RPC 这个服务又挺讨厌的,如果挂载了 NFS 服务器后,任何一方脱机都可能造成另外一方老是在等待逾时~而且,挂载的 NFS 文件系统可能又不是常常被使用,但若不挂载的话,有时候紧急要使用时又得通知系统管理员, 这又很不方便...啊!好讨厌的感觉啊~@_@

所以,让我们换个思考的角度来讨论一下使用 NFS 的情境:

  • 可不可以让客户端在有使用到 NFS 文件系统的需求时才让系统自动挂载?
  • 当 NFS 文件系统使用完毕后,可不可以让 NFS 自动卸除,以避免可能的 RPC 错误?

如果能达到上述的功能,那就太完美啦!有没有这东西呢?有的,在现在的 Linux 环境下这是可以达成的理想!用的就是 autofs 这个服务啦!

  • autofs 的设定概念:

autofs 这个服务在客户端计算机上面,会持续的侦测某个指定的目录, 并预先设定当使用到该目录下的某个次目录时,将会取得来自服务器端的 NFS 文件系统资源,并进行自动挂载的动作。 讲这样或许你有点模糊,让我们拿底下这个图示来看看:

图 13.3-1、autofs 自动挂载的配置文件内容示意图

如上图所示,我们的 autofs 主要配置文件为 /etc/auto.master,这个档案的内容很简单, 如上所示,我只要定义出最上层目录 (/home/nfsfile) 即可,这个目录就是 autofs 会一直持续侦测的目录啦。 至于后续的档案则是该目录底下各次目录的对应。在 /etc/auto.nfs (这个档案的档名可自定义) 里面则可以定义出每个次目录所欲挂载的远程服务器的 NFS 目录资源!

举例来说:『当我们在客户端要使用 /home/nfsfile/public 的数据时,此时 autofs 才会去 192.168.100.254 服务器上挂载 /home/public !』且『当隔了 5 分钟没有使用该目录下的数据后,则客户端系统将会主动的卸除 /home/nfsfile/public 』。

很不错用的一个工具吧!因为有用到服务器的数据时才自动挂载,没有使用了就会自动卸除! 而不是传统的情况一直是挂载的!既然这么好用,那就让我们实际来操演一下:

  • 建立主配置文件 /etc/auto.master ,并指定侦测的特定目录

这个主要配置文件的内容很简单,只要有要被持续侦测的目录及『数据对应文件』即可。 那个数据对应文件的文件名是可以自行设定的,在鸟哥这个例子当中我使用 /etc/auto.nfs 来命名。

[root@clientlinux ~]# vim /etc/auto.master
/home/nfsfile  /etc/auto.nfs

上述数据中比较需要注意的是,那个 /home/nfsfile 目录不需要存在,因为 autofs 会主动的建立该目录! 如果你建立了,可能反而会出问题~因此,先确定一下没有该目录吧!

  • 建立数据对应文件内 (/etc/auto.nfs) 的挂载信息与服务器对应资源

刚刚我们所指定的 /etc/auto.nfs 是自行设定的,所以这个档案是不存在的。那么这个档案的格式是如何呢?你可以这样看:

[本地端次目录]  [-挂载参数]  [服务器所提供的目录]
选项与参数:
[本地端次目录] :指的就是在 /etc/auto.master 内指定的目录之次目录
[-挂载参数]    :就是前一小节提到的 rw,bg,soft 等等的参数啦!可有可无;
[服务器所提供的目录] :例如 192.168.100.254:/home/public 等

[root@clientlinux ~]# vim /etc/auto.nfs
public   -rw,bg,soft,rsize=32768,wsize=32768  192.168.100.254:/home/public
testing  -rw,bg,soft,rsize=32768,wsize=32768  192.168.100.254:/home/test
temp     -rw,bg,soft,rsize=32768,wsize=32768  192.168.100.254:/tmp
# 参数部分,只要最前面加个 - 符号即可!

这样就可以建立对应了!要注意的是,那些 /home/nfsfile/public 是不需要事先建立的! 咱们的 autofs 会事情况来处理喔!好了,接下来让我们看看如何实际运作吧!

  • 实际运作与观察

配置文件设定妥当后,当然就是要启动 autofs 啦!

[root@clientlinux ~]# /etc/init.d/autofs stop
[root@clientlinux ~]# /etc/init.d/autofs start
# 很奇怪!非常怪!CentOS 6.x 的 autofs 使用 restart 会失效!所以鸟哥才进行两次

假设你目前并没有挂载任何来自 192.168.100.254 这部 NFS 服务器的资源目录。好了, 那让我们实际来观察看看几个重要的数据吧!先看看 /home/nfsfile 会不会主动的被建立? 然后,如果我要进入 /home/nfsfile/public 时,文件系统会如何变化呢?

[root@clientlinux ~]# ll -d /home/nfsfile
drwxr-xr-x. 2 root root 0 2011-07-28 00:07 /home/nfsfile
# 仔细看,妳会发现 /home/nfsfile 容量是 0 喔!那是正常的!因为是 autofs 建立的

[root@clientlinux ~]# cd /home/nfsfile/public
[root@clientlinux public]# mount | grep nfsfile
192.168.100.254:/home/public on /home/nfsfile/public type nfs (rw,soft,rsize=32768,
wsize=32768,sloppy,vers=4,addr=192.168.100.254,clientaddr=192.168.100.10)
# 上面的输出是同一行!瞧!突然出现这个玩意儿!因为是自动挂载的嘛!

[root@clientlinux public]# df  /home/nfsfile/public
文件系统               1K-区段      已用     可用 已用% 挂载点
192.168.100.254:/home/public
                       7104640    143104   6607040   3% /home/nfsfile/public
# 档案的挂载也出现没错!

呵呵!真是好啊!如此一来,如果真的有需要用到该目录时,系统才会去相对的服务器上面挂载! 若是一阵子没有使用,那么该目录就会被卸除呢!这样就减少了很多不必要的使用时机啦!还不错用吧! ^_^