NetApp 存储配置练习 4:NFS

NetApp存储基础学习汇总(第四部分)

一、NFS管理

1.1、NFS基础知识

NFS 就是 Network FileSystem 的缩写,最早是由 Sun 公司所提出的。 它最大的功能就是可以通过网络,让不同的计算机、不同的操作系统、可以彼此分享档案 (share files)。所以,也可以简单的将它看做是一个档案服务器 (file server)!这个 NFS 服务器可以让你的PC将网络远端的 NFS 主机分享的目录,挂载到本地端的机器当中, 在本地端的机器看起來,那个远端主机的目录就好像是自己的一个磁盘分区(partition)!使用上相当的方便!

既然 NFS 是通过网络来进行资料的传输,那么 NFS 使用那个 port来进行传输呢?答案是....不知道!因为 NFS 用来传输的 port 是随机选择小于 1024 以下的端口来使用的。 那用户端怎么知道服务器端使用那个port 呢?这时候就得要远程过程调用(Remote Procedure Call, RPC) 协议来辅助了。

远程过程调用 (RPC) 是一种协议,程序可使用这种协议向网络中的另一台计算机上的程序请求服务。由于使用 RPC 的程序不必了解支持通信的网络协议的情况,因此 RPC 提高了程序的互操作性。在 RPC 中,发出请求的程序是客户程序,而提供服务的程序是服务器。

因为NFS支持的功能相当的多,而不同的功能都会使用不同的程序来启动, 每启动一个功能就会启用一些 port 来传输资料,因此, NFS 的功能所对应的 port 才没有固定住, 而是采用随机取用一些未被使用的小于1024 的端口来作为传输之用。但如此一来又造成客户端想要连上服务器的困扰, 因为客户端必须要知道服务器端的相关端口才能够连接。

这时候RPC 最主要的功能就是指定每个NFS 功能所对应的 port number ,并且反馈给客户端,让客户端可以连接到正确的端口上去。 那 RPC 又是如何知道每个NFS 的端口呢?这是因为服务器在启动NFS 时会随机取用数个端口,并主动的向 RPC 注册,因此 RPC 可以知道每个端口对应的 NFS 功能,然后RPC 又是固定使用 port 111 来监听客户端的需求并反馈客户端正确的端口。

所以在服务器端启动NFS服务之前,RPC对应的portmap服务就要启动了,否则NFS无法注册端口。

由于 NFS 的各项功能都必須要向 RPC 来注册,如此一来 RPC 才能了解 NFS 这个服务的各项功能的 port number, PID, NFS 服务器所监听的 IP 等等,而客户端才能够通过 RPC 找到正确对应的端口。 也就是说,NFS 必須要有 RPC 存在时才能成功的提供服務, 因此我们称 NFS 为RPC server 的一种。事实上,有很多这样的服务器都是向 RPC 注册的, 比如,NIS (Network Information Service) 也是 RPC server 的一种。 此外,不论是客户端还是服务器端,在要使用 NFS 时,两者都需要启动 RPC 才行。

在linux服务器上启动NFS服务的过程

[root@rhel5 ~]# service nfs start ==没有启动portmap服务前,NFS启动不了

Starting NFS services: [ OK ]

Starting NFS quotas: Cannot register service: RPC: Unable to receive; errno = Connection refused

rpc.rquotad: unable to register (RQUOTAPROG, RQUOTAVERS, udp).

[FAILED]

Starting NFS daemon: [FAILED]

Starting NFS mountd: Cannot register service: RPC: Unable to receive; errno = Connection refused

[FAILED]

[root@rhel5 ~]# service portmap start ==先启动portmap服务后,NFS启动正常

Starting portmap: [ OK ]

[root@rhel5 ~]# service nfs start

Starting NFS services: [ OK ]

Starting NFS quotas: [ OK ]

Starting NFS daemon: [ OK ]

Starting NFS mountd: [ OK ]

------------------------------------------------------------------------------------------------------------

[root@rhel5 ~]# ps -ef|grep rpc

root 1842 1 0 Dec12 ? 00:00:00 rpc.statd

root 1875 1 0 Dec12 ? 00:00:00 rpc.idmapd

rpc 9280 1 0 18:53 ? 00:00:00 portmap

root 9310 1 0 18:53 ? 00:00:00 rpc.rquotad

root 9319 7 0 18:53 ? 00:00:00 [rpciod/0]

root 9326 1 0 18:54 ? 00:00:00 rpc.mountd

[root@rhel5 ~]# netstat -ultn

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address Foreign Address State

tcp 0 0 127.0.0.1:2208 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:5801 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:5901 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:752 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:6001 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:1010 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:47093 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN

tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN

tcp 0 0 0.0.0.0:601 0.0.0.0:* LISTEN

tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN

tcp 0 0 127.0.0.1:2207 0.0.0.0:* LISTEN

tcp 0 0 :::6001 :::* LISTEN

tcp 0 0 :::22 :::* LISTEN

udp 0 0 0.0.0.0:1024 0.0.0.0:*

udp 0 0 0.0.0.0:2049 0.0.0.0:*

udp 0 0 0.0.0.0:1212 0.0.0.0:*

udp 0 0 0.0.0.0:5353 0.0.0.0:*

udp 0 0 0.0.0.0:746 0.0.0.0:*

udp 0 0 0.0.0.0:749 0.0.0.0:*

udp 0 0 0.0.0.0:1007 0.0.0.0:*

udp 0 0 0.0.0.0:111 0.0.0.0:*

udp 0 0 0.0.0.0:631 0.0.0.0:*

udp 0 0 0.0.0.0:1022 0.0.0.0:*

udp 0 0 :::1025 :::*

udp 0 0 :::5353 :::*

[root@rhel5 ~]# rpcinfo -p localhost

program vers proto port

100000 2 tcp 111 portmapper

100000 2 udp 111 portmapper

100011 1 udp 1007 rquotad

100011 2 udp 1007 rquotad

100011 1 tcp 1010 rquotad

100011 2 tcp 1010 rquotad

NFS版本

100003 2 udp 2049 nfs

100003 3 udp 2049 nfs

100003 4 udp 2049 nfs

100003 2 tcp 2049 nfs

100003 3 tcp 2049 nfs

100003 4 tcp 2049 nfs

100021 1 udp 1212 nlockmgr

100021 3 udp 1212 nlockmgr

100021 4 udp 1212 nlockmgr

100021 1 tcp 47093 nlockmgr

100021 3 tcp 47093 nlockmgr

100021 4 tcp 47093 nlockmgr

100005 1 udp 1022 mountd

100005 1 tcp 601 mountd

100005 2 udp 1022 mountd

100005 2 tcp 601 mountd

100005 3 udp 1022 mountd

100005 3 tcp 601 mountd

[root@rhel5 ~]# cat /etc/services|grep 111

sunrpc 111/tcp portmapper # RPC 4.0 portmapper TCP

sunrpc 111/udp portmapper # RPC 4.0 portmapper UDP

tan> netstat -an       ==在存储上看111端口也是开的

Active TCP connections (including servers)

Local Address Remote Address Swind Send-Q Rwind Recv-Q State

*.80 *.* 0 0 0 0 LISTEN

*.445 *.* 0 0 0 0 LISTEN

*.139 *.* 0 0 0 0 LISTEN

*.10568 *.* 0 0 0 0 LISTEN

*.10569 *.* 0 0 0 0 LISTEN

*.10567 *.* 0 0 0 0 LISTEN

*.10571 *.* 0 0 0 0 LISTEN

*.22 *.* 0 0 0 0 LISTEN

*.514 *.* 0 0 0 0 LISTEN

*.23 *.* 0 0 0 0 LISTEN

*.4047 *.* 0 0 0 0 LISTEN

*.4045 *.* 0 0 0 0 LISTEN

*.4046 *.* 0 0 0 0 LISTEN

*.2049 *.* 0 0 0 0 LISTEN

*.111 *.* 0 0 0 0 LISTEN

Active UDP sockets (including servers)

Local Address Remote Address Send-Q Recv-Q

*.138 *.* 0 0

*.137 *.* 0 0

*.69 *.* 0 0

*.161 *.* 0 0

*.4049 *.* 0 0

*.4047 *.* 0 0

*.4045 *.* 0 0

*.4046 *.* 0 0

*.2049 *.* 0 0

*.111 *.* 0 0

*.520 *.* 0 0

NFS是一个分布式文件系统,它容许用户访问远程系统上的文件和目录,这些文件和目录对用户来说好像是在本地。用户可以使用OS命令创建,删除,读写远程文件和目录,以及设置远程文件和目录的属性,而这一切都是在本地完成的。NFS使用RPC而不受本地机器类型、OS和网络结构的限制。

 NFS基于客户机/服务器模式。一个NFS服务器拥有本地磁盘上的文件,客户机通过NFS访问它。拥有实际磁盘,并通过NFS将这些磁盘共享出来的主机叫NFS服务器,通过NFS访问文件系统的叫NFS客户机。服务器给客户机共享文件系统的操作叫做导出(export ).客户机要访问服务器导出的文件系统之前,必须在本地先挂接(mount)这个文件系统。

  NFS服务器导出的目录叫做远程资源,并通常写做:hostname:pathname 格式,其中hostname是NFS服务器的主机名,pathname是服务器上被导出目录的绝对路径。在客户机上安装远程资源的那个目录叫做挂接点(mount point)。

1.2、NFS启动的 RPC daemons(后台进程)

NFS服务器主要的任务是进行文件系统的分享,文件系統的共享是与权限有关的。 所以 NFS 服务器启动时至少需要两个 daemons ,一个管理 client 端是否能够登入的问题, 一个管理 client 端能够取得的权限。如果你还想要管理 quota 的话,那么NFS 还得要再载入其他的 RPC 程序。我們以比较单纯的 NFS 服务器来说:

rpc.nfsd:

这个daemon 主要的功能就是在管理 Client 是否具有登入主机的权限,其中还包含这个登入者的 ID 的判別。

rpc.mountd:

这个 daemon 主要的功能,则是在管理 NFS 的文件系统了。当Client 端顺利的通过 rpc.nfsd 而登入服务器之后,在它可以使用 NFS 服务器提供的文件之前,还会经过文件使用权限 (就是那个 -rwxrwxrwx 与owner, group 那几个权限) 的认证程序,它会去读 NFS 的设定文件 /etc/exports 来比对 Client 的权限,当通过一关之后 Client 就可以取得使用 NFS 文件的权限了 (注:这也是我们用来管理 NFS 分享目录的使用权限与安全设定的地方了)

rpc.lockd (非必要)

这个后台进程可以用在管理文件的锁定 (lock) 用途。为何文件需要『锁定』呢? 因为既然分享的 NFS 文件可以让客户端使用,那么当多个客户端同时尝试写入某个文件时, 就可能对该文件造成一些问题!这个rpc.lockd 可以用来克服这个问题。 但 rpc.lockd 必須要同时在客户端與与服器端都开启才可以。此外, rpc.lockd 也常与rpc.statd 同时启用。

rpc.statd (非必要)

可以用来检查文件的一致性,与 rpc.lockd 有关,若发生因为客户端同时使用同一文件造成文件可能有所损坏, rpc.statd 可以用来检测並尝试恢复该文件。与 rpc.lockd 一样的,这个功能必須要在服务器端与客户端都启动才会生效。

1.3、NFS 的文件存取权限(以linux为例)

假如我们在 NFS client 1 上面以dmtsai这个使用者身份想要去访问 /home/data/sharefile/ 这个来自 NFS server 所提供的文件系統时,NFS server 所提供的文件系统会让我们以什么身份去访问,是dmtsai还是其它什么呢?

NFS 服务本身并没有进行身份登入的识别, 所以说,当你在客户端以dmtsai的身份想要存取服务器端的文件系統时, 服务器端会以客户端的使用者 UID 与GID 等身份来尝试读取服务器端的档案系統。这时候如果客户端与服务器端的使用者身份并不一致怎么办?

见下图:

NetApp 存储配置练习 4:NFS
当我们以 dmtsai这个一般身份使用者要去访问来自服务器端的文件时,你要先注意到的是: 文件系統的 inode 所记录的属性为UID, GID 而非账号与组名。 那一般Linux 主机会主动的以自己的 /etc/passwd, /etc/group 来查询对应的使用者和其组的名称。 所以当 dmtsai 进入到该目录后,会参照 NFS client 1 的使用者与群组名称。 但是由于该目录的文件主要来自 NFS server ,所以可能就会出现几个情況:
  1. NFS server/NFS client 刚好有相同的账号与组

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

  1. NFS server 上的UID=501这个UID 账号对应为vbird

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

  1. NFS server 上没有501 这个UID

另一个极端的情況是,在服务器端并没有 501 这个UID 的存在,则此时 dmtsai 的身份在该目录下会被会变成匿名者, 一般 NFS 的匿名者会以 UID =65534 为其使用者,早期的 Linux distributions 这个 65534 的账号名称通常是 nobody ,CentOS 则取名为nfsnobody 。

  1. 如果使用者身份是 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 的权限时,你才具有该文件的可写入权限。尤其是身份 (UID) 确认的环节部分,最容易搞错!也因为如此, 所以 NFS 通常需要与其它身份验证的软件配合使用。

1.4、NFS Server 端的设定

既然要使用 NFS 的话,就得要安裝 NFS所需要的套件了

以RHEL AS5为例的话,要设定好 NFS服务器我们必须要有两个套件才行,分别是:

  1. NFS 主程式:nfs-utils
  2. RPC 主程式:portmap

[root@rhel5 ~]# rpm -qa | grep nfs

nfs-utils-1.0.9-16.el5

nfs-utils-lib-1.0.8-7.2

[root@rhel5 ~]# rpm -qa | grep portmap

portmap-4.0-65.2.2.1

在NetApp存储要启用NFS必须要具有NFS的license,也可以通过nfs off 来打开或者nfs stop关闭NFS服务。

此外,不论是客户端还是服务器端,在要使用 NFS 时,两者都需要启动 RPC 才行。

tan> license                  ====在存储上看license情况

a_sis not licensed

cifs site DZDACHD

cluster not licensed

cluster_remote not licensed

compression not licensed

disk_sanitization not licensed

fcp not licensed

flex_clone not licensed

flex_scale not licensed

flexcache_nfs not licensed

gateway_hitachi not licensed

http not licensed

iscsi site BSLRLTG

multistore not licensed

nearstore_option not licensed

nfs site BQOEAZL

operations_manager not licensed

protection_manager not licensed

provisioning_manager not licensed

smdomino not licensed

smsql not licensed

snaplock not licensed

snaplock_enterprise not licensed

snapmanager_oracle not licensed

snapmanager_sap not licensed

snapmanager_sharepoint not licensed

snapmanagerexchange not licensed

snapmirror not licensed

snapmirror_sync not licensed

snapmover not licensed

snaprestore site DNDCBQH

snapvalidator not licensed

sv_linux_pri not licensed

sv_ontap_pri not licensed

sv_ontap_sec not licensed

sv_unix_pri not licensed

sv_windows_ofm_pri not licensed

sv_windows_pri not licensed

syncmirror_local not licensed

v-series not licensed

vld not licensed

tan> options nfs

nfs.acache.persistence.enabled on

nfs.assist.queue.limit 40

nfs.export.allow_provisional_access on

nfs.export.auto-update on

nfs.export.exportfs_comment_on_delete on

nfs.export.harvest.timeout 1800

nfs.export.neg.timeout 3600

nfs.export.pos.timeout 36000

nfs.export.resolve.timeout 6

nfs.hide_snapshot off

nfs.ifc.xmt.high 16

nfs.ifc.xmt.low 8

nfs.kerberos.enable off

nfs.locking.check_domain on

nfs.mount_rootonly on

nfs.mountd.trace off

nfs.netgroup.strict off

nfs.notify.carryover on

nfs.ntacl_display_permissive_perms off

nfs.per_client_stats.enable off

nfs.require_valid_mapped_uid off

nfs.response.trace off

nfs.response.trigger 60

nfs.rpcsec.ctx.high 0

nfs.rpcsec.ctx.idle 360

nfs.tcp.enable on

nfs.udp.enable on

nfs.udp.xfersize 32768

nfs.v2.df_2gb_lim off

nfs.v3.enable on

nfs.v4.acl.enable off

nfs.v4.enable off

nfs.v4.id.domain

nfs.v4.read_delegation off

nfs.v4.write_delegation off

nfs.webnfs.enable off

nfs.webnfs.rootdir XXX

nfs.webnfs.rootdir.set off

NFS 的套件结构

NFS的设置文件只有一个,执行文件也不多, 记录文件也很少。

  1. /etc/exports

这个文件就是 NFS 的主要设置文件了!不过,系統并沒有预设值,所以这个文件不一定存在,可能需要使用 vi 来的建立起这个文件。

  1. /usr/sbin/exportfs

这个是维护 NFS 分享资源的指令,我们可以利用这个指令重新分享 /etc/exports 文件中的目录资源、将 NFS Server 分享的目录卸载或重新分享等等,这个指令是 NFS 系统里面相当重要的一个。

  1. /usr/sbin/showmount

这是另一个重要的 NFS 指令。exportfs 是用在 NFS Server 端,而 showmount 则主要用在 Client 端。这个showmount 可以用来查看NFS 分享出來的目录资源。

  1. /var/lib/nfs/*tab

在 NFS 服务器的登陆档案都放置到 /var/lib/nfs/ 目录里面,在该目录下有两个比较重要的登陆档案, 一个是 etab ,主要记录了 NFS 所分享出來的目录的完整权限设定值;另一个 xtab 则记录曾经连接到此 NFS 主机的相关用户端资料。

Lunux RHEL AS5,预设内核是支持NFS 功能的,所以只要确认的核心版本是目前新的 2.6.x 版,并且使用你的 distribution 所提供的核心,就不会有问题。

至于NFS服务器的架设在很简单,只要编辑好主要设置文件 /etc/exports 之后, 先启动 portmap ,然后再启动nfs ,NFS服务器就架设成功了。

在NetApp存储也是内核就支持NFS功能,只需要检查其license和options选项即可,还需要查看/etc/exports文件。

1.5、/etc/exports文件讲解

作为系统管理员,你想控制NFS客户端访问有NFS license的存储上的文件和目录。需要输出客户想要访问的资源。客户机只能mount输出的资源。

有两个办法输出资源:

  1. 为了永久有效,在/etc/exports文件里面指定需要export的资源,然后在命令行执行exportfs –a使其立即生效。
  2. 为了临时访问,可以使用exportfs命令来输出不是定义在/etc/exports里面的资源或者是在/etc/exports文件里面定义了但访问权限不一样,命令行里面的设置,重启后就失效。
wangjun> rdfile /etc/exports      ==这是setup过程中生成的文件,定义了adminhost可以访问根卷。
tan> rdfile /etc/exports            ===setup完,缺省的/etc/exports配置
#Auto-generated by setup Sat Dec 19 22:53:36 GMT 2009

/vol/vol0 -sec=sys,ro,rw=192.168.0.103,root=192.168.0.103,nosuid

/vol/vol0/home -sec=sys,rw,root=192.168.0.103,nosuid

tan> rdfile /etc/exports
#Auto-generated by setup Tue Dec 15 04:10:30 GMT 2009

要输出的资源目录

/vol/vol0 -sec=sys,ro,rw=192.168.0.79,root=192.168.0.103,nosuid

对上面一句的解释:192.168.0.79对根卷是读写权限、192.168.0.103有完全的权限、其它主机是只读权限,安全风格是UNIX传统风格,不允许客户端setuid或setgid

/vol/vol0/home -sec=sys,rw,root=192.168.0.103,nosuid

/vol/vol1 -sec=sys,rw,root=192.168.0.79,nosuid

/vol/vol2 -sec=sys,rw,root=192.168.0.103,nosuid

/vol/vol3 -sec=sys,rw,root=192.168.0.103,nosuid

/etc/exports文件格式解释:

pathname -option[,option ] ...

条目

解释

Pathname

要被输出的文件或目录的路径名

anon=uid|name

如果客户端是以root用户发起连接请求,则屏蔽root权限,设置为uid=65534,

除非授予连接上来的主机root option。

anon=

65534 这是缺省值。在Netapp这个用户是pcuser

anon=65535 这是不允许root访问,netapp这个用户是nobaby

anon=0 这是客户端root用户具有根权限

anon也可以用名字定义。

nosuid

不允许客户端采用setuid或setgid功能,缺省状态时允许的。

ro | ro=hostname[:hostname]...

输出的路径以ro方式给客户端

rw | rw=hostname[:hostname]...

输出的路径以rw方式给客户端,如果没有定义这个选项则缺省就是rw

root=hostname[:hostname]...

给指定的主机根访问权限,注意没有-root选项,而且root后面一般都跟一个主机名或ip作为参数。

sec=secflavor[:secflavor]...

The supported security flavors are:

sys for Unix(tm) style security based on uids and gids

krb5 for Kerberos(tm) Version 5 authentication.

krb5i for Kerberos(tm) Version 5 integrity service

krb5p for Kerberos(tm) Version 5 privacy service

HOSTNAMES

如果允许主机具有ro或rw权限,则允许它mount NFS服务器输出export

[-][machine name|netgroup|machine IP|subnet|DNS domain]

上面是表示主机的几种方式。这几种方式表达的格式各不相同。

在/etc/exports文件中加入条目包括你想输出的每个目录的全路径option,全路径包括/vol,比如:/vol/vol0/home

/vol/vol0/home -rw=host1:host2,root=host3 ==输出这个目录给host1,host2,权限是读写

/vol/vol1 –rw=host2 只有host2有访问权限,其它都不行

/vol/vol0/home =如果没有指定主机,则所有主机都可以以RW权限mount上它。

至于主机名称的设定主要有几个方式:

  1. 可以使用完整的 IP 或者是网段,例如 192.168.1.10 或 192.168.1.0/24 ,或 192.168.1.0/255.255.255.0 都可以接受的。
  2. 可以使用主机,这个主机名称要在 /etc/hosts 內或使用 DNS 可以被找到才行!重点是可以找到 IP 就行。如果是权限后面没有跟主机名,就是指全部主机。

在创建exports的时候,必须遵循下面的原则:

  1. 独立的输出每个volume,如果重复指定了volume则分别指定option.
  2. 在/etc/hosts文件需要解析主机的IP地址,或者通过DNS、NIS来解析。
  3. 必须明确访问权限,除非在export后面没指定任何主机,则缺省是给RW权限
  4. 子目录和其父节点可以以不同的权限输出
  5. 最长前缀决定访问权限
NetApp 存储配置练习 4:NFS

/vol/vol1/pubs ===对于所有主机是读写权限

/vol/vol1/pubs/sales –rw=host2:host3 ===但是对于sales目录只有host2:host3有RW权限。

访问权限测试:Netapp只允许客户端以root用户mount上共享出来的资源,一般是一台机器有管理权限,其它机器只能是读写或者只读权限。

第一个option前面要有-号,其它option之间用,分割开

Option指定了客户以什么权限访问目录,一个目录输出的时候可以有多个option

#Auto-generated by setup Tue Dec 15 04:10:30 GMT 2009

/vol/vol0 -sec=sys,ro,root=192.168.0.103,nosuid =对于/vol/vol0 192.168.0.103有root权限,其它机器都是只读权限

/vol/vol0/home -sec=sys,rw,root=192.168.0.103,nosuid=对于/vol/vol0/home 192.168.0.103有root权限,其它机器都是读写权限

/vol/vol1 -sec=sys,rw,root=192.168.0.79,nosuid

/vol/vol2 -sec=sys,rw=192.168.0.103,nosuid ==只有192.168.0.103可以以读写权限mount上

/vol/vol3 -sec=sys,rw ==所有机器都是RW权限

Root权限:主机可以 mount目录、修改权限和属主、创建和删除文件或者目录。

权限设置测试:

第一个option前面要有-号,其它option之间用,分割开

Option指定了客户以什么权限访问目录,一个目录输出的时候可以有多个option

测试1:没有给一台机器exports任何资源,看是否可以mount上资源

/vol/vol0 -sec=sys,rw=192.168.01.03,root=192.168.0.103,nosuid =可以看见/vol/vol0只export给了103这台机器

[root@linserver ~]# mount tan:/vol/vol0 /tan ==在另一台机器去mount,/vol/vol0可以看见不让mount

mount: tan:/vol/vol0 failed, reason given by server: Permission denied

另外客户端的mount还不一样,在solaris10里mount命令在/usr/sbin/mount目录,里面说明solaris只能让有系统权限的用户去mount,而linux在/usr/bin里面。

测试2.RW选项没有指定任何主机,看客户端是否mount上。

/vol/vol1 -sec=sys,rw,root=192.168.0.103,nosuid ==这是/etc/exports文件的写法,rw后面没指定任何主机

[root@linserver /]# mount tan:/vol/vol1 /tan1 =找一台不是 103的主机,看是可以mount上主机的。

测试3不指定rw选项,看客户端是否mount上。

/vol/vol1 -sec=sys,rw,root=192.168.0.103,nosuid ==这是/etc/exports文件的写法,没有指定rw选项

发现依然是可以mount上的。

总结:

  1. 选项后面没有指定任何主机、网段、域等信息,则就是所有主机都具有此权限
  2. 选项后面指定了某个或某些主机、网段、域等信息,则就是只有指定的主机有此权限。
  3. RW选项是缺省就带的,不写也存在,如果输出的资源后面没有跟任何权限选项,那么缺省就是rw选项并给所有主机,如果有其它选项指定了root给某个主机,rw也是隐含有的。

测试4:找一台机器是linux操作系统但不是root用户去mount /vol/vol0

/vol/vol0 -sec=sys,ro,rw=192.168.0.103,root=192.168.0.103,nosuid

[test@linserver ~]$ mount tan:/vol/vol0 /home/test/wangjun

mount: only root can do that ===这是Netapp的设置,只能是root用户可以mount输出的资源

测试5:根据/etc/exports文件里面的设定,看mount上/vol/vol1后,用户权限是什么样?

/vol/vol1 -sec=sys,rw,root=192.168.0.103,nosuid ==/etc/exports文件是这么写的。

(1)、试验以192.168.0.210这台机器mount上/vol/vol1,挂接目录是/home/test/wangjun,这台机器的主机权限是RW

[root@linserver test]# ls –l ==可见目录的属性如下。

total 4

drwxr-xr-x 3 root root 4096 Dec 15 12:49 wangjun

[root@linserver test]# chown -R test:test /home ===想修改目录属主的时候,提示无权限,因为这台机器对输出的资源没有完全控制的权限

chown: changing ownership of `/home/test/wangjun/server103_linux32.bin': Operation not permitted

chown: changing ownership of `/home/test/wangjun/wangjun': Operation not permitted

chown: changing ownership of `/home/test/wangjun/.snapshot': Read-only file system

chown: changing ownership of `/home/test/wangjun': Operation not permitted

试验发现主机权限是RW的情况下,chown,chmod是不行的,cat可以、vi也提示无权限、从这个目录向其它目录拷贝文件是可以的,从其它目录向它拷贝文件不可以,删除其中的文件也不可以,看来主机权限是RW也只是可以mount上来,然后权限也就是只读的。

(2)、试验以192.168.0.103这台机器mount上/vol/vol1,挂接目录是/tan0,这台机器的主机权限是root

可以chown,chmod,创建文件和目录,删除文件等。这样试验结果是在192.168.0.103上这台机器上主机权限是完全控制,可以针对连接到这台主机的不同用户分配不同的权限,而其它主机由于是RW权限,所以只能copy输出目录上的资源或者查看,但不能修改。

(3)、试验主机权限RW的实现

/vol/vol1 -sec=sys,rw=192.168.0.210,root=192.168.0.103:192.168.0.210,nosuid

192.168.0.210机器上Root用户要有读写权限,必须也要授予这台机器root权限。这样这台机器的root用户就可以修改mount点的权限。

[root@linserver tan]# chmod 777 1.txt

这样这台机器的其它用户就可以修改这个文件了,也就是具有了读写权限。

测试6:修改了/etc/exports文件里面的设定,但没有exportfs –a使其马上生效,那么客户端还是按以前的设定可以mount上资源。如果客户端正mount着,/etc/exports文件里面让其无权限mount了,那么只有下次再mount的时候才会生效,另外如果volume被删除或改名了,/etc/exports文件里面的条目也会自动修改。

nfs分主机权限和用户权限的。netapp这边控制主机权限。主机端控制用户权限

1.6、exportfs命令

exportfs [-aiuv] [-I opton] [pathname]

exportfs –a ====输出/etc/exports文件里面的全部条目,exportfs –av显示过程

exportfs –i –o ==相当于命令行输出资源

export fs –i –o ro=host1 /vol/vol0/home

exportfs –u =不输出/etc/exports文件里面的条目exports –u /vol/vol0/sales

exportfs –ua ==不输出/etc/exports文件里面的所有条目

tan> exportfs -p /vol/vol0     ===相当于在/etc/exports里面加上这个条目

/vol/vol0 -sec=sys,rw

1.7、主机端如何mount输出的资源

试验发现linux和solaris只允许root用户来mount网络资源。

在NFS服务器设定好了之后,我们可以先测试一下NFS连接情况,就是利用 showmount 这个指令来查看:

[root@linux ~]# showmount [-ae] [hostname|IP]

参数:

-a :显示目前主机与客户端的 NFS 连接分享的状态;

-e :显示某部主机的 /etc/exports 所分享的目录资料。

bash-3.00# showmount -e 192.168.0.170

export list for 192.168.0.170:

/vol/vol0/home (everyone)

/vol/vol0 192.168.0.103

/vol/vol1 (everyone)

-bash-3.00# mkdir test

-bash-3.00# mount tan:/vol/vol0/home /test

-bash-3.00# mkdir tan

-bash-3.00# mount tan:/vol/vol0 /tan

-bash-3.00# cd /tan

-bash-3.00# ls -l

total 24

drwxr-xr-x 20 root root 8192 Dec 15 12:13 etc

drwxrwxrwt 2 root root 4096 Aug 28 2008 home

-bash-3.00# rpcinfo -p 192.168.0.170 ==看存储上面注册的端口信息

program vers proto port service

100011 1 udp 4049 rquotad

100024 1 tcp 4047 status

100024 1 udp 4047 status

100021 4 tcp 4045 nlockmgr

100021 3 tcp 4045 nlockmgr

100021 1 tcp 4045 nlockmgr

100021 4 udp 4045 nlockmgr

100021 3 udp 4045 nlockmgr

100021 1 udp 4045 nlockmgr

100005 3 tcp 4046 mountd

100005 2 tcp 4046 mountd

100005 1 tcp 4046 mountd

100005 3 udp 4046 mountd

100005 2 udp 4046 mountd

100005 1 udp 4046 mountd

100003 3 tcp 2049 nfs

100003 2 tcp 2049 nfs

100003 3 udp 2049 nfs

100003 2 udp 2049 nfs

100000 2 tcp 111 rpcbind

100000 2 udp 111 rpcbind

-bash-3.00# cat /etc/fstab ===开机自动挂载NFS资源

/dev/VolGroup00/LogVol00 / ext3 defaults 1 1

LABEL=/boot /boot ext3 defaults 1 2

devpts /dev/pts devpts gid=5,mode=620 0 0

tmpfs /dev/shm tmpfs defaults 0 0

proc /proc proc defaults 0 0

sysfs /sys sysfs defaults 0 0

/dev/VolGroup00/LogVol01 swap swap defaults 0 0

tan:/vol/vol1 /tan1 nfs nosuid,noexec,nodev,rw,bg,soft,rsize=32768,wsize=32768 0 0

192.168.0.155:/vol/vol1 /oracle nfs hard,tcp,nfsvers=3,bg,rsize=32768,wsize=32768,noac 0 0 ===在nas设备上安装oracle的mount options

参数

参数代表意义

系統预设值

suid

nosuid

如果挂载的 partition 上面有任何 SUID 的 binary 程序时, 你只要使用 nosuid 就能够取消 SUID 的功能了!

suid

rw

ro

你可以指定该 partition 是只读 (ro) 或可读写!

rw

exec

noexec

是否具有执行binary file 的权限? 如果你想要挂载的仅仅是 (例如 /home),那么可以选择noexec

exec

user

nouser

是否允许使用者进行档案的挂载与卸载功能,如果要保护档案系統,最好不要提供使用者进行挂载与卸载。

nouser

auto

noauto

这个auto 指的是『mount -a』时,会不会被挂载。 如果你不需要这个 partition随时被挂载,可以设定为noauto。

auto

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

[root@linux ~]# mount -t nfs -o nosuid,noexec,nodev,rw \

192.168.0.2:/home/public /home/nfs/public

[root@linux ~]# mount

192.168.0.2:/home/public on /home/nfs/public type nfs

(rw,noexec,nosuid,nodev,addr=192.168.0.2)

这样一来你所挂载的这个文件系統就只能作为资料存取之用,相对来说,对于客户端是比较安全一些的。

 关于NFS 特殊的挂载参数

除了上述的 mount 参数之外,其实针对 NFS 服务器,还有一些额外的参数, 因为NFS 使用的是 RPC 服务,这个RPC 必須要客户端与服务器端两者都有启动RPC 才能运行。 在一般的模式下,你想要在客户端挂载服务器端的 NFS档案系統时,一次指令只能挂载一次, 如果该次挂载由于某些问题 (例如服务器未开机、RPC忘记开等等)导致无法顺利挂载时, 你只能等到连线超时 (time out) 後,才能够继续工作。

另外,当建立连线后,RPC 会不断的在客户端与服务器两者之间进行呼叫, 此时如果有一台主机失去连接,那么 RPC将会持续不断的呼叫,直到服务器或客户端恢复连线为止。 此一行为将导致RPC服务出现延迟问题, 結果常常就造成你在执行df 或者是 mount 等指令时,出現很长时间的等待情况。

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

参数

参数功能

预设参数

fg

bg

当执行挂载时,该挂载的行为会在前景 (fg) 还是在背景 (bg) 执行, 若在前景执行时,則 mount 会持续尝试挂载,直到成功或 time out 为止,若为背景执行, 則 mount 会在背景持续多次进行 mount ,而不会影响到前景的程序操作。 如果网络连线有些不稳定,或是服务器常常需要开关机,那建议使用 bg 比较适合。

fg

Soft

hard

上面不是谈到挂载时会使用 RPC 呼叫, 如果是 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

二、NETAPP关于NFS的文档

2.1、NFS基础知识

NFS是一个分布式文件系统,它容许用户访问远程系统上的文件和目录,这些文件和目录对用户来说好像是在本地。用户可以使用OS命令创建,删除,读写远程文件和目录,以及设置远程文件和目录的属性,而这一切都是在本地完成的。NFS使用RPC而不受服务器机器类型、OS和网络结构的限制。

 NFS基于客户机/服务器模式。一个NFS服务器拥有本地磁盘上的文件,客户机通过NFS访问它。拥有实际磁盘,并通过NFS将这些磁盘共享出来的主机叫NFS服务器,通过NFS访问文件系统的叫NFS客户机。服务器给客户机共享文件系统的操作叫做导出(export ).客户机要访问服务器导出的文件系统之前,必须在本地先挂接(mount)这个文件系统。
     NFS服务器导出的目录叫做远程资源,并通常写做:hostname:pathname 格式,其中hostname是NFS服务器的主机名,pathname是服务器上被导出目录的绝对路径。在客户机上安装远程资源的那个目录叫做挂接点(mount point)。

NetApp 存储配置练习 4:NFS

RPC的知识:

远程过程调用(RPC)是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC 协议假定某些传输协议的存在,如 TCP 或 UDP,为通信程序之间携带信息数据。在 OSI 网络通信模型中,RPC处在session layer。NFS处在应用层。RPC 使得开发包括网络分布式多程序在内的应用程序更加容易。

RPC 采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用过程接收答复信息,获得进程结果,然后调用执行继续进行。

Portmap的知识:

portmap进程是一种网络服务,它容许客户程序按照标准的方法查找与一个特定程序相关的一个端口号。portmap进程的主要功能就是吧RPC程序号转化为internet的端口号。

 当一个RPC服务器启动时,会选择一个空闲的端口号并在上面监听(每次启动后的端口号各不相同),同时它作为一个可用的服务会在portmap进程注册。一个RPC服务器对应唯一一个RPC程序号,RPC服务器告诉portmap进程它在哪个端口号上监听连接请求和为哪个RPC程序号提供服务。

 portmap进程在端口111上监听,以便客户进程容易与它取得联系。NFS服务默认的端口号是2049。

file locking & Lock Manager & Automounter

file locking 是防止多个用户同时对一个文件进行更改。

Lock Manager NFS使用NLM来提供一个类似于UNIX的file lock的功能来管理客户机和服务器进程。

Automounter是一个程序,可以按要求自动挂接(mount)文件系统。或者当文件系统超过某个时限后自动卸载(umount)文件系统。现在部分linux环境下对光盘和USB设备管理就是这样,方便使用。

NFS不同的版本之间的区别:

Version 2

Version 3

Version 4

Based on RFC 1094

Based on RFC 1813

Based on RFC 3530

Uses RPC protocol based on RFC 1057

Uses RPC protocol based on RFC 1057

Uses compound RPC protocol based on RFC 1831

Supports 32-bit file size

Supports 32- to 64-bit file size

Supports 32- to 64-bit file size

Stateless

Stateless

Stateful, no dependency on NFS v2 and v3

options nfs.export.auto-update on or off

2.2、NFS的配置

NFS配置的基本过程:

要提供NFS的服务功能,需要存储系统提供的服务包括:mount daemon,network lock manager,network file system daemon,status,rpcbin,rquotad and portmapper.

    上面说到的这些服务是每个NFS进程都需要的。例如rpcbind不运行的话。在NFS的客户端和服务器端不能建立连接。

设置NFS的客户端(一般是各种服务器)和服务器端 (一般是存储设备) 包括以下内容:

第一步:在存储端给NFS打上license,启动管理进程(rpc.nfsd 和rpc.mountd)

rpc.nfsd:

这个daemon 主要的功能就是在管理 Client 是否具有登入主机的权限,其中还包含这个登入者的 ID 的判別。

rpc.mountd:

这个 daemon 主要的功能,则是在管理 NFS 的文件系统了。当Client 端顺利的通过 rpc.nfsd 而登入服务器之后,在它可以使用 NFS 服务器提供的文件之前,还会经过文件使用权限 (就是那个 -rwxrwxrwx 与owner, group 那几个权限) 的认证程序,它会去读 NFS 的设定文件 /etc/exports 来比对 Client 的权限,当通过一关之后 Client 就可以取得使用 NFS 文件的权限了 (注:这也是我们用来管理 NFS 分享目录的使用权限与安全设定的地方了)

第二步: 在NFS客户端启动NFS服务。

第三步:在存储端export文件系统。用更新/etc/exports文件,exports命令等方式。

第四步:在客户端mount文件系统。通过更新/etc/fstab文件或者运行mount命令。

export and mount

服务器端:

/etc/exports文件包含了已经被export给客户端的目录和文件,最多包含10240个条目(entry),对条目的大小没有限制, 一个条目可以分成几行,条目包含了路径名和选项。

     当options nfs.export.auto-update 设置为on的情况下(缺省是on),用命令exportfs或者对volume做了创建,重命名,删除等更新动作时,系统会自动更新/etc/exports文件。

客户端:

  mount命令被用来连接服务器端的文件系统,需要在本机上选择或建立一个挂接点(mountpoint ),一个目录,卸载的话使用命令umount,已经mount的资源都包含在系统的mount table(/etc/mnttab或者/etc/mtab文件)中。

访问限制

可以通过/etc/exports文件中的条目来定义,或者通过exportfs命令来指定访问限制

  1. 哪个NFS客户端具有什么样的访问权限(ro,rw,root)
  2. 匿名用户和root用户访问共享出来资源的UID是什么?
  3. 客户端的root用户是否可以访问这些资源
  4. NFS客户端是否可以对文件使用SETUID
  5. 安全类型必须支持NFS客户端访问共享的资源
  6. 当多个限制条件加于某个资源时,最严格的限制优先起作用

/etc/exports 中各选项的解释

DR*> rdfile /etc/exports

#Auto-generated by setup Sat Mar 22 09:08:52 EDT 2008

/vol/vol0       -sec=sys,rw,anon=0,nosuid

/vol/vol0/home  -sec=sys,rw,nosuid

/vol/vol1       -sec=sys,rw,nosuid

在/etc/exports文件中,一个被导出的NFS目录占据一行或多行,就是上面说的一个条目。格式上面例子中可以看到。一个带全路径的目录(绝对目录)。选项是下面说到的一个或多个设置的组合。

ro   如果指定客户端,那该客户端上的用户以只读的方式访问被导出的目录。如果没有指定,那导出的目录对所有客户端用户都是只读。

rw  如果指定客户端,那该客户端用户以读写的方式访问被导出的目录。如果没有指定,则客户端用户对导出的目录可读写。但是注意NFS服务器为安全起见,对于客户端以root用户mount过来,缺省设置客户端root用户的UID=65534,但对于其它客户端用户是使用其缺省的UID,可以根据此UID确定它对文件和目录是什么权限。加了rw/ro后才可以mount上输出的资源。

root 如果指定主机,就有root的权限。如果没有指定,那表示任何主机都没有root访问权限。Root后面必须跟着主机IP或名字。Root选项后面跟的主机可以以root权限mount到挂载点,这些主机可以修改权限和ownership、创建和删除文件或目录。但是root选项前面必须有ro或者rw选项,否则根本无法mount上输出的资源。

anon 默认情况,该anon选项指定一个UID 65534(没指定的情况下)。如果UID被指定为65535,root用户的访问将被禁止。如果UID被指定为0,客户端的访问都将被视为root用户。

root选项和anon选项配合在一起,指定那台客户端的root用户以什么权限访问输出的资源。

exportfs命令中有两个options,一个是“root=”,另一个是”anon=”。

1、如果你使用在exportfs命令中使用"root=<hostname or ip address>"选项, 则NETAPP存储会将root选项后面对应主机的root用户分配UID=0。

测试如下:

在存储端设置共享export

我在存储端的/etc/exports文件里面这么设置:/vol/voltest -sec=sys,root=192.168.0.3,nosuid

系统自动给我变成:/vol/voltest -sec=sys,rw,root=192.168.0.3,nosuid =加上了rw

结果:192.168.0.3有root权限,但是192.168.0.4提示“mkdir: cannot create directory `test': Permission denied”

再做以下场景试验:在192.168.0.3在网络盘创建一个目录oracle,然后修改这个目录的属主是oracle:oinstall,然后在192.168.0.4机器mount上后,发现在网络盘根目录是无权限的,但进入oracle目录后,发现是可以具有权限。

2、如果在exportfs命令中没有使用”root=”选项,但同时使用了”anon=501”,则从任意客户端登录进来的root用户将被分配UID=501。

测试如下:

在存储端设置共享export

(1)、我在存储端的/etc/exports文件里面这么设置:/vol/voltest -sec=sys,anon=0,nosuid

系统自动给我变成:/vol/voltest -sec=sys,rw,anon=0,nosuid =加上了rw

结果:192.168.0.3和192.168.0.4都具有了root权限。看来有root权限的前提就是要有rw权限呀。

(2)、我在存储端的/etc/exports文件里面这么设置:/vol/voltest -sec=sys,ro,anon=0,nosuid

发现192.168.0.3和192.168.0.4都可以mount上,但提示是“rm: cannot remove `2': Read-only file system”

Cat命令可以看文件,vi命令也是可以看文件,但此时不能写。

(3)、我在存储端的/etc/exports文件里面这么设置:/vol/voltest -sec=sys,rw,anon=501,nosuid

这样配置相当于root的UID=501,如果主机端有UID=501创建的文件,比如oracle用户创建文件,root用户有权限删除,但是本机root用户创建的文件是不允许删除的,说明本地root用户,和mount网络盘的root用户权限还不一样。

3、如果你在exportfs命令中,同时使用了”root=”和”anon=0”选项,则在root=…后面客户端的root用户将分配为UID=0;不包括在列表中的主机的root用户也会被分配UID=0。

测试如下:

在存储端设置共享export

(1)、我在存储端的/etc/exports文件里面这么设置:/vol/voltest -sec=sys,root=192.168.0.3,anon=0,nosuid

系统自动给我变成:/vol/voltest -sec=sys,rw,root=192.168.0.3,anon=0,nosuid =加上了rw

结果:192.168.0.4的root用户也变成什么权限都有,和root选项没关系了。

4.如果你没有使用"root="和"anon="选项,则所有客户端的root用户将被分配UID= 65534。5.所有非root用户都将在存储里面被分配为其在客户端的原始UID(重要)。

测试如下:

在存储端设置共享export

(1)、我在存储端的/etc/exports文件里面这么设置:/vol/voltest -sec=sys,rw,nosuid

系统自动给我变成:/vol/voltest -sec=sys,rw,nosuid =加上了rw

发现192.168.0.3和192.168.0.4两台机器以root用户mount上来,提示没有权限,一台机器切换成oracle用户UID=501,则对owner=oracle的文件夹是有权限的。

node1> rdfile /etc/passwd

root:********:0:1::/:

pcuser::65534:65534::/:

nobody::65535:65535::/:

ftp::65533:65533:FTP Anonymous:/home/ftp:

例子:

/vol/vol72 -ro=host1:host3,rw=host2,root=host2

  1. 主机host1,host2,host3可以访问/vol/vol72
  2. Host2是读写权限
  3. Host1和host3是读写权限
  4. Host2是root访问权限

/vol/volnfs/qnfs或者/vol/volnfs/qnfs -rw

所有的主机都有读写权限对于qtree资源

/vol/volnfs/qnfs –ro

所有的主机都有只读权限

/vol/volnfs/qnfs –ro,rw=hostA:hostB

混合的访问权限,只有hostA和hostB有读写权限,其它主机只有读写权限。

/vol/volnfs/qnfs –anon=0

给客户端root访问

/vol/volnfs/qnfs –anon=root

给用户root访问权限

/vol/volnfs/qnfs –anon=65535

不允许客户端root访问权限

/vol/volnfs/qnfs –root=hostA:hostB,anon=65535

NFS mount 过程

Client

Process

Server

Here is my session ID (XID)

Portmapper

I see your session ID (XID)

I want to mount

Mount

Who are you?

I am UID0 and GID All

Mount

OK, here is my fhandle (FSID)

Should I use v3 TCP?

Portmapper

Yes on port 1024

Can you hear me on port 1024 (SYN)?

TCP

Yes, let us negotiate window size (ACK)

TCP is established (SYN, ACK)

TCP

OK (SYN, FIN,ACK)

Here is my fhandle (FSID) I want to mount

NFS

You are connected

2.3、访问权限测试

两台linux主机linapp1、linapp2.IP分别是192.168.0.3,192.168.0.4.存储的IP是192.168.0.105.

(1)、测试选项”ro=”

设置”ro=192.168.0.3”,没有其它选项。格式第一个选项必须以”-“号开始;选项后面跟的主机列表以”:”分割,选项之间以”,”分割。

测试如下:

在存储端设置共享export

node1> rdfile /etc/exports

/vol/voltest -sec=sys,ro=192.168.0.3,nosuid ==192.168.0.3这台主机只有只读权限

[root@linapp1 /]# showmount -e 192.168.0.105

Export list for 192.168.0.105:

/vol/vol0/home (everyone)

/vol/vol0 192.168.0.3

/vol/vol1 (everyone)

/vol/voltest 192.168.0.3

[root@linapp1 /]# mount 192.168.0.105:/vol/voltest /wangjun ===mount上输出的资源

[root@linapp1 /]# cd /wangjun

[root@linapp1 wangjun]# mkdir test

mkdir: cannot create directory `test': Read-only file system

(2)、测试选项”rw=”

设置”rw=192.168.0.3”,没有其它选项。

测试如下:

在存储端设置共享export

node1> rdfile /etc/exports

/vol/voltest -sec=sys,rw=192.168.0.3,nosuid ==192.168.0.3这台主机只有读写权限

[root@linapp1 wangjun]# showmount -e 192.168.0.105

Export list for 192.168.0.105:

/vol/vol0/home (everyone)

/vol/vol0 192.168.0.3

/vol/vol1 (everyone)

/vol/voltest 192.168.0.3

[root@linapp1 /]# mount 192.168.0.105:/vol/voltest /wangjun ===mount上输出的资源

[root@linapp1 /]# cd /wangjun

[root@linapp1 wangjun]# mkdir test

mkdir: cannot create directory `test': Permission denied ===和ro权限提示的不一样了

(3)、测试选项”root=”

设置”root=192.168.0.3”,没有其它选项。

测试如下:

在存储端设置共享export

我是这么写的:/vol/voltest -sec=sys,root=192.168.0.3,nosuid

node1> rdfile /etc/exports

/vol/voltest -sec=sys,rw,root=192.168.0.3,nosuid ===但系统自动加上了rw

[root@linapp1 /]# showmount -e 192.168.0.105

Export list for 192.168.0.105:

/vol/vol0/home (everyone)

/vol/vol0 192.168.0.3

/vol/vol1 (everyone)

/vol/voltest (everyone) ====注意这里多个everyone

[root@linapp1 /]# mount 192.168.0.105:/vol/voltest /wangjun

[root@linapp1 /]# cd /wangjun

[root@linapp1 wangjun]# mkdir test

[root@linapp1 wangjun]# touch test

可见这样具有了权限。看来root选项要和root选项配合来用。

(4)、测试输出资源后面不带任何选项

测试如下:

在存储端设置共享export

我写成/vol/voltest

node1> rdfile /etc/exports

/vol/voltest -sec=sys,rw ==系统自动变成了这样一个格式,说明什么都不写缺省是给所有客户端RW权限

192.168.0.3和192.168.0.4两台客户机都可以mount上,但无权限写入。

(5)、测试定义选项”ro”,后面不指定任何主机

测试如下:

在存储端设置共享export

我写成/vol/voltest

node1> rdfile /etc/exports

/vol/voltest -sec=sys,ro ==系统自动变成了这样一个格式,说明什么都不写缺省是给所有客户端RW权限

两台客户机都可以mount,但提示是只读的文件系统。

(6)、测试定义选项”root”,后面不指定任何主机

测试如下:

在存储端设置共享export

我写成/vol/voltest -sec=sys,root

node1> exportfs -a        

exportfs [Line 4]: No "=<hosts>" in "root" option ==root选项后面必须带上主机列表

exportfs [Line 4]: invalid option, /vol/voltest not exported

(7)、测试几个选项组合在一起的情况

测试如下:

在存储端设置共享export

(1)、我写成/vol/voltest -sec=sys,rw,root=192.168.0.3,nosuid

发现此时192.168.0.3具备root权限了。192.168.0.4是读写权限。

(2)、再试验:/vol/voltest -sec=sys,ro,rw=192.168.0.3,nosuid

Mount上资源后,192.168.0.3提示Permission denied,192.168.0.4提示Read-only file system

(3)、再试验:/vol/voltest -sec=sys,ro,root=192.168.0.3,nosuid

Mount上资源后,192.168.0.3提示只读文件系统。看来ro后即使对于root用户也是只读的。

(4)、再试验ro和root组合在一起的情况:/vol/voltest -sec=sys,ro=192.168.0.4,root=192.168.0.3,nosuid

[root@linapp1 /]# mount 192.168.0.105:/vol/voltest /wangjun

mount: 192.168.0.105:/vol/voltest failed, reason given by server: Permission denied

发现 192.168.0.3都不让mount了,因为root选项前面没有rw

(5)、再试验:/vol/voltest -sec=sys,ro=192.168.0.4,rw,root=192.168.0.3,nosuid

此时192.168.0.3又具有root权限了,192.168.0.4还是只读,看来想要具有root权限还是rw不能缺少呀,分配rw权限后,才可以mount到NFS服务器。

(6)、再试验: /vol/voltest -sec=sys,anon=65535,nosuid

系统给我修改为: /vol/voltest -sec=sys,rw,anon=65535,nosuid

结果192.168.0.3和192.168.0.4两台客户机都可以mount,但是切换进挂载点目录时,提示:

[root@linapp1 /]# cd /wangjun

-bash: cd: /wangjun: Permission denied ==连只读的权限都没有了

测试如下:

/vol/voltest -sec=sys,rw,nosuid

/vol/voltest -sec=sys,ro,nosuid

read: error reading standard input: Interrupted system call

node1> exportfs -a        

exportfs [Line 5]: Duplicate entry in /etc/exports: /vol/voltest ==资源重复输出会报错

测试如下:

/vol/voltest -sec=sys,rw,nosuid

/vol/voltest/qtree1 -sec=sys,ro,nosuid

发现qtree1的权限变成是只读。、/vol/voltest的权限是读写,而且试验发现NFS服务器权限改变后,客户端不需要umount,权限就变了。

所以比较通常的配置是:/vol/vol1 -sec=sys,rw=192.168.0.3,root=192.168.0.3,nosuid

Rw与root成对出现。

2.4、NFS的性能调整

首先我们需要从客户机和服务器端分别对整个NFS的环境做个仔细的分析。我们先把从客户端放在前面开始考虑。这里面没有讨论到网络上的很多设置,那个讨论起来就扯的太远了。

  1. 设置合适的block size,优化传输速度

     在客户端,一个最重要优化设置就是NFS数据的传输buffer sizes,特别是 mount命令的选项 rsize and wsize.。多数情况下mount命令默认使用4K作为这个值。在前面说到NFS版本限制的时候也说到过V2的诸多限制中有一个值就是V2最多支持rsize and wsize为8K。到了V3版本后这个值变为了32K。NETAPP对客户端的这两个参数的推荐值,linux,solaris,aix都是rsize=32768,wsize=32768。

     也可以自己在系统中用不同的值做个测试。分别用unix的特殊文件/dev/zero和/dev/null做写入和读出的测试。

     例如:写入的例子,建议是生成文件大小为系统内存的2倍为宜。

      # time dd if=/dev/zero of=/mnt/home/testfile bs=16k count=16384

       读出的例子。
      # time dd if=/mnt/home/testfile of=/dev/null bs=16k

     然后把这个NFS的文件系统umount后再 mount才用不同的值来测试。

几种常用UNIX环境NETAPP针对数据库使用NFS的情况下,推荐使用的mount参数,

Linux:

rw,bg,hard,nointr,rsize=32768,wsize=32768,tcp,actimeo=0,vers=3
Solaris:

rw,bg,hard,intr,rsize=32768,wsize=32768,proto=tcp,forcedirectio,noac,vers=3

AIX:

cio,rw,bg,hard,intr,proto=tcp,vers=3,rsize=32768,wsize=32768

bg  是指background挂接,如果挂接失败将重试安装。

hard 是指当NFS服务器没有响应的时候客户端会继续重试直到NFS服务器响应为止。与之相对,soft指没响应的时候系统会返回一个错误。

proto是指使用TCP还是UDP协议,当然是使用TCP了。

intr 允许通知中断一个NFS调用。当服务器没有应答需要放弃的时候有用处。 这点LINUX的要求比较奇怪。

forcedirectio,cio这些是特定厂商自己提供的功能。都是为了更好的提供数据的数据完整性,和数据吞吐等而设定的。非数据库使用方式,不建议使用。

在客户端有一个容易忽视掉的问题,那就是网卡的驱动程序     
      最好升级网卡的驱动,特别是LINUX。多数情况下都会选择安装完整的LINUX,现在的LINUX版本都可以识别多数的网卡。但是使用的多是一个通用的驱动程序,对FC HBA也是一样的情况。建议到相关厂家网站上下载最新的驱动安装。还可以避免很多莫明其妙的问题,有些OEM的卡的驱动也特别注意。很可能是被该动过的.在客户端和服务器端都可以使用nfsstat命令来对NFS的操作进行监控及分析.

前面说到的都是从客户端来进行性能的优化,调整等。而NETAPP 的FILER做为NFS的服务器端的优化和性能调整就显示的更加重要一些。服务器端的问题会影响到所有的客户端。

 CPU的速度直接决定了对NFS请求的处理和响应。

 Memory这个当然是越多越好。

 System bus服务器的内部数据都是走这个。在部分阵列的宣传资料中常看到说系统内部带宽达到多少多少。

 Network 客户端所有的读写请求都要通过网络来实现。相信现在多数的网络建设都应该在千兆以上了.

在DATA ONTAP上,系统提供了大量的命令来对性能数据进行收集和分析。sysstat, nfsstat, netstat, ifstat, nfs_hist, nfs-top, stats, statit, netdiag 和 wafl_susp。 还有pktt在被集成在DATA ONTAP中,其收集的信息主要提供给NETAPP的技术支持使用。

Examples
sysstat 1

Displays the default output every second; requires control-C to terminate.

sysstat -s 1

Displays the default output every second; upon control-C termination, prints out the summary statistics.

sysstat -c 10

Displays the default output every 15 seconds, stopping after the 10th iteration.

sysstat –u –c 10 –s 2

Displays the utilization output format every 2 seconds, stopping after the 10th iteration; upon completion, prints out the summary statistics.

sysstat –x –s 5

Displays the extended (full) output every 5 seconds; upon control-C termination, prints out the summary statistics

3 次浏览 更新于 2026-11-04

同组文章NAS / SAN 协议

查看本组全部 6 篇

没有找到想要的答案?

上传日志让 AI 帮你诊断,或者在控制台里直接向 AI 提问。