Linux基础服务 ·

NFS客户端的设定

NFS 服务器最主要的工作就是分享文件系统给网络上其他的客户端,所以客户端当然得要挂载它! 此外,服务器端可以加设防火墙来保护自己的文件系统,那么客户端挂载该文件系统后,也需要保护自己的数据!所以底下我们要来谈一谈 NFS 客户端配置。

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

挂载 NFS 服务器所提供的文件系统需要的操作:

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

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

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

先注意一下挂载 NFS 文件的格式范例!这样就可以将数据挂载进来!请注意! 以后,只要你进入你的目录 /home/nfs/public 就等于到了 192.168.100.254 那部远程主机的 /home/public 那个目录中!使用 umount 卸载就可以 NFS !

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

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

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

参数 参数代表意义 系统默认值
suid
nosuid
如果挂载的 partition 上面有任何 SUID 的 binary 程序时, 你只要使用 nosuid 就能够取消 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 与装置文件,因此当你在挂载的时候,可以这样下达指令:

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

关于 NFS 特殊的挂载参数

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

为了避免这些困扰,我们还有一些额外的 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 是用在高速运作的环境当中的话,那么可以建议加上这些参数:

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

无法挂载的原因分析

如果客户端就是无法挂载服务器端所分享的目录时,可以这样分析看看:


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

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

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

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

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

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

被防火墙档掉了:

当你一直无法顺利的连接 NFS 服务器,请先到服务器端,将客户端的 IP 完全放行,若确定这样就连的上, 那代表就是防火墙有问题!需要将 NFS 服务器端口固定的方式吧!

自动挂载 autofs 的使用

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

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

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

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

可不可以让客户端在有使用到 NFS 文件系统的需求时才让系统自动挂载?

当 NFS 文件系统使用完毕后,可不可以让 NFS 自动卸除,以避免可能的 RPC 错误?

在现在的 Linux 环境下用的 autofs 这个服务,能达到上述的功能!

autofs 的设定概念:

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

如上图所示,我们的 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 来命名。

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

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

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

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

实际运作与观察

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

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

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

参与评论