CentOS7.2 通过nfs设置共享文件夹

时间:2021-02-26 07:00:15
    NFS简介
NFS是Network File System的缩写,即网络文件系统。一种使用于分散式文件协定,有SUN公司开发。功能是通过网络让不同的机器、不同的操作系统能够分享个人数据,让应用程序通过网络可以访问位于服务器磁盘中的数据。
NFS在文件传送或信息传送的过过程中,依赖于RPC协议。RPC,远程过程调用(Remote Procedure Call),是使客户端能够执行其他系统中程序的一种机制。NFS本身是没有提供信息传输的协议和功能的,但NFS却能让我们通过网络进行资料的分享,就是因为NFS使用了RPC提供的传输协议,可以说NFS就是使用PRC的一个程序。
NFS服务端、RPC协议、客户端三者可以理解为房源、中介、租客之间的关系:

CentOS7.2 通过nfs设置共享文件夹

    类似Windows中的文件夹共享,如下有三台机器A, B, C,它们需要访问同一个目录,目录中都是图片,传统的做法是把这些图片分别放到A, B, C。但是使用NFS只需要放到A上,然后A共享给B和C即可。访问的时候,B和C是通过网络的方式去访问A上的那个目录。

CentOS7.2 通过nfs设置共享文件夹

    在A机上安装 NFS 服务器所需的软件包:   
yum install -y nfs-utils
安装的过程中,会自动安装rpcbind。
编辑exports文件,添加客户端主机:
vi /etc/exports    
/home/nfs 192.168.222.201(rw,sync,fsid=0) 192.168.222.202(rw,sync,fsid=0) 192.168.12.0/24(rw,no_root_squash,no_all_squash,sync,anonuid=501,anongid=501)
    配置说明:
这一行分为三个部分:
第一部分:/home/nfs ,这个是本地要共享出去的目录。
第二部分:允许访问的主机,可以是一个IP:192.168.222.201,也可以是一个IP段:192.168.12.0/24
第三部分:括号中部分
rw表示可读写,ro只读;sync :同步模式,内存中数据时时写入磁盘;async :不同步,把内存中数据定期写入磁盘中;no_root_squash :客户机用root访问该共享文件夹时,不映射root用户,root用户就会对共享的目录拥有至高的权限控制,就像是对本机的目录操作一样。不安全,不建议使用;root_squash:和上面的选项对应,root用户对共享目录的权限不高,只有普通用户的权限,即限制了root;all_squash:不管使用NFS的用户是谁,他的身份都会被限定成为一个指定的普通用户身份;anonuid/anongid :要和root_squash 以及all_squash一同使用,用于指定使用NFS的用户限定后的uid和gid,前提是本机的/etc/passwd中存在这个uid和gid。fsid=0表示将/home/nfs整个目录包装成根目录,insecure 允许从这台机器过来的非授权访问
启动A机上nfs服务
先为rpcbind和nfs做开机启动:
systemctl enable rpcbind.service    
systemctl enable nfs-server.service
    然后分别启动rpcbind和nfs服务:
systemctl start rpcbind.service 
systemctl start nfs-server.service
    确认NFS服务器启动成功:   
rpcinfo -p

program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 30385 status
100024 1 tcp 13017 status
100005 1 udp 20048 mountd
100005 1 tcp 20048 mountd
100005 2 udp 20048 mountd
100005 2 tcp 20048 mountd
100005 3 udp 20048 mountd
100005 3 tcp 20048 mountd
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049 nfs_acl
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 3 udp 2049 nfs_acl
100021 1 udp 36204 nlockmgr
100021 3 udp 36204 nlockmgr
100021 4 udp 36204 nlockmgr
100021 1 tcp 31613 nlockmgr
100021 3 tcp 31613 nlockmgr
100021 4 tcp 31613 nlockmgr
    通过查看service列中是否有nfs服务来确认NFS是否启动。可在A、B、C上通过showmount -e 192.168.222.200查看nfs共享信息。  
在B,C机上配置clinet端
安装nfs,并启动服务。
        yum install -y nfs-utils
systemctl enable rpcbind.service
systemctl start rpcbind.service
    客户端不需要启动nfs服务,只需要启动rpcbind服务.检查 NFS 服务器端是否有目录共享showmount -e 192.168.222.200 
使用 mount 挂载A服务器端的目录/home/nfs到客户端B的目录/opt/nfs/tt下
在客户端B上新建一个目录/opt/nfs/tt来挂载A的/home/nfs,mount -t nfs 192.168.222.200:/home/nfs/ /opt/nfs/tt/
不要在/opt/nfs/tt/这个目录下执行挂载命令,有可能就挂不上去。也可以在挂载的时候加些参数, mount -t nfs -o nolock,nfsvers=3,vers=3 192.168.222.200:/home/nfs/ /opt/nfs/tt/
带安全性挂载:
mount -t nfs -o nosuid,noexec,nodev,rw 192.168.222.200:/home/nfs/ /opt/nfs/tt/ 
    特殊挂载方式,应对网络不稳定情况 
 mount -t nfs -o nosuid,noexec,nodev,rw -o bg,soft,rsize=32768,wsize=32768 192.168.222.200:/home/nfs/ /opt/nfs/tt/   
    开机自动挂载 
vi /etc/rc.d/rc.local                                                             mount -t nfs -o nosuid,noexec,nodev,rw,bg,soft,rsize=32768,wsize=32768 192.168.222.200:/home/nfs/ /opt/nfs/tt/
    挂载完毕后就可以通过/opt/nfs/tt/访问A的/home/nfs内容了。
可以通过umount /opt/nfs/tt/来取消挂载的目录。
在服务器端A再建立一个共享目录,并且可以允许A、B、C写入共享目录,通过id root获取root用户ID号。
uid=0(root) gid=0(root) 组=0(root)
在A服务器上再建立一个共享目录
mkdir /home/nfs1
# vi /etc/exports
/home/nfs 192.168.222.201(rw,sync,fsid=0) 192.168.222.202(rw,sync,fsid=0)
/home/nfs1 192.168.222.0/24(rw,sync,all_squash,anonuid=0,anongid=0)
加入第二行,anonuid=0,anongid=0即为root用户id。
让修改过的配置文件生效exportfs –arv。
使用exportfs命令,当改变/etc/exports配置文件后,不用重启nfs服务直接用这个exportfs即可。
        它的常用选项为[-aruv].     
-a :全部挂载或者卸载;
-r :重新挂载;
-u :卸载某一个目录;
-v :显示共享的目录;
    exportfs -a 会增加修改后的,比如原先是这样的,/oadata/upload      192.168.8.167,192.168.8.166修改成/oadata/upload/html      192.168.8.167,192.168.8.166。使用exportfs -a后,会变成这样:
/oadata/upload 192.168.8.167,192.168.8.166
/oadata/upload/html 192.168.8.167,192.168.8.166
使用exportfs -r 会重新加载配置文件。
查看新的可挂载目录及可连接的IP
showmount -e 192.168.222.200

在B、C clinet端新挂载一个目录
showmount -e 192.168.222.200  #查看新的挂载共享目录是否有了。
mkdir nfs1
mount -t nfs 192.168.222.200:/home/nfs1/ /home/nfs1/
ll / >/home/nfs1/ll.txt #测试向新的共享目录中可以写入文件了。
    想在客户机B、C上实现开机挂载,则需要编辑/etc/fstab:
vi /etc/fstab
加入以下内容:
192.168.222.200:/home/nfs                  /home/nfs    nfs    nolock   0 0   
192.168.222.200:/home/nfs1 /home/nfs1 nfs nolock 0 0
    保存后,重新挂载 mount -a。


exportfs 命令
用途
导出和不导出目录到 NFS 客户机。
语法
/usr/sbin/exportfs [ -a ] [ -v ] [ -u ] [ -i ] [ -fFile ] [ -F ] [ -oOption [ ,Option ... ] ] [ -V Exported Version] [ Directory ]
描述
exportfs 命令使得本地目录可以为网络文件系统 (NFS) 客户机安装。此命令通常是在系统启动期间由 /etc/rc.nfs 文件调用的,并使用了 /etc/exports 文件中的信息来导出一个或者多个目录,这些目录必须用完整的路径名来指定。
/etc/xtab 文件列示了当前导出的目录。要想显示此文件,请输入不带标志和参数的 exportfs 命令。要想更改文件或者更改它的一个目录中的特征的话,root 用户可以编辑 /etc/exports 文件并运行 exportfs 命令。这种更改可以在任何时间完成。永远都不要直接去编辑 /etc/xtab 文件。
注意:
1、您不能导出位于同一文件系统内的当前导出目录的父目录或子目录。
2、NFS V2 和 V3 允许既导出目录又导出文件。NFS V4 访问只能导出目录。
3、如果带有不同版本 2(或 3)和 4 的同一目录下的两个条目存在于 /etc/exports 文件中,那么 exportfs 命令将同时导出两个条目。
4、如果某个目录的 NFS 版本 2(或 3)和 4 的选项相同,那么 /etc/exports 文件中可能有一个条目指定了 -vers=3:4。



-a 导出所有的列在导出文件中的目录。

-v 按照是导出还是不导出,打印每个目录的名称。

-u 不导出您指定的目录。当结合 -a 标志使用时,取消导出所有导出的目录。当同时结合 -a 和 -f 标志使用时,撤销导出指定导出文件中的所有目录。

-i 允许没有在导出文件中指定的目录的导出,或者忽略在导出文件中的选项。除非用到 -f 标志来指定一个可更替的文件,exportfs 命令通常将向 /etc/exports 文件查询来获得与要导出的目录的相关选项。

-f File 指定一个导出文件,而不是 /etc/exports 文件,该文件包含了一个您可以导出的目录的列表。此文件应该遵守 /etc/exports 文件相同的格式。注:此可更替的文件将不会在系统和 NFS 启动的时候用来自动导出目录。/etc/exports 文件是支持在系统启动时指定导出目录的唯一的文件。

-F 指定应该执行强制的取消导出。请仅与 -u 标志结合使用该标志。在取消导出 V2/V3 导出时,该标志不起作用。V4 取消导出可能由于关联的状态而失败。该标志强制释放与 V4 导出相关联的任何状态。

-oOptions 为要导出的目录指定可选的特征。您可以输入多个变量,中间用逗号隔开。对于采用了 Client 参数的选项,Client 可以指定主机名、点分式 IP 地址、网络名或子网标识。子网标识具有 "@host/mask" 格式,其中 host 是 主机名或点分式 IP 地址,mask 指定了 当检查访问时使用的位数。如果不指定 mask,那么使用完整的掩码。例如,标识 @client.group.company.com/16 将匹配 company.com 子网上所有的客户机。@client.group.company.com/24 的标识将 仅匹配 group.company.com 子网上的客户机。从下面选项中选择:
ro 用只读许可方式导出目录。如果不指定,那么目录以读写许可权导出。
ro=Client[:Client]
将目录以只读许可权导出至指定的客户机。将目录以只读许可权导出至未在列表中指定的客户机。如果已经指定了一个读写列表的话,那么无法指定一个只读列表。
rw
将目录以读写许可权导出至所有客户机。
rw=Client [:Client]
将目录以读写许可权导出至指定的客户机。将目录以只读方式导出至不在列表中的客户机。如果已经指定了一个只读列表,那么无法指定一个读写列表。
anon =UID
如果请求来自于 root 用户的话,用 UID 值作为有效的用户 ID。
该选项的缺省值为 -2。在 NFS V2 和 NFS V3 中,将 anon 选项的值设置为 -1 将禁用匿名访问。这样,在缺省情况下,安全 NFS 作为匿名接受非安全的要求,并且要求更多安全性的用户可以禁止此功能,通过将 anon 设置成值为 -1。
root=Client[:Client]
允许从列表中的指定客户机进行根访问。将主机放到根列表中不会覆盖其他选项的语义。例如,该选项拒绝来自根列表中主机的安装访问,而不是拒绝访问列表中主机的访问。
access=Client[:Client,...]
给每个列示的客户机提供安装访问。客户机可以是主机名也可以是网络组名。列表中的每个客户机首先要在 /etc/netgroup 数据库进行检查,然后在 /etc/hosts 数据库中检查。缺省值允许任何机器安装给定的目录。
secure
在访问目录时要求客户机使用更安全的协议。
-o Options (continued)
sec=flavor[:flavor...]
该选项用于指定一系列可能用于访问导出目录下的文件的安全方法。大部分 exportfs 选项可以使用 sec 选项进行分群。sec 选项之后的选项被认为从属于其前面的 sec 选项。可能指定任何数量的 sec 节,但每个安全方法只能指定一次。在每个 sec 节内,可以指定一次 ro、rw、root 和 access 选项。只有 public、anon 和 vers 选项对于导出是全局性的。如果使用 sec 选项来指定任何安全方法,那么必须使用它来指定所有安全方法。如有任何 sec 选项不存在,那么允许所有认证风格。
允许的风格值为:
sys
UNIX 认证。这是缺省方法。
dh
DES 认证。
none
如果安装请求使用导出中未指定的认证风格,那么允许安装请求继续匿名凭证。
krb5
Kerberos。仅认证。
krb5i
Kerberos。认证和整合。
krb5p
Kerberos。认证、整合和隐私。
可能指定 secure 选项,但是没有结合 sec 选项。不推荐使用 secure 选项,并且可能消除它。使用 sec=dh 代替它。
vers=version_number[:version_number...]
指定允许哪些版本的NFS访问导出的目录。有效版本为2、3 和4。无法单独选择V2和V3。指定V2或V3将使NFS V2和NFS V3都能够访问。可以单独选择 V4。缺省值为允许使用NFS协议V2和V3进行访问。
exname=external-name
用指定外部名导出目录。外部名必须以 nfsroot 名称开始。请参阅 /etc/exports 文件的描述以获取对 nfsroot 名称的描述。该选项仅用于导出以供 NFS V4 协议访问的目录。
deleg={yes | no}
对指定导出启用或禁用文件授权。此选项覆盖此导出的系统范围授权支持。系统范围支持是通过 nfso 实现的。


-o Options (continued)
refer=rootpath@host[+host][:rootpath@host[+host]]
将在指定的路径中创建一个名称空间参照。该参照将指引客户机到指定的备用位置,客户机可以继续在其中进行操作。参照是一种特殊的对象。如果在指定的路径中存在非参照对象,将禁止导出并打印一条错误消息。如果在指定的路径中不存在任何内容,那么将在该路径中创建一个包含通向该对象的路径名目录的参照对象。可以在文件系统中创建多个参照。不能为 nfsroot 指定参照。名称 localhost 不能被用作 hostname。仅允许 V4 的导出使用 refer 选项。如果导出规范允许 V2 或 V3 访问,将打印一条错误消息并禁止导出。不导出参照对象会影响从参照对象除去参照位置信息。不导出不会除去对象本身。如果要除去对象,请使用 rm。管理员必须确保在参照服务器上提供相应的数据。此选项仅在 带有 5300-03 推荐维护包的 AIX 5L™ V5.3 或后续版本中可用。
注:
只有在服务器上启用复制时才能进行参照导出。使用 chnfs -R on 启用复制。


-o Options (continued)
replicas=rootpath@host[+host][:rootpath@host[+host]]
副本位置信息将与导出路径关联。如果当前服务器变为不可用,NFS V4 客户机可以使用副本信息将操作重定向至指定的另一个位置。管理员应该确保在副本服务器上提供相应的数据。因为副本信息适用于整个文件系统,所以指定的路径必须是文件系统的根目录。如果路径不是文件系统的根目录,将禁止导出并打印一条错误消息。名称 localhost 不能被用作 hostname。此 replicas 选项只对 V4 的导出有意义。如果在允许 V2 或 V3 的导出上使用该选项,该选项是允许的,但 V2 或 V3 服务器将忽略副本信息。如果导出的目录不是副本列表中,条目 exported directory@current host 将被作为第一个副本位置添加。此选项仅在 带有 5300-03 的 AIX® 5.3 或后续版本中可用。只有在服务器上启用复制时才能进行副本导出。在缺省情况下,复制未启用。如果将在系统引导时进行副本导出,应该通过使用 chnfs -R on 命令启用复制。还可以为 nfsroot 指定副本位置。只能使用 chnfs -R host[+host] 完成此操作。如果在列表中未指定当前主机,它将被作为第一个副本主机添加。在这种情况下不需要或不允许 rootpath,这是因为 nfsroot 只被复制到指定主机的 nfsroots。可以使用 chnfs 程序启用或禁用复制。只有在没有 NFS V4 导出活动时才能更改复制方式。如果更改了服务器复制方式,那么服务器将不执行在处于先前的复制方式期间服务器发出的文件句柄。这可能导致在保留旧的文件句柄的客户机上发生应用程序错误。更改服务器复制方式时请小心。如果可能,所有挂装到服务器的客户机都应该在更改服务器复制方式之前卸装。可以通过修改副本列表并重新导出目录,更改与该目录关联的副本位置信息。新的副本信息将替换旧的副本信息。预期 NFS 客户机将在常规基础上刷新副本信息。如果服务器更改用于导出的副本信息,可能需要时间来引起客户机的注意。如果添加了新的副本位置,那么这就不成问题,这是因为保留旧信息的客户机仍然拥有正确的(如果不完全)副本信息。除去副本信息可能会有问题,这是因为它可能导致客户机在一段时间内保留不正确的副本信息。要辅助客户机检测新的信息,exportfs 将试图接触被复制的目录。这将更改目录上的时间戳记,反过来将导致客户机重新获取该目录的属性。然而,如果被复制的文件系统是只读的,那么此操作也许就不可能了。当更改某个目录的副本信息时,要明白可能在更改信息到客户机注意到新的信息之间有一段等待时间。


-o Options (continued)
noauto
“按现状”接受副本规范。如果尚未指定主要主机名,那么不要自动将其作为一个副本位置插入。
scatter
定义如何从 refer 或 replicas 选项上指定的服务器中生成备选位置列表。如果未使用 noauto 选项,备选位置列表还将包含某个副本位置的主要主机名。scatter 选项仅应用于供 NFS V4 协议访问的导出目录。scatter 选项有三个有效值:
full
分散所有服务器来组成备选位置组合。
partial
所有组合的第一个位置固定为在 refer 或 replicas 选项上指定的第一个服务器。其余位置和第一个位置将散射(与使用 scatter=full 方法进行散射类似)。
none
不使用散射。如果之前已经启用,那么此值也可用于禁用散射。
无论何时客户机属性发生更改,所有包含该客户机作为参数的导出条目应该再次导出。可以更改客户机属性的事件包括修改网组或更改客户机的 IP 地址。更改失败会导致服务器使用原有的客户机信息。

-V Exported Version 指定版本号。有效版本号有:2、3 和 4。


Solaris 兼容性
exportfs 命令可能被调用为 share、shareall、unshare 或 unshareall。当 exportfs 命令作为 share 或 shareall 调用时,功能分别等同于 exportfs 和 exportfs -a,除非必须使用 sec 选项指定安全方法。当 exportfs 命令作为 unshare 或 unshareall 调用时,功能分别等同于 exportfs -u 和 exportfs -u -a。


安全性
RBAC 用户和可信 AIX 用户注意:
此命令可以执行特权操作。只有特权用户才能运行特权操作。有关权限与特权的更多信息,请参阅安全性中的『特权命令数据库』。要获取与此命令相关联的特权和权限的列表,请参阅 lssecattr 命令或 getcmdattr 子命令。
示例
要导出 /etc/exports 文件中的全部目录,请输入:
exportfs -a
要从 /etc/exports 文件导出一个目录,请输入:
exportfs /home/notes
在此示例中,/home/notes 目录被导出。
注:
要让此命令工作,必须在 /etc/exports 文件中指定 /home/notes 目录。
要取消导出目录,请输入:
exportfs -u /home/notes
在此示例中,/home/notes 目录不导出。
要显示当前正在导出的目录,请输入:
exportfs -v
要导出不是在 /etc/exports 文件中指定的目录,请输入:
exportfs -i /home/zeus
在此示例中,/home/zeus 目录没有任何限制地被导出。
要导出一个目录并为网组成员提供访问该目录的许可权,请输入:
exportfs access=cowboys:oilers /home/notes -o
在此示例中,/home/notes 目录被导出,并且允许 cowboys 和 oilers 主机的用户有权访问。
要从 /etc/exports 文件导出带不同选项的目录,请输入:
exportfs -i -o root=zorro:silver /directory
在此示例中,/directory 目录被导出,并且 root 用户访问 zorro 和 silver 主机,而不管 /etc/exports 文件中指定的访问权限是什么。
使用 Kerberos 认证将带有写权限的 /common/docs 目录导出到客户机;使用 UNIX 将只读权限导出到客户端;将以下文本添加到 /etc/exports 文件:
/common/docs -sec=krb5,rw,sec=sys,ro
然后输入 exportfs /common/docs 执行导出。
要在 /usr/info 上创建一个参照到主机 infoserver 上的 /usr/info 目录,将下行添加到 /etc/exports,然后导出 /usr/info:
/usr/info -vers=4,refer=/usr/info@infoserver
要为主机 backup1 和 backup2 上的 /common/info 目录指定副本,请将下行添加到 /etc/exports,然后导出 /common/info:
/common/info -vers=4,replicas=/common/info@backup1:/common/info@backup2,<other options>
要使用版本 3 和版本 4 导出 /common/docs 目录,请输入以下命令:
exportfs -V 3:4 /common/docs
要导出 /etc/exports 文件中的所有版本 4 的条目,请输入以下命令:
exportfs -a -V 4
要仅取消导出版本 3 的 /common/docs 目录,请输入以下命令:
exportfs -u -V 3 /common/docs
要取取消导出 /etc/xtab 文件中的所有版本 3 的条目,请输入以下命令:
exportfs -ua -V 3
要指定主机 s1、s2 和 s3 上 /common/docs 目录的参考项并将它们全部散射,请将下面一行添加至 /etc/exports 文件,然后导出 /common/docs 目录:
/common/docs -vers=4,refer=/common/docs@s1:/common/docs@s2:/common/docs@s3,scatter=full
要指定主机 s1、s2、s3 和 s4 的 /common/docs 目录的副本并将它们部分散射(所有组合的第一故障转移服务器是 s1),请将下面一行添加至 /etc/exports 文件,然后导出 /common/docs 目录:
/common/docs -vers=4,noauto,replicas=/common/docs@s1:/common/docs@s2:/common/docs@s3:/common/docs@s4,scatter=partial

参考:https://www.ibm.com/support/knowledgecenter/zh/ssw_aix_71/com.ibm.aix.cmds2/exportfs.htm