RedHatLinux下配置NFS服务器
2013-09-10 22:48:10 阿炯

NFS与RPC简介

NFS,全称Network File System,即网络文件系统。最早由Sun公司开发,它的功能是在不同的机器、不同的操作系统之间实现文件的共享,NFS传输数据时使用的端口是一个随机端口。

RPC,远程过程调用。它的功能是指定每个NFS功能对应的端口号,当NFS服务器启动时会随机启用数个端口号,并主动向RPC注册,这样RPC就知道每个端口号对应的功能了,RPC使用111号端口来监听客户机的请求并回应正确的端口号。启动NFS之前要先启动RPC,否则NFS无法向RPC注册,当RPC重新启动后,原来注册的端口数据会丢失,此时它管理的所有程序都必须重新向RPC注册。

rpcbind工具可以将RPC程序号码和通用地址互相转换。要让某主机能向远程主机的服务发起RPC调用,则该主机上的rpcbind必须处于已运行状态。当RPC服务启动后,它会告诉rpcbind它监听在哪个地址上,还会告诉它为服务准备好提供的PRC程序号码。当客户端要向某个给定的程序号码发起RPC调用时,它首先会联系服务端的rpcbind以确定RPC请求应该发送到哪个地址上。

rpcbind工具应该在所有RPC管理的服务(rpc service)启动之前启动。一般来说,标准的rpc服务由端口监视器来启动,因此rpcbind必须在端口监视器被调用之前已经启动完成。当rpcbind工具已经启动后,它会检查特定的name-to-address的转换调用功能是否正确执行;如果失败,则网络配置数据库会被认为过期,由于RPC管理的服务在这种情况下无法正确运行,rpcbind会输出这些信息并终止。

rpcbind工具只能由super-user启动。


在Linux下当通过 mount 指令挂载了一个 NFS 目录时,在文件系统中会创建一个 vfsmount 和 superblock,用于记录 NFS 的挂载信息,然后将 vfsmount 对象加入到 VFS 的 mount 树和 Hash Table 中,这样就算是挂载好了。


然后当访问的时候,首先打开的是文件对象,然后再定位到 vfsmount,再接着就可以访问到 superblock 了,这样就可以通过 NFS 的模块和 Server 进行通信了(图片来自格物致知的博客):


NFS 通信原理


NFS 的进程简介

rpc.nfsd 进程
NFS 服务的主进程,主要管理客户端是否能够接入 NFS 服务器以及数据的传输。该进程固定监听 TCP/UDP 2049 端口。

rpc.mountd 进程
管理和维护 NFS 文件系统,根据所设定的权限决定是否允许客户端挂载指定的共享目录。该进程监听的端口默认是不固定的。

rpc.lockd 进程(可选)
提供文件锁功能,防止多个客户端同时写入一个文件。该进程监听的端口默认是不固定的。

rpc.statd 进程(可选)
负责检查数据的状态及一致性,需要与 rpc.lockd 配合使用。该进程监听的端口默认是不固定的。

portmap
因为 rpc.mountd / rpc.lockd 以及 rpc.statd 的端口是不固定的,所以,nfs client 要想和 server 绑定则必须知道这些端口是什么,因此处理的方式是通过 111 端口查询这些端口信息是什么,然后再发起连接。

可以在此推导出NFS客户端挂载过程

首先服务器端启动 RPC 服务,并开启 111 端口;
启动 NFS 服务,并向 RPC 注册端口信息;
客户端启动 RPC 客户端,向服务端的 portmap(111 端口) 服务请求服务端的 NFS 端口信息;
服务端的 portmap 服务反馈给 Server 的端口信息给客户端;
客户端通过获取的 NFS 端口和服务端的 NFS 连接并进行数据的传输。


NFS工作原理及简单配置

1)客户机发送RPC请求到远程NFS服务器中。

2)NFS服务器利用PORTMAP或者rpcbind服务查询NFS的工作端口(redhat5为portmat,6之后为rpcbind)。

3)客户机联系要装载的分区,同时服务器会验证客户机是否有权加载。

4)客户机更新MTAB文件,表示加载成功。

Redhat 6.2变更了portmap服务为rpcbind,在使用nfs时这点与redhat5不同,下面配置一个nfs系统,用来使局域网内的所有用户均可访问该目录,可将该目录配置成yum源,供内网机器安装软件;首先安装NFS套件,命令如下:

yum install nfs-utils.x86_64(64位系统)
yum install nfs-utils(32位系统)

然后安装portmap服务,portmap在redhat6中改名为rpcbind。
yum install rpcbind(redhat6)
yum install portmap(redhat5)

配置nfs服务端
vim /etc/exports

添加
/home/nfshare 192.168.0.0/24(ro,no_root_squash)
这一行表明本机的/home/nfshare这个目录为nfs共享目录,可访问的ip地址区间为192.168.0.0-192.168.0.254,权限为只读,当访问者为root用户时访问该目录具有root权限

重启nfs服务
/etc/init.d/rpcbind start
/etc/init.d/nfs start

将nfs加入开机启动项
chkconfig nfs on

客户端配置
查看是否能访问nfs服务
showmount -e 192.168.0.10

Export list for 192.168.0.10:
/opt/redhat6 192.168.0.11

表示可以访问,如不可访问查看nfs服务端nfs服务是否启用,防火墙是否允许通过。

挂载nfs目录
mkdir /opt/redhat6
mount 192.168.0.10:/opt/redhat6/ /opt/redhat6/
配置开机自动挂载(实际生产环境中,一般不这么干,可能因为网络等因素出现问题)
vi /etc/fstab
添加
192.168.0.10:/opt/redhat6 /opt/redhat6 nfs nodev,ro,rsize=32768,wsize=32768 0 0


NFS基本配置

查询软件是否安装:

[root@freeoa ~]# rpm -qa | grep nfs
nfs-utils-1.0.9-40.el5
nfs-utils-lib-1.0.8-7.2.z2

[root@freeoa ~]# rpm -qa | grep protmap(注意redhat6的话。换成 rpm -qa|grep rpcbind )
[root@freeoa ~]# rpm -ivh /misc/cd/Server/portmap-4.0-65.2.2.1.i386.rpm

这个软件已经安装了,下面列出一些常见指令及目录的作用介绍。
 
/etc/exports
这个是NFS的主要配置文件,但没有默认值,空的。

/usr/sbin/exportfs:用在服务端,用来查看本服上利用nfs对外共享了哪些目录

维护NFS共享资源的命令

/usr/sbin/showmount:用在客户端,用来查看某个nfs服务器共享出来的目录

exportfs用在server端,而showmount则用在客户端,这个命令可以查看NFS服务器共享出来的目录资源。

/var/lib/nfs/
该目录下有两个重要的日志文件,etab:主要记录NFS共享出来的完整权限设定值,xtab:记录曾连接到此主机的客户机相关数据。(这里xtab不知道为啥为空,反倒有个rmtab文件,记录了曾连到此主机的客户机相关数据)
 
showmount -e nfs_server_ip:查看nfs服务器共享的目录,在客户端执行
showmount -a:查看本机共享出去的目录,在nfs服务端执行

exports内的常用权限参数:
rw //可读写的权限
ro //只读权限
sync //数据同步写入到内存与硬盘中
async //数据只会暂存在内存中
no_root_squash //如果使用root用户登录,就有root用户的权限
root_squash //如果使用root用户登录,就会变成匿名用户的权限
all_squash  //不管以什么用户登录,都会变成匿名用户的权限
anonuid //匿名用户uid设置值, 就是说匿名的时候,使用nfs服务器上的哪个用户,指定的就是要使用的哪个用户的uid
anongid //匿名用户gid设置值


配置示例:
[root@freeoa ~]# vi /etc/exports
/tmp    *(rw)
所有人对/tmp目录都有读写权限。

/tmp    *(ro)   192.168.100.100(rw)
所有人对/tmp目录二都有只读权限,而192.168.100.100对这个目录有读写权限。

/tmp    192.168.100.0/24(ro)    192.168.100.100(rw)
192.168.100.0/24这个网段人用户对这个目录有只读权限,而192.168.100.100对这个目录有读写权限。

/tmp    *(ro,all_aquash,anonuid=100,anongid=100)
所有人对这个目录都会变成服务器中uid为100,gid为100的用户的权限

[root@freeoa ~]# service nfs restart


NFS挂载

手工挂载:
mount -t nfs 192.168.100.20:/home /tmp

-t //指定文件类型

ip地址是服务器的地址(也可以使用主机名代替),:后是共享目录,

/mnt是挂载到本机的目录

也可以这样:
mount.nfs 192.168.100.20:/home /mnt

开机自动挂载:
[root@freeoa ~]# vi /etc/fstab

192.168.100.20:/home    /mnt     nfs     defaults   0 0

服务器名称/ip地址:共享目录   挂载点 文件类型  挂载选项 备份频率 检查选项

[root@freeoa ~]# vi /etc/rc.d/rc.local

mount.nfs 192.168.100.20:/home /mnt

NFS自动挂载和自动缷载

当使用NFS共享文件时,需要首先挂载,挂载后用户又不是一直在线,只要任一方离线,都会造成另一方等待超时,那么有没有一个方法能让用户使用时自动挂载,想不使用时自动缷载?当然是有的,那就是使用autofs这个服务。在客户端配置:
[root@freeoa ~]# vi /etc/auto.master
/nfs    /etc/autonfs.conf //添加这一行
/nfs //挂载的主目录。

/etc/autonfs.conf //挂载文件的配置。

[root@freeoa ~]# mkdir /nfs //添加目录
[root@freeoa ~]# vi /etc/autonfs.conf //编辑并创建自动挂载文件
home    192.168.100.20:/home

home     //本地目录
192.168.100.20:/home //远程挂载的共享目录

中间可以添加一引些挂载选项。

[root@freeoa ~]# service autofs restart

[root@freeoa ~]# ls /nfs/home  //第一次使用时是没有这个目录的,当访问这个目录时就会自动挂载了,当5分钟没有使用就会自动缷载。


NFS常用命令
exportfs //查看已共享的目录(服务器端使用)

exportfs选项:
-a //全部mount或umount /etc/exports中的内容

-u //umount内容

-r //重新mount /etc/exports中的内容

-o //共享选项

-v //在exports的时候,将共享的目录显示到屏幕上

如果我们修改了/etc/exports后,并不需要重启nfs服务,只要用exportfs重新扫描一次/etc/exports,并且重新加载即可

语法: exportfs [-aruv]
 -a:全部挂载(或卸载) /etc/exports档案内的设定
 -r:重新挂载/etc/exports里面的设定,也同步的更新/etc/exports和/var/lib/nfs/xtab里面的内容
 -u:卸载某一目录
 -v:在export的时候,将分享的目录显示到荧屏上.

例子
#exportfs -rv //重新export一次
#exportfs -au //全部卸载,这样已经挂载的客户端会访问不到nfs目录, 不过如果紧接着 exportfs -ar的话。客户端无须重新mount,可以直接访问

客户端查询:
[root@freeoa ~]# showmount -a 192.168.100.20

[root@freeoa ~]# showmount -e 192.168.100.20

NFS常见故障

如果还有人在使用NFS,这时服务器需要关机的话,是不能关机的,系统会等到没有用户使用时再关机,如果关机时间很长,看看是不是还有用户在线。另外如果使用的是服务器名挂载,要确保服务器名是能解析的。如果没有DNS服务器,可以在/etc/hosts中添加。

[root@freeoa ~]# vi /etc/hosts.deny  //拒绝以下两台主机访问。

mountd:192.168.100.198,192.168.100.200

接下来实现自动挂载:

方法有三种:第一种修改/etc/fstab文件,第二种修改/etc/rc.d/rc.local文件,第三种实现自动挂载和自动缷载。这里就以第三种为例:

[root@freeoa /]# vi /etc/auto.master
/nfs    /etc/autonfs.conf //添加这一行

[root@freeoa /]# vi /etc/autonfs.conf //在这之前这个文件是没有的,当编辑好保存之后就有了。
nfs     192.168.100.203:/mydata
cdrom   192.168.100.203:/misc/cd

[root@freeoa /]# service autofs restart

配置完成,就可以开始测试了。

CentOS 7 下开启NFS相关服务

启动NFS相关的服务,并设置NFS相关服务开机自动启动
systemctl restart rpcbind.service
systemctl restart nfs
systemctl restart nfs-server

防火墙放行NFS及相关服务
firewall-cmd --permanent --add-service=nfs
firewall-cmd --permanent --add-service=mountd
firewall-cmd --permanent --add-service=rpc-bind
#不加此条客户端会报错clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)
# firewall-cmd --reload

CentOS 7 下关闭rpcbind服务

centos 7安装完成后,会发现有进程监听了0.0.0.0:111端口,这可能会存在安全风险,可以将其禁用掉。实际使用进程为rpcbind,大部分服务是不依赖于rpcbind的,只有NFS需要用到这个服务。

禁止rpcbind服务的命令:

# 停止进程
systemctl stop rpcbind.socket
systemctl stop rpcbind

# 禁止随开机启动
systemctl disable rpcbind.socket
systemctl disable rpcbind


配置/etc/exports文件

要让其它系统可以使用Linux系统中的目录,需要导出该目录。将与导出目录有关的信息添加到/etc/exports 文件就可以永久完成导出工作。下面显示了/etc/exports 文件的格式:
Directory Host(options...) Host(options...) # Comments

在该示例中,Directory指明要共享的目录名称,Host 指明该目录的共享仅限哪些客户端计算机。
Options包括各种选项,可用来定义与主机共享目录相关的安全措施(可以重复Host/Option 对)。
Comments为可添加的任意可选注释(紧跟在#符号之后)。

exports手册页(man exports)包含了关于/etc/exports文件语法的详细内容。特别是可以查看用来限制和保护每个共享目录的相关选项。作为root用户,可以使用任何文本编辑器来配置/etc/exports,从而修改共享目录项或者添加新项。下面显示了/etc/exports文件的一个示例:
/cal    *.linuxtoys.net(rw)    # Company events
/pub *(ro,insecure,all_squash)    # Public dir
/home        maple(rw,root_squash) spruce(rw,root_squash)

/cal 项表示一个目录,其中包含了与公司有关事件的信息。公司域(*.linuxtoys.net)中的任何计算机都可以挂载该NFS共享。用户可以向该目录写入文件以及读取文件(由rw 选项表示)。注释(#Company events)只是提醒目录包含了哪些内容。

/pub 项代表公共目录。它允许任何计算机和用户从目录中读取文件(使用ro 选项表示),但不能写入文件。其中insecure选项能够让任何计算机(甚至包括那些没有使用安全 NFS 端口的计算机)访问该目录。而 all_squash 选项则将所有用户(UID)和组(GID)映射到用户ID 65534(该用户ID表示RHEL中的 nfsnobody 用户以及 Ubuntu 中的 nobody 用户),并赋予他们对文件和目录的最低权限。

/home 项能够让一组用户使用不同计算机上相同的/home目录。例如,假设正在共享计算机 oak 上的/home目录,名为 maple 和 spruce 的计算机可以分别在自己的/home目录上挂载该目录。如果在所有计算机上为所有用户赋予相同的用户名/UID,那么就可以让每一个用户使用相同的/home/user目录,而不管该用户登录到哪台计算机。root squash 用于防止来自其他计算机的 root 用户拥有对该共享目录的 root权限。

上面列举的只是一些示例:可以共享任何所选择的目录,包括整个文件系统()。如果共享整个文件系统或者文件系统中比较敏感的部分(比如/etc),是会存在很大安全隐患的。接下来将介绍可添加到/etc/exports 文件上的安全选项。

1、主机名或来源写法,通配符或NIS组

2、ro与rw表明所共享的资源是否可写等。

3、用户映射选项
root用户:默认情况下客户端的 root 用户被映射到 nfsnobody 用户名(UID 65534),从而防止客户端计算机的root用户更改共享文件系统中的文件和目录。如果想要客户端的root用户拥有服务器上的root权限,可以使用no_root_squash选项。

请记住,即使客户端的root用户的权限受到限制,但他们仍然可以成为服务器上任何其他的用户账户,并访问这些用户账户的文件。所以在以读取/写入方式与客户端共享目录时,请确保信任root用户可以使用所有的用户数据。

nfsnobody或nobody用户/组一通过使用 65534 用户ID和组ID,所创建的用户/组所拥有的权限不允许访问服务器上属于任何真正用户的文件,除非这些用户对所有人开放权限。然而对于那些被指定为65534用户或组的人来说,65534用户或组所创建的文件都是可用的。如果想要将所有远程用户设置为 65534 用户/组,可以使用 all_squash 选项。

65534 UID 和 GID 用来防止该ID遇上有效的用户或组ID。通过使用 anonuid 或 anongid 选项,可以分别更改65534用户或者组。例如 anonuid=175 将所有 anonymous 用户设置为UID 175。而 anongid=300 则将GID设置为 300(只有当列出文件权限时才会显示该编号,除非为新的 UID 和 GID 向/etc/password 和/etc/group 中添加有名称的项)。

用户映射如果用户拥有一组计算机的登录账号(并且ID相同),那么默认情况下 NFS 映射到该ID。这意味着如果计算机 maple上的用户mike(UID 110)在计算机pine上拥有账号(mike,UID 110),那么他就可以从任何一台计算机使用任何计算机上已经远程挂载的文件。如果尚未在服务器上设置的客户端用户在挂载的NFS目录上创建了一个文件,那么该文件将被分配给远程用户 UID 和 GID(在服务器上使用 Is-I,显示所有者的 UID)。使用 map_static 选项,可以识别那些包含了用户映射的文件。

导出共享文件系统
向/etc/exports文件添加相关条目后,运行exportfs命令导出这些目录,从而使网络上的其他计算机可以使用它们。重启计算机或者重启 NFS 服务,会自动运行exportfs 命令,从而导出相关目录。如果想要立即导出它们,可以 root 用户身份通过命令行运行 exportfs 命令。

服务安全

当加密技术以及其他安全措施还没有普遍地内置到网络服务(比如远程登录、文件共享以及远程执行)中时,NFS设置就已经被创建了。因此,NFS(甚至到了版本3)存在一些比较突出的安全问题。NFS的安全问题使其成为一种不适合通过公共网络使用的设施,甚至使其难以在一个组织、企业中安全地使用。NFS的安全问题主要包括以下几点:

远程root用户:即使是使用默认的 root squash(该选项防止 root 用户拥有对远程共享的 root 访问权限),任何可使用共享NFS目录的计算机上的 root 用户都可以访问任何其他用户账户。因此,如果正在共享带有读取/写入权限的主目录,那么任何可使用该共享主目录的计算机上的root用户都可以访问这些主目录中的内容。

未加密的通信:因为 NFS 流量都没有被加密,所以任何试图嗅探网络的人都可能看到正在被传输的数据。

用户映射:NFS共享的默认权限是通过用户ID完成映射的。例如,NFS 客户端上的用户(UID 500)可以访问NFS服务器上UID 500用户所拥有的文件,而不管所使用的用户名是什么。

文件系统结构公开:直到NFSv3,如果通过NFS共享了一个目录,那么就公开了该目录在服务器文件系统中的位置(换句话说,如果共享了/var/stuff目录,那么客户端将知道/var/stuff是该目录在服务器上的实际位置)。

上面讲的都是些坏消息。但好消息是在 NFSv4 中,上面所介绍的大部分问题都得到了解决(購需要完成一些额外的配置)。通过集成 Kerberos 支持,NFSv4 可以根据每个用户所获取的 Kerberos票据(Kerberos ticket)配置用户访问。而对于你来说,额外需要完成的工作是配置Kerberos 服务器。至于公开NFS共享位置,通过使用NFSv4,可以将共享目录绑定到/exports目录,这样一来,当共享
目录时,这些目录的实际位置并没有公开。

访问 https:/help.ubuntu.com/community/NFSv4Howto了解更多关于 Ubuntu 中 NFSv4 的相关功能。至于与 NFS 相关的标准 Linux 安全功能,iptables防火墙、TCP Wrapper(过时但可用) 以及 SELinux 在保护通过远程客户端访问NFS服务器方面都发挥了重要的作用。尤其是让iptables防火墙功能使用NFS特别具有挑战性。后续章节将会介绍这些安全功能。

在SELinux中的文件上下文:

nfs_export _all_ro:如果将该布尔值设置为开启,SELinux 将允许使用 NFS 共享带有只读权限的文件。不管共享文件和目录上的 SELinux 文件上下文设置是什么,NFS只读文件共享都将被允许。

nfs_export_all_rw:如果将该布尔值设置为开启,SELinux将允许使用NFS共享带有读取/写入权限的共享文件。和前面的布尔值一样,不管共享文件和目录上的SELinux文件上下文设置是什么,NFS可读写文件共享都将被允许。

use nfs home dirs:为了允许 NFS 服务器通过NFS共享主目录,需要将该布尔值设置为开启。

在上面所述的布尔值中,前两个布尔值默认情况下是开启的,而 use_nfs_home_dirs 布尔值是关闭的。为了打开 use_nfs_home_dirs 目录,可以输入下面的命令:
# setsebool -p use_nfs_home_dirs on

然而,通过更改希望通过NFS共享的文件和目录上的文件上下文,可以忽略所有与NFS文件共享相关的布尔值。可以在任何希望通过 NFS(或者其他文件共享协议,比如 HTTP、FTP等)共享的目录上设置 pubic_content_t 和 public_content_rw_t 文件上下文。例如,为了允许通过NFS 以读取/写入方式共享/whatever 目录及其子目录,需要输入下面所示的命令设置并应用相关规则:
# semanage fcontext -a -t public_content_rw_t "/whatever(/.*)?"
# restorecon -F -R -v /whatever

如果希望用户仅能读取某一目录中的文件,而不能写入目录,可以为该目录分配 public_content_t 文件上下文。

挂载与使用

为设置NFS文件系统,以便在每次启动Linux系统时自动在特定挂载点进行挂载,需要向/etc/fstab文件添加关于该NFS文件系统的相关条目。该文件包含了系统中各种不同类型的已挂载(以及可用来挂载)文件系统的信息。下面显示了向本地系统添加NFS文件系统所使用的格式:
host:directory    mountpoint nfs    options    0 0

第一项(host:directory)标识 NFS 服务器计算机和共享目录。mountpoint 是挂载 NFS目录的本地挂载点。紧跟其后的是文件系统类型(nfs)。任何与挂载相关的选项都以一个逗号分隔列表的形式出现(最后两个“0”分别配置了系统不转储文件系统的内容以及不在该文件系统上运行fsck)。下面显示了/etc/fstab 中 NFS项的示例:
maple:/stuff /mnt/maple nfs bg,rsize=8192,wsize=8192 0 0
oak:/apps    /oak/apps    nfs    noauto,ro    0    0

在第一个示例中,来自计算机maple的远程目录/stuff(maple:/stuff)被挂载到本地目录/mnt/maple(本地该目录必须已经存在)。如果是因为共享不可用而导致挂载失败,bg将会使挂载尝试进入后台,以便日后重试。

文件系统类型为nfs,读取(rsize)和写入(wsize)缓冲区大小被设置为8192,从而加快与相关连接的数据传输速率。在第二个示例中,远程目录为计算机oak上的/apps。该目录被设置为一个可本地挂载到/oak/apps目录上的 NFS 文件系统(nfs)。然而该文件系统并不会被自动挂载(noauto),并且只能在系统已经运行之后通过使用mount命令以只读方式(ro)进行挂载。

提示:默认情况是将NFS文件系统挂载为可读/写。然而对于导出文件系统,默认是以只读方式进行。如果无法对NFS文件系统进行写入操作,请检查该文件系统是否是以可读取/写入的方式从服务器导出。

1.挂载noauto文件系统
/etc/fstab文件可能还包含其他没有被自动挂载的文件系统的设备。例如硬盘中偶尔需要挂载的多个磁盘分区或者 NFS 共享文件系统。noauto 文件系统可以被手动挂载。其优点是当输入 mount 命令时,只需输入少量的信息,而其他信息则由/etc/fstab文件中的内容填充。例如可以输入:
# mount /oak/apps

使用此命令时,mount知道检查/etc/fstab文件,获取将要挂载的文件系统(oak:/apps)、文件系统类型(nfs)以及相关选项(选项为 ro,即只读)。此时并不需要输入本地挂载点(/oak/apps),而只需要输入远程文件系统名称(/oak/apps)并填充其他信息。

2.使用挂载选项
可向/etc/fstab文件(或者向 mount 命令行本身)添加多个mount选项,从而影响文件系统的挂载方式。向/etc/fstab文件添加选项时,必须用逗号分隔各个选项。例如,当挂载 oak:/apps 时,可以使用noauto、ro 和 hard 选项:
oak:/apps /oak/apps nfs noauto,ro,hard 0 0

下面列举了一些对挂载NFS文件系统非常有用的选项。可以通过nfs手册页(man 5 nfs)了解;可添加到/etc/fstab文件的其他相关NFS挂载选项:

hard:如果使用了该选项并且NFS服务器断开连接或者关闭了,但同时一个进程正在等待访问该服务器时,该进程将被挂起,直到服务器恢复为止。如果要求正在使用的数据与正在访问该数据的程序保持同步,那么该选项是很有帮助的(这是默认行为)。

soft:使用该选项时,如果NFS服务器断开连接或者关闭了,试图访问服务器数据的进程在经过设定的时间后会超时。此时会向试图访问NFS服务器的进程发送一个输入输出错误。

rsize:当NFS客户端从NFS服务器读取数据时,该选项确定了客户端使用的数据块大小(以字节为单位)。其默认值为1024。如果使用更大的数字(比如8192),可以在较快的网络上(如LAN)获得更好的性能,并且相对较少出错(因为没有过多干扰或冲突)。

wsize:当NFS客户端向NFS服务器写入数据时,该选项确定了NFS客户端使用的数据块大小(以字节为单位)。其默认值为 1024。性能问题与 rsize 选项相同。

timeo=#:设置RPC超时多长时间之后进行第二次传输,其中#表示十分之几秒,其默认值为十分之七秒。每次连续超时都会导致超时值成倍增加(最高达到60秒)。如果认为是因为服务器响应速度慢或者网络速度慢而导致超时,可以增加该值。

retrans=#:设置了在发生重大超时前次要超时数和重新传输次数。

retry=#:设置多少分钟之后继续重试失败的挂载请求,其中#表示重试的分钟数。其默认值是10000分钟(大约1周时间)。

bg:如果第一次挂载尝试超时,可以尝试在后台完成所有的后续挂载。如果正在挂载一个缓慢或偶尔可用的NFS文件系统,那么该选项是非常有用的。通过将挂载请求放置到后台,系统可以继续挂载其他文件系统,而不会等待当前挂载的完成。

注意:如果缺少嵌套的挂载点,就会产生超时,从而允许添加所需的挂载点。例如将/usr/trip和/usr/rip/extra挂载为 NFS文件系统,但是当尝试挂载/usr/trip/extra时/usr/trip还没有被挂载,此时/usr/trip/extra将超时;如果运气好的话,在下次尝试时/usr/trip已经挂载,那么可以继续挂载/usr/trip/extra。

fg:如果第一次挂载尝试超时,尝试将在前台完成后续的挂载。这是默认的行为。如果要求在继续之前该挂载必须成功(例如,正在挂载/usr),那么可以使用该选项。并不是所有的NFS挂载选项都必须添加到/etc/fstab文件中。在客户端可配置/etc/nfsmount.conf文件中 Mount、Server 和 Global 部分。在Mount部分,可以指明当NFS文件系统被挂载到一个特定的挂载点时使用哪些挂载选项。Server部分允许将选项添加到从特定的NFS服务器挂载的任何 NFS文件系统。Global选项适用于来自客户端的所有 NFS挂载。

/etc/nfsmount.conf 文件中的下面所示项为任何从系统thunder.example.com 挂载的 NFS目录设置了32KB的读取和写入块大小:
[ Server "thunder.example.com"]
rsize=32k
wsize=32k

如果想为系统的所有 NFS 挂载设置默认选项,可以取消注释 NFSMount_Global_Options 块。在该块中可以设置协议、NFS 版本以及传输速率和重试设置。下面显示了NFSMount_Global_Options块的示例:
[ NFSMount_Global_Options ]
# This sets the default version to NFs 4
Defaultvers=4
# Sets the number of times a request will be retried before
# generating a timeout
Retrans=2
# Sets the number of minutes before retrying a failed
# mount to 2 minutes
# Retry=2

在该示例中,默认的NFS版本为4。在发生超时之前数据将被转发两次(2)。而在重试失败的传输之前等待时间为2分钟。如果想要重写这些默认值,可以向/etc/fstab文件中添加挂载选项,或者在挂载NFS目录时向 mount 命令添加挂载选项。

当然可以配置使用autofs(自动挂载文件系统)来实现自动挂载功能。

尝试卸载文件系统时如果得到消息 device is busy,则意味着卸载失败,因为文件系统正在被访问。最可能的情况是 NFS 文件系统中的某个目录是Shell的当前目录(或者系统中某人的Shell)。另一种可能的原因是某个命令正在将NFS文件系统中的一个文件保持为打开状态(如文本编辑器)。检查Terminal窗口以及其他Shell,如果正在其中,使用cd退出该目录或者关闭Terminal窗口。如果NFS文件系统没有被卸载,可以将其强制卸载(umount -f /mnt/maple)或者稍后卸载并清除(umont -l /mnt/maple)。-l 选项通常是更好的选择,因为强制卸载可能中断正在进行的文件修改。另一种方法是运行fuser -v mountpoint,查看哪些用户正在保持挂载的NFS共享为打开状态,然后使用 fuser -k mountpoint,杀死所有进程。