CentOS 7 安装配置 NFS
环境
nps 192.168.1.97
client 192.168.1.98
一、yum 安装
»yum -y install nfs-utils rpcbind
NFS 的套件结构:
- /etc/exports :这个档案就是 NFS 的主要设定档了!不过,系统并没有预设值,所以这个档案‘ 不一定会存在’,您可能必须要使用 vi 主动的建立起这个档案喔!我们等一下要谈的设定也仅只是这个档案而已呐!
- /usr/sbin/exportfs :这个是维护 NFS 分享资源的指令,我们可以利用这个指令重新分享 /etc/exports 变更的目录资源、将 NFS Server 分享的目录卸载或重新分享等等,这个指令是 NFS 系统里面相当重要的一个喔!至于指令的用法我们在底下会再介绍。
- /usr/sbin/showmount :这是另一个重要的 NFS 指令。exportfs 是用在 NFS Server 端,而 showmount 则主要用在 Client 端。这个 showmount 可以用来察看 NFS 分享出来的目录资源喔!
- /var/lib/nfs/*tab :在 NFS 伺服器的登录档都放置到 /var/lib/nfs/ 目录里面,在该目录下有两个比较重要的登录档, 一个是 etab ,主要记录了 NFS 所分享出来的目录的完整权限设定值;另一个 xtab 则记录曾经连结到此 NFS 主机的相关用户端资料。
»nfs 的主配置文件 /etc/expots,默认为空
[root@linux ~]# vi /etc/exports /opt/test 192.168.1.0/24(rw,no_root_squash,no_all_squash,sync,anonuid=501,anongid=501) localhost(rw) *.ev.ncku.edu.tw(ro,sync) # [分享目录] [第一部主机(权限)] [可用主机名] [可用万用字元]
使配置生效 »exportfs -r
例:同一目录针对不同范围开放不同权限
[root@linux ~]# vi /etc/exports
/opt/test 192.168.1.0/24(rw,no_root_squash,no_all_squash,sync,anonuid=501,anongid=501) localhost(rw) *.ev.ncku.edu.tw(ro,sync)
/home/public 192.168.0.0/24(rw) *(ro) # 继续累加在后面,注意,我有将主机与网域分为两段 (用空白隔开) 喔!
上面的例子说的是:当我的 IP 是在 192.168.0.0/24 这个网段的时候,那么当我在 Client 端挂载了 Server 端的 /home/public 后,针对这个被我挂载的目录我就具有可以读写的权限~ 至于如果我不是在这个网段之内,那么这个目录的 资料我就仅能读取而已,亦即为唯读的属性啦
二、权限说明
注:至于权限方面 (就是小括号内的参数) 常见的参数则有:
/opt/test 为共享目录
192.168.1.0/24 可以为一个网段,一个IP,也可以是域名,域名支持通配符 如: *.qq.com
rw:read-write,可读写;
ro:read-only,只读;
sync:文件同时写入硬盘和内存;
async:文件暂存于内存,而不是直接写入内存;
no_root_squash:NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,也拥有root权限。显然开启这项是不安全的。
root_squash:NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,拥有匿名用户权限,通常他将使用nobody或nfsnobody身份;
all_squash:不论NFS客户端连接服务端时使用什么用户,对服务端分享的目录来说都是拥有匿名用户权限;
anonuid:匿名用户的UID值,可以在此处自行设定。
anongid:匿名用户的GID值。
三、启动 nfs
NFS 的启动还需要 portmap 的协助才行啊! 所以赶紧来启动吧!
[root@linux ~]# /etc/init.d/portmap start # 如果 portmap 本来就已经在执行了,那就不需要启动啊! [root@linux ~]# /etc/init.d/nfs start # 有时候可能会出现如下的警告讯息: exportfs: /etc/exports [3]: No 'sync' or 'async' option specified for export "192.168.0.100:/home/test". Assuming default behaviour ('sync'). # 上面的警告讯息仅是在告知因为我们没有指定 sync 或 async 的参数, # 则 NFS 将预设会使用 sync 的资讯而已。你可以不理他,也可以加入 /etc/exports。 [root@linux ~]# vi /etc/exports /tmp *(rw,no_root_squash,sync) /home/public 192.168.0.0/24(rw,sync) *(ro,sync) /home/test 192.168.0.100(rw,sync) /home/linux *.linux.org(rw,all_squash,anonuid=40,anongid=40,sync) [root@linux ~]# /etc/init.d/nfs restart
service rpcbind start
service nfs start
chkconfig rpcbind on
chkconfig nfs on
启动之后,请赶快到 /var/log/messages 里面看看有没有被正确的启动呢?
[root@linux ~]# vi /var/log/messages Sep 22 00:01:37 linux nfs: Starting NFS services: succeeded Sep 22 00:01:37 linux nfs: rpc.rquotad startup succeeded Sep 22 00:01:37 linux nfsd[1050]: nfssvc_versbits: +2 +3 +4 Sep 22 00:01:37 linux nfs: rpc.nfsd startup succeeded Sep 22 00:01:37 linux nfs: rpc.mountd startup succeeded Sep 22 00:01:37 linux rpcidmapd: rpc.idmapd -SIGHUP succeeded
在确认没有问题之后,接下来我们来瞧一瞧那么 NFS 到底开了哪些端口?
[root@linux ~]# netstat -ultn Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN - tcp 0 0 0.0.0.0:803 0.0.0.0:* LISTEN 1047/rpc.rquotad tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 32503/portmap tcp 0 0 0.0.0.0:819 0.0.0.0:* LISTEN 1064/rpc.mountd udp 0 0 0.0.0.0:2049 0.0.0.0:* - udp 0 0 0.0.0.0:800 0.0.0.0:* 1047/rpc.rquotad udp 0 0 0.0.0.0:816 0.0.0.0:* 1064/rpc.mountd udp 0 0 0.0.0.0:111 0.0.0.0:* 32503/portmap
- portmap 启动的 port 在 111;
- NFS 启动的 port 在 2049;
- 其他 rpc.daemons 启动的 port 则是随机产生的,因此需向 port 111 注册。
那我怎么知道每个 RPC 服务的注册状况?没关系,你可以使用 rpcinfo 来处理的。
[root@linux ~]# rpcinfo [-p] [IP|hostname] 参数: -p :显示出所有的 port 与 porgram 的资讯; 范例一:显示出目前这部主机的 RPC 状态 [root@linux ~]# rpcinfo -p localhost program vers proto port 100000 2 tcp 111 portmapper 100000 2 udp 111 portmapper 100011 1 udp 800 rquotad 100011 2 udp 800 rquotad 100011 1 tcp 803 rquotad 100011 2 tcp 803 rquotad 100003 2 udp 2049 nfs 100003 3 udp 2049 nfs 100003 2 tcp 2049 nfs 100003 3 tcp 2049 nfs 100005 1 udp 816 mountd 100005 1 tcp 819 mountd 100005 2 udp 816 mountd 100005 2 tcp 819 mountd 100005 3 udp 816 mountd 100005 3 tcp 819 mountd # NFS版本 埠口 服务名称
如果你的 rpcinfo 无法输出,那就表示注册的资料有问题啦!可能需要重新启动 portmap 与 nfs 喔!
NFS 的连线观察
[root@linux ~]# showmount [-ae] [hostname|IP] 参数: -a :显示目前主机与用户端的 NFS 连线分享的状态; -e :显示某部主机的 /etc/exports 所分享的目录资料。 范例一:请显示出刚刚我们所设定好的相关 exports 资讯 [root@linux ~]# showmount -e localhost Export list for localhost: /tmp * /home/linux *.linux.org /home/public (everyone) /home/test 192.168.0.100
很简单吧!所以,当您要扫瞄某一部主机他提供的 NFS 分享的目录时,就使用 showmount -e IP (或hostname) 即可!非常的方便吧!这也是 NFS client 端最常用的指令喔!
如果有其他用户端挂载了你的 NFS 档案系统时, 那么该用户端与档案系统资讯就会被记录到 /var/lib/nfs/xtab 里头去的!
[root@linux ~]# tail /var/lib/nfs/etab /home/public *(ro,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash, subtree_check,secure_locks,mapping=identity,anonuid=-2,anongid=-2) # 上面是同一行,可以看出除了 ro, sync, root_squash 等等, # 其实还有 anonuid 及 anongid 等等的设定! /tmp *(rw,sync,wdelay,hide,nocrossmnt,secure,no_root_squash,no_all_squash,subtr ee_check,secure_locks,mapping=identity,anonuid=-2,anongid=-2) # 同样的,在 /tmp 也有很多的权限相关的参数喔!
如果你想要重新处理 /etc/exports 档案,当重新设定完 /etc/exports 后需不需要重新启动 nfs ? 不需要啦!如果重新启动 nfs 的话,要得要向 RPC 注册!很麻烦~ 这个时候我们可以透过 exportfs 这个指令来帮忙喔!
[root@linux ~]# exportfs [-aruv] 参数: -a :全部挂载(或卸载) /etc/exports 档案内的设定 -r :重新挂载 /etc/exports 里面的设定,此外,亦同步更新 /etc/exports 及 /var/lib/nfs/xtab 的内容! -u :卸载某一目录 -v :在 export 的时候,将分享的目录显示到荧幕上! 范例一:重新挂载一次 /etc/exports 的设定 [root@linux ~]# exportfs -arv exporting 192.168.0.100:/home/test exporting 192.168.0.0/24:/home/public exporting *.linux.org:/home/linux exporting *:/home/public exporting *:/tmp 范例二:全部都卸载 [root@linux ~]# exportfs -auv
要熟悉一下这个指令的用法喔!这样一来,就可以直接重新 exportfs 我们的记录在 /etc/exports 的目录资料啰!
四、客户端挂载:
mount -t nfs 192.168.1.97:/opt/test /mnt
#查看可挂载
showmount -e 192.168.1.97
Export list for 192.168.1.97:
/opt/test 192.168.1.0/24
无提示 既为成功
客户端在挂载的时候遇到的一个问题如下,可能是网络不太稳定,NFS默认是用UDP协议,换成TCP协议即可:
mount -t nfs 192.168.1.97:/opt/test /mnt -o proto=tcp -o nolock