NFS:Network file system,网络文件系统.由sun公司1984年推出,用来在网络中的多台计算机间实现资源共享(包括象文件或cd-rom).设计的目的是:实现在不同系统间交互使用,所以它的通信协议采用与主机和操作系统无关的技术
NFS Server可以看作是File Server,它可以让你的PC通过网络将远端得NFS SERVER共享出来的档案MOUNT到自己的系统中,在CLIENT看来使用NFS的远端文件就象是在使用本地文件一样.
一 服务端配置文档
$ cat /etc/exports
- /data/storage/bbs 10.10.100.0/24(rw,sync)
- 格式如下
- #[共享目录] [主机/网络](权限) []()多个
1 共享目录属性
ll /data/storage/bbs/ | awk '/^d/ {print $1,$2,$3,$4}'
- drwxr-xr-x 6 www www
- drwxr-xr-x 13 www www
- drwxr-xr-x 2 www www
- drwx------ 4 www www
- drwxr-xr-x 10 www www
- drwxr-xr-x 11 www www
- drwxr-xr-x 313 www www
- drwxr-xr-x 241 www www
- drwxr-xr-x 276 www www
- drwxr-xr-x 9 www www
- drwxr-xr-x 121 www www
注意:文件夹属主属组与权限,与客户端相同
2 授权的主机或网络
- 可以使用完整的IP 或者是网络,例如10.10.100.10 或10.10.100.0/24 ,也可以使用主机名称,
- 但这个主机名称必须要在/etc/hosts 内,或者使用DNS 找到该名称
3 权限详解
参数值 内容说明
- ro | rw
- 该目录分享的权限是可读写(read-write) 或只读(read-only),但最终能不能读写,还是与档案系统的rwx 及身份有关。
- sync | async sync
- 代表资料会同步写入到内存与磁盘中,async 则代表资料会先暂存于内存当中,而非直接写入磁盘!
- no_root_squash | root_squash | all_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。
注意:若是多个权限,则以逗号 "," 分开
4 启动nfs
- $ /etc/init.d/nfs start
- $ /etc/init.d/nfslock start
5 验证 nfs 服务器
$ netstat -antulp | grep -E '2049|rpc'
- tcp 0 0 0.0.0.0:896 0.0.0.0:* LISTEN 15980/rpc.rquotad
- tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN -
- tcp 0 0 0.0.0.0:910 0.0.0.0:* LISTEN 15995/rpc.mountd
- tcp 0 0 0.0.0.0:628 0.0.0.0:* LISTEN 16134/rpc.statd
- tcp 0 0 10.0.100.71:2049 10.0.100.82:680 ESTABLISHED -
- tcp 0 0 192.168.57.71:2049 192.168.57.92:982 ESTABLISHED -
- udp 0 0 0.0.0.0:2049 0.0.0.0:* -
- udp 0 0 0.0.0.0:907 0.0.0.0:* 15995/rpc.mountd
- udp 0 0 0.0.0.0:622 0.0.0.0:* 16134/rpc.statd
- udp 0 0 0.0.0.0:625 0.0.0.0:* 16134/rpc.statd
- udp 0 0 0.0.0.0:893 0.0.0.0:* 15980/rpc.rquotad
注意:2049为nfs监听端口
二 客户端
0 启动rpcbind/portmap 服务
- /etc/init.d/rpcbind #rhel6.x
- /etc/init.d/portmap #rhe5.x
1 挂载nfs服务器
- # mount -t nfs -o nosuid,noexec,nodev,rw -o bg,soft,rsize=32768,wsize=32768 10.10.100.77:/data/storage/bbs/ /storage/
2 客户端挂载参数
参数 意义
- suid | nosuid
- 如果挂载的partition 上面有任何SUID 的binary 程式时, 你只要使用nosuid 就能够取消SUID 的功能
- rw | ro
- 你可以指定该档案系统是只读(ro) 或可读写!伺服器可以提供给你可读写,用户端可以仅允许只读的参数设定值
- dev | nodev
- 是否保留装置档案的特殊功能
- exec | noexec
- 是否具有执行binary file 的权限
- user | nouser
- 是否允许使用者进行档案的挂载与卸载功能
- fg |bg
- 当执行挂载时,该挂载的行为会在前台(fg) 还是在后台(bg) 执行;若在前台执行时,则mount 会持续尝试挂载,直到成功或time out 为止,若为后台执行, 则mount 会在背持续多次进行mount ,而不会影响到前景的程序操作。
- soft | hard
- 如果是hard 的情况,则当两者之间有任何一部主机离线,则RPC 会持续的呼叫,直到对方恢复连线为止。如果是soft 的话,那RPC 会在time out 后重复呼叫,而非持续呼叫, 因此系统的延迟会比较不这么明显。
- intr
- 当你使用上头提到的hard 方式挂载时,若加上intr 这个参数, 则当RPC 持续呼叫中,该次的呼叫是可以被中断的(interrupted)。
- rsize | wsize
- 读出(rsize)与写入(wsize)的区块大小(block size)。这个设定值可以影响用户端与NFS服器端传输资料的缓冲记忆容量。
3 client端 系统中的www用户
- www:x:5000:5000::/home/www:/sbin/nologin
4 apache 用户与组
- <IfModule !mpm_netware_module>
- <IfModule !mpm_winnt_module>
- User www
- Group www
- IfModule>
- IfModule>
5 clinet端 挂载点属性
ll /storage/ | awk '/^d/ {print $1,$2,$3,$4}'
- drwxr-xr-x 6 www www
- drwxr-xr-x 13 www www
- drwxr-xr-x 2 www www
- drwx------ 4 www www
- drwxr-xr-x 10 www www
- drwxr-xr-x 11 www www
- drwxr-xr-x 313 www www
- drwxr-xr-x 241 www www
- drwxr-xr-x 276 www www
- drwxr-xr-x 9 www www
- drwxr-xr-x 121 www www
注意:文件夹属主属组与权限,与服务端相同
三 维护 NFS
1 nfs 使用的协议与端口
- grep -E '^nfs.*nfsd$' /etc/services
- nfs 2049/tcp nfsd
- nfs 2049/udp nfsd
2 RPC 使用的端口
- grep -E 'portmap' /etc/services
- sunrpc 111/tcp portmapper # RPC 4.0 portmapper TCP
- sunrpc 111/udp portmapper # RPC 4.0 portmapper UDP
注意:
RPC 是固定使用port 111 来监听端口
RPC 服务的功能就是在指定NFS 服务所对应的port number ,并且反回给用户端,让用户端可以连结到正确的端口上去。
RPC 是如何知道每个NFS 的端口?这是因为当伺服器在启动NFS 时会随机取用数个端口,并主动的向RPC 注册,因此RPC 可以知道每个端口对应的NFS。
3 命令
- 服务端重新挂载nfs
- exportfs -arv
- 服务端卸载全部nfs
- exportfs -auv
- 服务端|客户端 显示nfs共享目录
- showmount -e [ip]
扩展
NFS 的长连接
- 显示NFS 共享目录
- $ showmount -e
- Export list for one.test.com:
- /data/iso 10.0.100.0/24,192.168.57.0/24
- /data/htdocs/8080 10.0.100.0/24,192.168.6.0/24
- 査看与NFS绑定的连接
- $ netstat -antulp | grep 2049
- tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN -
- tcp 0 0 192.168.57.71:2049 192.168.57.92:984 ESTABLISHED -
- udp 0 0 0.0.0.0:2049 0.0.0.0:* -
- 当客户端挂载NFS 后,客户端就与服务端保持连接状态"ESTABLISHED",如果几百个NFS客户端,
- 嘿嘿 不过如果在挂载时使用bg参数使用后台,则会在没有数据时释放连接。
#update 20120716 结合nfs client 与 web 服务器
//统一权限以www用户与组为准
- 1 nfs server 共享目录的权限 www
- grep -i 'www' /etc/passwd
- www:x:501:501::/home/www:/sbin/nologin
- ll /data/ | grep www
- drwxr-xr-x 3 www www 4096 Jul 16 11:05 www
- grep -i 'www' /etc/exports
- /data/www/bbs/ 10.0.100.0/24(rw,sync)
- 2 nfs client 端拥有相同的uid/gid (用户与组)
- grep -i 'www' /etc/passwd
- www:x:501:501::/home/www:/sbin/nologin
- 3 nfs client 端 web 服务器使用www用户与组
- //以nginx 为例
- user www www;
#
- chkconfig --list | grep -E 'nfs|port|rpc.*3:on'
- nfs 0:off 1:off 2:off 3:off 4:off 5:off 6:off
- nfslock 0:off 1:off 2:off 3:off 4:off 5:off 6:off
- rpcbind 0:off 1:off 2:on 3:on 4:on 5:on 6:off
参考
http://linux.vbird.org/linux_server/0330nfs.php
#update 20121009
使用 NFS时请先将rpcbind 服务启动,rhel5/centos5 系列为 portmap 服务,rhel6/centos6 系列为 rpcbind 服务
NFS Server
- chkconfig --list | grep -E 'nfs|portmap|rpcbind'
- nfs 0:off 1:off 2:on 3:on 4:on 5:on 6:off
- nfslock 0:off 1:off 2:on 3:on 4:on 5:on 6:off
- portmap 0:off 1:off 2:on 3:on 4:on 5:on 6:off
NFS Client
- chkconfig --list | grep -E 'nfs|portmap|rpcbind'
- nfs 0:off 1:off 2:off 3:off 4:off 5:off 6:off
- nfslock 0:off 1:off 2:off 3:off 4:off 5:off 6:off
- rpcbind 0:off 1:off 2:on 3:on 4:on 5:on 6:off
#update 20121010
什么是RPC?(Remote Procedure Call,远程过程调用)
因为NFS支援的功能相当的多,而不同的功能都会使用不同的程式来启动,每启动一个功能就会启用一些埠口来传输资料,因此,NFS的功能所对应的埠口才没有固定住,而是随机取用一些未被使用的小于1024因为用户端得要知道伺服器端的相关埠口才能够连线吧!
此时我们就得需要远端程序呼叫(RPC)的服务啦!RPC最主要的功能就是在指定每个NFS功能所对应的端口号,并且回报给用户端,让用户端可以链接到正确的埠口上去。那RPC又是如何知道每个NFS的埠口呢?这是因为当伺服器在启动NFS时会随机取用数个埠口,并主动的向RPC注册,因此RPC可以知道每个埠口对应的NFS功能,然后RPC又是固定使用的111端口来监听用户端的需求并回报用户端正确的埠口,所以当然可以让NFS的启动更为轻松愉快了!
1 用户端会向伺服器端的RPC(端口111)发出NFS档案存取功能的询问要求;
2 伺服器端找到对应的已注册的NFS守护进程埠口后,会回报给用户端;
3 用户端了解正确的埠口后,就可以直接与NFS守护进程来连线。
由于NFS的各项功能都必须要向RPC来注册,如此一来RPC才能了解NFS这个服务的各项功能之端口号,PID,NFS在伺服器所监听的IP等等,而用 户端才能够透过RPC的询问找到正确对应的埠口。也就是说,NFS必须要有RPC存在时才能成功的提供服务,因此我们称NFS为RPC服务器的一种。事实 上,有很多这样的伺服器都是向RPC注册的,举例来说,NIS(网络信息服务)也是RPC服务器的一种呢。此外,由图13.1-2你也会知道,不论是用户 端还是伺服器端,要使用NFS时,两者都需要启动RPC才行喔.
结束
更多请:
linux 相关 37275208
vmware 虚拟化相关 166682360