一、NFS工作原理

  • 1.1什么是NFS服务器
    NFS就是Network File System的缩写,它最大的功能就是可以通过网络,让不同的机器、不同的操作系统可以共享彼此的文件(share files)。这个NFS服务器可以让PC将网络中的NFS服务器共享的目录挂载到本地端的文件系统中,而在本地端的系统中来看,那个远程主机的目录就好像是自己的一个磁盘分区一样,在使用上相当便利
  • 1.2NFS挂载原理
    NFS服务器的挂载结构图:
  • nfs修改权限 nfs 权限_nfs修改权限

  • 如上图示:
    当我们在NFS服务器设置好一个共享目录/home/public后,其他的有权访问NFS服务器的NFS客户端就可以将这个目录挂载到自己文件系统的某个挂载点,这个挂载点可以自己定义,如上图客户端A与客户端B挂载的目录就不相同。并且挂载好后我们在本地能够看到服务端/home/public的所有数据。如果服务器端配置的客户端只读,那么客户端就只能够只读。如果配置读写,客户端就能够进行读写(当然所挂载的文件本身要具有可写可读权限)。挂载后,NFS客户端查看磁盘信息命令:#df –h。
    既然NFS是通过网络来进行服务器端和客户端之间的数据传输,那么两者之间要传输数据就要有想对应的网络端口,NFS服务器到底使用哪个端口来进行数据传输呢?基本上NFS这个服务器的端口开在2049,但由于文件系统非常复杂。因此NFS还有其他的程序去启动额外的端口,这些额外的用来传输数据的端口是随机选择的,是小于1024的端口;既然是随机的那么客户端又是如何知道NFS服务器端到底使用的是哪个端口呢?这时就需要通过远程过程调用(Remote Procedure Call,RPC)协议来实现了!
  • 1.3什么是RPC
    因为NFS支持的功能相当多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此NFS的功能对应的端口并不固定,而是随机选取一些未被使用的小于1024的端口用于传输。但是如此一来就会产生客户端连接服务器的问题,因为客户端要知道服务端的相关端口才能够连接。
    这时要知道服务端对应功能的端口就需要远程过程调用(RPC)服务了。RPC就是用来统一管理NFS端口的服务,并且统一对外的端口是111,RPC会记录NFS端口的信息,如此我们就能够通过RPC实现服务端和客户端沟通端口信息。PRC最主要的功能就是指定每个NFS功能所对应的port number,并且通知客户端,记客户端可以连接到正常端口上去
    那么RPC又是如何知道每个NFS功能的端口呢?
    当服务器在启动NFS时就会随机的使用一些端口,并主动向RPC去注册这些端口,RPC就会记录下这些端口,因此RPC就可以知道每个端口对应的NFS功能。并且RPC会开启111端口,等待客户端RPC的请求,如果客户端有请求,那么服务器端的RPC就会将之前记录的NFS端口信息告知客户端。如此客户端就会获取NFS服务器端的端口信息,就会以实际端口进行数据的传输了。
    提示:在启动NFS SERVER之前,首先要启动RPC服务(即CentOS5.x以前的portmap服务,下同)否则NFS SERVER就无法向RPC服务区注册,另外,如果RPC服务重新启动,原来已经注册好的NFS端口数据就会全部丢失。因此此时RPC服务所管理的NFS程序也要重新启动以重新向RPC注册。特别注意:一般修改NFS配置文档后,是不需要重启NFS的,直接在命令执行/etc/init.d/nfs reload或exportfs –rv即可使修改的/etc/exports生效。
  • 1.4 NFS客户端和NFS服务端通讯过程
    当客户端有NFS文件访问需求时,它会如何向服务器端请求数据呢?

    上图过程说明如下:
    1)首先服务器端启动RPC服务,并开启111端口
    2)服务器端启动NFS服务,并向RPC注册端口信息
    3)客户端启动RPC(portmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口
    4)服务端的RPC(portmap)服务反馈NFS端口信息给客户端。
    5)客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。
    由上图可知无论是客户端还是服务端,要使用nfs时,两者都需要启动RPC服务才行。

二、NFS服务器启动的RPC daemons

NFS服务器在启动的时候需要向RPC注册,所以NFS服务器也称为RPC Server 之一。NFS服务器启动时至少需要两个守护进程(daemon),一个是管理客户端是否能够登录的问题,一个管理客户端能够取得的权限。对于功能比较简单的NFS服务器来说,需要启动一下daemon。
rpc.nfsd
最主要的NFS服务提供程序。这个daemon主要的功能就是管理客户端是否能够使用服务器文件系统挂载信息等,其中还包含判断这个登录用户的ID。
rpc.mountd
这个daemon主要的功能则是在于管理NFS的文件系统。当客户端顺利地通过rpc.nfsd登录服务器之后,在它可以使用NFS服务器提供的文件之前,还会经过文件权限(就是-rwxrwxrwx与owner,group那几个权限)的认证程序。它会去读NFS的配置文件/etc/exports来比对客户端权限,通过这一关后客户端就可以取得使用NFS文件的权限了。(这个daemon也就是用来管理NFS共享目录的权限与安全设置的地方)
rpc.lockd(非必要)
这个daemon可以用于管理文件的锁定(lock)方面。为何文件需要锁定呢?以为既然共享的NFS文件可以让客户端使用,那么当多个客户端同时尝试写入某个文件时,就可能对改文件造成一些问题。rpc.lockd则可以用来克服这些问题。但是rpc.lockd必须要同时在客户端与服务端都开启才行。此外rpc.lockd也常与rpc.statd同时启动。
rpc.statd(非必要)
这个daemon可以用来检查文件的一致性,与rpc.lockd有关。若发生因为客户端使用同一个文件造成文件可能有所损毁时,rpc.statd就可以用来检测并尝试恢复改文件。同样rpc.statd也必须要在客户端与服务端同时启动才会生效。
上述这几个 RPC 所需要的程序,其实都已经写入到两个基本的服务启动脚本中了,那就是 nfs 以及 nfslock ,亦即是在 /etc/init.d/nfs, /etc/init.d/nfslock,与服务器较有关的写入在 nfs 服务中,而与客户端的 rpc.lockd 相关的,就设置于 nfslock 服务中

三、NFS的文件访问权限

在NFS服务器的挂载结构图环境中,假如我在 NFS client 1 上面以 dmtsai 这个使用者身份想要去存取 /home/public 这个来自 NFS server 所提供的文件系统时, 请问 NFS server 所提供的文件系统会让我以什么身份去访问?

为什么会这么问呢?这是因为 NFS 本身的服务并没有进行用户身份验证, 所以说,当你在客户端以 dmtsai 的身份想要存取服务器端的文件系统时, 服务器端会以客户端的使用者 UID 与 GID 等身份来尝试读取服务器端的文件系统。这时有个有趣的问题就产生啦! 那就是如果客户端与服务器端的使用者身份并不一致怎么办? 我们以底下这个图示来说明一下好了:

NFS的服务端与客户端的用户身份确认机制:

nfs修改权限 nfs 权限_nfs修改权限_02


当我以 dmtsai 这个一般身份使用者要去存取来自服务器端的档案时,你要先注意到的是: 文件系统的 inode 所记录的属性为 UID, GID 而非账号与群组名。 那一般 Linux 主机会主动的以自己的 /etc/passwd, /etc/group 来查询对应的使用者、组名。 所以当 dmtsai 进入到该目录后,会参照 NFS client 1 的使用者与组名。 但是由于该目录的档案主要来自 NFS server ,所以可能就会发现几个情况:

NFS server/NFS client 刚好有相同的账号与群组

则此时使用者可以直接以 dmtsai 的身份进行服务器所提供的文件系统之存取。

NFS server 的 501 这个 UID 账号对应为 vbird

若 NFS 服务器上的 /etc/passwd 里面 UID 501 的使用者名称为 vbird 时, 则客户端的 dmtsai 可以访问服务器端的vbird这个用户文件,只因为两者具有相同的 UID 而已。这就造成很大的问题了!因为没有人可以保证客户端的 UID 所对应的账号会与服务器端相同, 那服务器所提供的数据不就可能会被错误的使用者乱改?

NFS server 并没有 501 这个 UID

另一个极端的情况是,在服务器端并没有 501 这个 UID 的存在,则此时 dmtsai 的身份在该目录下会被压缩成匿名者, 一般 NFS 的匿名者会以 UID 为 65534 为其使用者,早期的 Linux distributions 这个 65534 的账号名称通常是 nobody ,我们的 CentOS 则取名为 nfsnobody 。但有时也会有特殊的情况,例如在服务器端分享 /tmp 的情况下, dmtsai的身份还是会保持 501 但建立的各项数据在服务器端来看,就会属于无属主数据。

如果使用者身份是 root 时

有个比较特殊的使用者,那就是每个 Linux 主机都有的 UID 为 0 的 root 。 想一想,如果客户端可以用 root 的身份去存取服务器端的文件系统时,那服务器端的数据哪有什么保护性? 所以在默认的的情况下, root 的身份会被主动的压缩成为匿名用户

总之,客户端使用者能做的事情是与 UID 及其 GID 有关的,那当客户端与服务器端的 UID 及账号的对应不一致时, 可能就会造成文件系统使用上的困扰,这个就是 NFS 文件系统在使用上面的一个很重要的地方! 而在了解用户账号与 UID 及文件系统的关系之后,要实际在客户端以 NFS使用服务器端的文件系统时, 你还得需要具有:

1)NFS 服务器已经开放可写入的权限 (与 /etc/exports 设定有关);
2)实际的文件权限具有可写入 (w) 的权限

当你满足了 (1)使用者账号,亦即 UID 的相关身份; (2)NFS 服务器允许有写入的权限; (3)文件系统确实具有 w 的权限时,你才具有该文件的可写入权限。

四、NFS server端的部署

查看系统信息

cat /etc/redhat-release 
CentOS release 6.9 (Final)
uname -a
Linux kelongcentos6.6 2.6.32-696.18.7.el6.x86_64 #1 SMP Thu Jan 4 17:31:22 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
  • 4.1NFS server端配置
    既然要使用 NFS 的话,就得要安装 NFS 所需要的软件了。
    4.1.1所需要的软件
    以 CentOS 6.x 为例的话,要设定好 NFS 服务器我们必须要有两个软件才行,分别是:
    RPC 主程序:rpcbind
    NFS 其实可以被视为一个 RPC 服务,而要启动任何一个 RPC 服务之前,都需要做好 port 的对应 (mapping) 的工作才行,这个工作其实就是『 rpcbind 』这个服务所负责的!也就是说, 在启动任何一个 RPC 服务之前,都需要启动 rpcbind 才行! (在 CentOS 5.x 以前这个软件称为 portmap,在 CentOS 6.x 之后才称为 rpcbind 的!)
    NFS 主程序:nfs-utils
    就是提供 rpc.nfsd 及 rpc.mountd 这两个 NFS daemons 与其他相关 documents 与说明文件、执行文件等的软件!这个就是 NFS 服务所需要的主要软件,一定要有。
    NFS服务器端和Client端都需要这安装这两个软件。客户端可以不启动nfs-utils但是必须要开启rpcbind
    查询系统中有没有这两个软件
# rpm -qa |grep -Ei "nfs|rpcbind"
nfs-utils-1.2.3-75.el6_9.x86_64
nfs-utils-lib-1.1.5-13.el6.x86_64
rpcbind-0.2.0-13.el6_9.1.x86_64

如果没有使用 yum install nfs-utils rpcbind 来安装。
查看这两个软件包在电脑里都安装了什么文件

rpm -ql nfs-utils rpcbind

4.1.2 NFS软件结构介绍
NFS软件很简单,配置文件只有一个。下面是主要软件说明;
1)主要配置文件:/etc/exports
这个文件就是 NFS 的主要配置文件了!不过,系统并没有默认值,所以这个文件不一定会存在,你可能必须要使用 vim 主动的建立起这个文件!

2)NFS 文件系统维护命令:/usr/sbin/exportfs
这个是维护 NFS 分享资源的命令,我们可以利用这个命令重新分享 /etc/exports 更新的目录资源、将 NFS Server 分享的目录卸载或重新分享等等

3)共享资源的日志文件:/var/lib/nfs/*tab
在 NFS 服务器中,日志文件都放置到 /var/lib/nfs/ 目录里面,在该目录下有两个比较重要的日志文件, 一个是 etab ,主要记录了 NFS 所分享出来的目录的完整权限设定值;另一个 xtab 则记录曾经链接到此 NFS 服务器的相关客户端数据。

4)客户端查询服务器共享资源的命令:/usr/sbin/showmount
这是另一个重要的 NFS 指令。exportfs 是用在 NFS Server 端,而 showmount 则主要用在 Client 端。这个 showmount 可以用来查看 NFS 分享出来的目录资源。
4.1.3 /etc/exports 配置文件的语法与参数

# vi /etc/exports

    /tmp/data     192.168.1.0/24(ro)          client-A.ctos.zu(rw,sync)  localhost(rw)

  #[共享目录]       [客户端地址1(权限)]        [客户端地址2(权限)]          [本地主机]

以上是一个简单案例配置,每一行最前面是要共享出来的目录,注意是以目录为单位的。上面的例子说明是: 要将 /tmp/data分别分享给三个不同的主机或网域的意思。记得主机后面以小括号 () 定义权限参数, 若权限参数不止一个时,则以逗号“,” 分开。且主机名与小括号是连在一起。
至于主机名的设置主要有几个方式:

1)可以使用完整的 IP 或者是网域,例如 192.168.100.10 或 192.168.100.0/24 ,或 192.168.100.0/255.255.255.0 都可以

2)也可以使用主机名,但这个主机名必须要在 /etc/hosts 内,或可使用 DNS 找到该名称才行,反正重点是可找到 IP 就是了。如果是主机名的话,那么它还可以支持通配符,例如 * 或 ? 均可接受。
至于权限方面 (就是小括号内的参数) 常见的参数则有:

参数值

内容说明

rw,ro

该目录分享的权限是可读写 (read-write) 或只读 (read-only),但最终能不能读写,还是与文件系统的 rwx 及身份有关

sync,async

sync 代表数据会同步写入到内存与硬盘中,async 则代表数据会先暂存于内存当中,而非直接写入硬盘

no_root_squash,root_squash

客户端使用 NFS 文件系统的账号若为 root 时,系统该如何判断这个账号的身份?预设的情况下,客户端 root 的身份会由 root_squash 的设定压缩成 nfsnobody, 如此对服务器的系统会较有保障。但如果你想要开放客户端使用 root 身份来操作服务器的文件系统,那么这里就得要开 no_root_squash才行

all_squash

不论登入 NFS 的使用者身份为何, 他的身份都会被压缩成为匿名用户,通常也就是 nobody(nfsnobody)

anonuid,anongid

anon意指 anonymous (匿名用户) 前面关于 *_squash 提到的匿名用户的 UID 设定值,通常为 nobody(nfsnobody),但是你可以自行设定这个 UID 的值,当然,这个 UID 必需要存在于你的 /etc/passwd 当中。 anonuid 指的是 UID 而 anongid 则是群组的 GID

配置实例:

/home/test 192.168.1.0/24(rw,sync,all_squash,anonuid=2000,anongid=2000)
#All_squash 也就是说不管客户端是以什么样的身份来进行访问的,都会被压缩成为all_squash后面所接的用户和群组身份。这边用anonuid、anongid编号来标示

例1:让 root 保有 root 的权限
将/tmp目录共享出来让所有的人都可以访问且要让在客户端以root的身份登录到服务端还具有root权限

vim /etc/exports
 # 任何人都可以用我的 /tmp ,用通配符来处理主机名,重点在 no_root_squash
  /tmp  *(rw,no_root_squash)  #注意*与括号之间没有空格,且通配符*只能用在主机名的分辨上。且主机名要在/etc/hosts内

例2:同一目录针对不同范围开放不同权限
我要将一个公共的目录 /home/public 开放,但是只有限定我的局域网络 192.168.100.0/24 这个网域且加入ceishigroup这个组的用户才能够读写,其他来源则只能读取。

mkdir /home/public
 setfacl -m g:ceishigroup:rwx /home/public  #设置附加组
 vim /etc/exports
 /tmp          *(rw,no_root_squash)
/home/public  192.168.100.0/24(rw)    *(ro)

例3:仅给某个单一主机使用的目录设置
将一个私人的目录 /home/test 开放给 192.168.100.10 这个 Client 端使用。假设具有完整的权限用户是someone(在服务端)。

mkdir /home/test
setfacl -m u:someone:rwx /home/test
vim /etc/exports
/tmp          *(rw,no_root_squash)
/home/public  192.168.100.0/24(rw)    *(ro)
/home/test    192.168.100.10(rw)

例4:开放匿名登录的情况
我要让 *.centos 网域的主机,登入我的 NFS 主机时,可以存取 /home/linux ,但是他们存数据的时候,我希望他们的 UID 与 GID 都变成 45 这个身份的使用者,假设我 NFS 服务器上的 UID 45 与 GID 45 的用户/组名为 nfsanon。

groupadd -g 45 nfsanon
useradd -u 45 -g nfsanon nfsanon
mkdir /home/linux
setfacl -m u:nfsanon:rwx /home/linux
 vim /etc/exports
/tmp          *(rw,no_root_squash)
/home/public  192.168.100.0/24(rw)    *(ro)
/home/test    192.168.100.10(rw)
/home/linux   *.centos.vbird(rw,all_squash,anonuid=45,anongid=45)
# 如果要开放匿名,那么重点是 all_squash,并且要配合 anonuid

4.1.4 客户端连接NFS server端权限说明
NFS客户端连接到NFS服务端时,它具体对服务端共享目录的权限是什么,主要分为三种情况:
第一种:客户端与服务器端具有相同的 UID 与账号
在这种情况下如果服务器端对这个相同用户授权读写那么它就可以读写,若使用all_squash将用户压缩为指定UID用户,那么要想有权限则在服务端要让指定压缩的UID用户对共享目录具有相应权限。这个前提是服务端配置文件/etc/exports首先要开放权限。
第二种:客户端与服务器端的账号并未相同时
这种情况下如果共享的目录对所有用户放开读写,则因为在服务端找不到UID(客户端的),则会在文件属主填上UID的值。总之这种情况要看共享文件本身属性。
第三种:当客户端身份是root时
默认的情况下root身份被压缩成nobody了,如果要想对共享目录可写则在服务端让nobody这个用户对共享目录有可写权限。如果/etc/exports加入no_root_squash,则会保留root身份,即对共享目录有root权限,不安全。

  • 4.2启动NFS server端
/etc/init.d/rpcbind start  #启动rpcbind服务
/etc/init.d/nfs start          #启动nfs序,包含rpc.nfsd和rpc.mountd这两个daemon
/etc/init.d/nfslock start    #启动nfslock,与客户端有关,包含rpc.lockd以及rpc.statd这两个daemon。

  #加入开机自启动
chkconfig nfs on
chkconfig nfslock on

说明一下,在设定开机自启动时rpcbind默认比nfs先启动。

cat /etc/init.d/rpcbind 
chkconfig: 2345 13 87   
cat /etc/init.d/nfs
chkconfig: - 30 60    #因为13比30小,越小越前启动

查看启动信息:

tail /var/log/messages

查看NFS到底开了哪些端口:

netstat -tulnp| grep -E '(rpc|nfs)'

4.2.1查看NFS服务向RPC服务注册的端口情况
rpcbind 启动的 port 在 111 ,同时启动在 UDP 与 TCP;nfs 本身的服务启动在 port 2049 上;其他 rpc.* 服务启动的 port 则是随机产生的,因此需向 port 111 注册
可以使用 rpcinfo 来观察RPC 服务的注册状况
语法:

rpcinfo -p [IP|hostname]
 rpcinfo -t|-u  IP|hostname 程序名称

选项与参数:
-p :针对某 IP (未写则预设为本机) 显示出所有的 port 与 porgram 的信息;
-t :针对某主机的某支程序检查其 TCP 封包所在的软件版本;
-u :针对某主机的某支程序检查其 UDP 封包所在的软件版本;
例如:目前这部主机的 RPC 状态

rpcinfo -p localhost

例如: 针对 nfs 这个程序检查其相关的软件版本信息 (仅察看 TCP 封包)

rpcinfo -t localhost nfs
  • 4.3NFS的连接查看
    在你的 NFS 服务器设定妥当之后,我们可以在 server 端先自我测试一下是否可以链接。具体做法就是利用showmount这个命令。
    语法:
    showmount [-ae] [hostname|IP]
    选项与参数:
    -a :显示目前主机与客户端的 NFS 联机分享的状态;
    -e :显示某部主机的 /etc/exports 所分享的目录数据。
    例如:显示NFS服务器 exports 分享的目录信息
showmount -e localhost

4.3.1查看全部的NFS关于共享目录的权限设置
检查一下 /var/lib/nfs/etab 设置,里面是共享目录的权限设置。

tail /var/lib/nfs/etab
 /home/public    192.168.100.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,
 no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534)
 # 上面是同一行,可以看出除了 rw, sync, root_squash 等等,
 # 其实还有 anonuid 及 anongid 等等的默认设定!

4.3.2查看客户端挂载信息
如果有其他客户端挂载了你的 NFS 文件系统时,那么该客户端与文件系统信息就会被记录到 /var/lib/nfs/xtab 里去。

cat  /var/lib/nfs/xtab
  • 4.4利用exportfs重启nfs(不需要向rpc注册)
    如果你想要重新处理 /etc/exports 文件,当重新设定完 /etc/exports 后需不需要重新启动 nfs ? 不需要。如果重新启动 nfs 的话,要得再向 RPC 注册!很麻烦,这个时候我们可以透过 exportfs 这个指令来帮忙
    语法:
    exportfs [-aruv]
    选项与参数:
    -a :全部挂载(或卸除) /etc/exports 档案内的设定
    -r :重新挂载 /etc/exports 里面的设定,此外,亦同步更新 /etc/exports及 /var/lib/nfs/xtab 的内容!
    -u :卸除某一目录
    -v :在 export 的时候,将分享的目录显示到屏幕上
    例如:重新挂载一次 /etc/exports 的设置
exportfs -arv

五、NFS客户端设置

客户端设置比较简单,首先安装相应软件。

yum install nfs-utils rpcbind

客户端不需要启动nfs,只需启动rpcbind服务。

  • 5.1启动客户端
/etc/init.d/rpcbind start
 /etc/init.d/nfslock start #服务器端有启动 nfslock 的话,客户端也要启动才能生效
 
 chkconfig rpcbind on   #开机自启动
 chkconfig nfslock on

查看服务器端提供的共享目录有哪些

showmount -e 192.168.100.254   #服务端ip
  • 5.2挂载服务端NFS文件
    在客户端建立挂载点:
mkdir -p /home/nfs/public

挂载:
将服务端192.168.100.254的/home/public目录挂在到本地(客户端)/home/nfs/public目录下

mount -t nfs 192.168.100.254:/home/public  /home/nfs/public
 #  -t nfs 用于指定文件系统类型

查看挂载情况

df

卸载挂载目录:

umount /home/nfs/public
  • 5.3客户端的挂载参数
    除了 NFS 服务器需要保护之外,我们使用人家的 NFS 文件系统也需要自我保护
    例如你刚刚挂载到本机 /home/nfs/public 的文件系统当中,含有 一个内容为rm -rf /的script 且该文件权限为 555 ,如果你执行了你的整个系统都会被删掉。
    为了解决这种情况可以通过挂载(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 与设备文件,因此当你在挂载的时候,可以使用这样的命令

mount -t nfs -o nosuid,noexec,nodev,rw  192.168.100.254:/home/public  /home/nfs/public

查看:

mount |grep addr

5.3.1客户端其他特殊挂载参数

参数

参数功能

默认参数

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

生产环境常用的挂载参数

mount -t nfs -o nosuid,noexec,nodev,rw,bg,soft,rsize=32768,wsize=32768  192.168.100.254:/home/public /home/nfs/public
  • 5.4 NFS客户端开机自动挂载
    开机就挂载的挂载点与相关参数是写入 /etc/fstab 中的,而 NFS 能不能写入 /etc/fstab 当中,因为/etc/fstab 是在网络启动前就启动了。这是要写入/etc/rc.d/rc.local 这个文件中。
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
  • 5.5自动挂载服务autofs的使用
    在NFS客户端挂载时实现如下两个功能:
    1)让客户端在有使用到 NFS 文件系统的需求时才让系统自动挂载
    2)当 NFS 文件系统使用完毕后,可不可以让 NFS 自动卸除,以避免可能的 RPC 错误
    在linux环境下可以利用autofs这个服务实现。
    5.5.1autofs 的配置概念
    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
    5.5.2 建立主配置文件 /etc/auto.master ,并指定检测的特定目录
    主要配置文件包含要被持续检测的目录以及数据对应文件。数据对应文件的文件名可以自行定义,这里使用/etc/atuo.nfs来命名。
vim /etc/auto.master
/home/nfsfile  /etc/auto.nfs

注意: /home/nfsfile 目录不需要事先存在,因为 autofs 会主动的建立该目录! 如果你建立了,反而可能会出问题

5.5.3 建立数据对应文件内 (/etc/auto.nfs) 的挂载信息与服务器对应资源
由于所指定的 /etc/auto.nfs 是自行设置的,所以这个文件是不存在的。那么这个文件的格式是如何呢?基本上如下。

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

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
# 参数部分,只要最前面加个 - 符号即可!

5.5.4 启动autofs
配置完成以后需要启动autofs。
启动

/etc/init.d/autofs start

查看/home/nfsfile目录

ll -d /home/nfsfile
drwxr-xr-x. 2 root root 0 2019-07-15 00:07 /home/nfsfile

你会发现 /home/nfsfile 容量是 0 ,那是正常的!因为是 autofs 建立的
进入到 /home/nfsfile/public,进入后就会自动挂载。

#cd /home/nfsfile/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)
  # df  /home/nfsfile/public