一、NFS服务简介
NFS 就是 Network FileSystem 的缩写,最早之前是由sun 这家公司所发展出来的。 它最大的功能就是可以透过网络,让不同的机器、不同的操作系统、可以彼此分享个别的档案 (share files)。所以,你也可以简单的将他看做是一个文件服务器 (file server) 呢!这个 NFS 服务器可以让你的 PC 来将网络远程的 NFS 服务器分享的目录,挂载到本地端的机器当中, 在本地端的机器看起来,那个远程主机的目录就好像是自己的一个磁盘分区槽一样 (partition)!使用上面相当的便利!
因为 NFS 支持的功能相当的多,而不同的功能都会使用不同的程序来启动, 每启动一个功能就会启用一些端口来传输数据,因此, NFS 的功能所对应的端口才没有固定住, 而是随机取用一些未被使用的小于 1024 的埠口来作为传输之用。但如此一来又造成客户端想要连上服务器时的困扰, 因为客户端得要知道服务器端的相关埠口才能够联机吧!
此时我们就得需要远程过程调用 (RPC) 的服务啦!RPC 最主要的功能就是在指定每个 NFS 功能所对应的 port number ,并且回报给客户端,让客户端可以连结到正确的埠口上去。 那 RPC 又是如何知道每个 NFS 的埠口呢?这是因为当服务器在启动 NFS 时会随机取用数个埠口,并主动的向 RPC 注册,因此 RPC 可以知道每个埠口对应的 NFS 功能,然后 RPC 又是固定使用 port 111 来监听客户端的需求并回报客户端正确的埠口, 所以当然可以让 NFS 的启动更为轻松愉快了!
所以你要注意,要启动 NFS 之前,RPC 就要先启动了,否则 NFS 会无法向 RPC 注册。 另外,RPC 若重新启动时,原本注册的数据会不见,因此 RPC 重新启动后,它管理的所有服务都需要重新启动来重新向 RPC 注册。
当客户端有 NFS 档案存取需求时,他会如何向服务器端要求数据呢?
- 客户端会向服务器端的 RPC (port 111) 发出 NFS 档案存取功能的询问要求;
- 服务器端找到对应的已注册的 NFS daemon 埠口后,会回报给客户端;客户端了解正确的埠口后,就可以直接与 NFS daemon 来联机。
由于 NFS 的各项功能都必须要向 RPC 来注册,如此一来 RPC 才能了解 NFS 这个服务的各项功能之 port number, PID, NFS 在服务器所监听的 IP 等等,而客户端才能够透过 RPC 的询问找到正确对应的埠口。 也就是说,NFS 必须要有 RPC 存在时才能成功的提供服务,因此我们称 NFS 为 RPC server 的一种。事实上,有很多这样的服务器都是向 RPC 注册的,举例来说,NIS (Network Information Service) 也是 RPC server 的一种呢
二、所需要的软件及软件结构
要设定好 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 服务所需要的主要软件啦!一定要有喔!
- RPC 主程序:rpcbind
NFS 这个咚咚真的是很简单,上面我们提到的 NFS 软件中,配置文件只有一个,执行档也不多, 记录文件也三三两两而已吶!赶紧先来看一看吧! ^_^
- 主要配置文件:/etc/exports
这个档案就是 NFS 的主要配置文件了!不过,系统并没有默认值,所以这个档案『 不一定会存在』,你可能必须要使用 vim 主动的建立起这个档案喔!我们等一下要谈的设定也仅只是这个档案而已吶! - NFS 文件系统维护指令:/usr/sbin/exportfs
这个是维护 NFS 分享资源的指令,我们可以利用这个指令重新分享 /etc/exports 变更的目录资源、将 NFS Server 分享的目录卸除或重新分享等等,这个指令是 NFS 系统里面相当重要的一个喔!至于指令的用法我们在底下会介绍。 - 分享资源的登录档:/var/lib/nfs/*tab
在 NFS 服务器的登录文件都放置到 /var/lib/nfs/ 目录里面,在该目录下有两个比较重要的登录档, 一个是 etab ,主要记录了 NFS 所分享出来的目录的完整权限设定值;另一个 xtab 则记录曾经链接到此 NFS 服务器的相关客户端数据。 - 客户端查询服务器分享资源的指令:/usr/sbin/showmount
这是另一个重要的 NFS 指令。exportfs 是用在 NFS Server 端,而 showmount 则主要用在 Client 端。这个 showmount 可以用来察看 NFS 分享出来的目录资源喔!
就说不难吧!主要就是这几个啰!
linux集群搭建之nfs服务的搭建实战
第1章 NFS简介
1.1 什么是NFS
NFS是Network File System的缩写,中文称为网络文件系统,它的主要功能是通过网络(一个局域网)让不同的主机系统之间可以共享文件或目录,NFS的客户端(一般为应用服务器,例如web)可以通过挂载(mount)的方式将NFS服务器共享的数据目录挂载到NFS客户端本地系统中(就是某一个关在点下),从客户端本地看,NFS服务器端共享目录就好像是客户端自己的磁盘分区或者目录一样,而实际上却是远端的NFS服务器的目录。
NFS网络文件系统很像Windows系统的网络共享、安全功能、网络驱动器映射,这也和linux的samba服务类似,只不过一般情况下,Windows网络共享服务或samba服务用户办公局域网共享,而互联网中小型网站集群架构后端常用NFS进行数据共享,若是大型网站,那么有可能还会用到更复杂的分布式文件系统Moosefs(mfs)、GlusterFS。
1.2 NFS历史介绍
第一个网络文件系统被称为File Access Listener,由DEC在1976年开发。
NFS是第一个构建在IP协议之上的现代网络文件系统,在20世纪80年代,首先作为实验文件系统,由Sun Microsystems在内部开发完成,NFS协议归属与RFC标准,在随后演化为NFSv2,作为一个标准,由于NFS与其他客户端和服务器的互操作能力很好而发展迅速。
1.3 NFS发展时间表
1.4 NFS企业在企业中的应用场景
在企业集群架构的工作场景中,NFS网络文件系统一般被用来存储共享视频、图片、附件等静态资源文件,通常网站用户上传的文件都会放到NFS共享中,例如BBS产品的图片、附件、头像(网站BBS的程序不要放在NFS共享中),然后前端所有节点在访问这些静态资源时都会读取NFS存储上的资源。
NFS是当前互联网系统架构中最常用的数据存储服务之一,特别是中小型网站应用频率更高。
1.5 NFS工作流程图
1.6 NFS原理图
注意:NFS的rpc服务,在Centos5系列下名称为portmap,在Centos6系列下名称为rpcbind
第2章 NFS服务的搭建
2.1 部署服务器前的准备
操作系统 | 服务器角色 | IP地址 |
---|---|---|
CentOS release 6.9 x86_64 | NFS服务端(nfs-server) | 内网:172.16.1.31/24 外网:10.0.0.31/24 |
CentOS release 6.9 x86_64 | NFS客户端(nfs-client1) | 内网:172.16.1.41/24 外网:10.0.0.41/24 |
CentOS release 6.9 x86_64 | NFS客户端(nfs-client2) | 内网:172.16.1.8/24 外网:10.0.0.8/24 |
2.2 NFS服务端的配置
2.2.1 检查操作系统的环境
[root@nfs01 ~]# cat /etc/redhat-release
CentOS release 6.9 (Final)
[root@nfs01 ~]# uname -r
2.6.32-696.el6.x86_64
[root@nfs01 ~]# uname -m
x86_64
2.2.2 NFS服务端需要安装的软件包
nfs-utils:nfs服务的主程序,包括rpc.nfsd、rpc.mountd两个daemons和相关的文档说明及执行命令文件等
rpcbind:centos6下面的rpc主程序(centos5下的是portmap)
2.2.3 安装相应的软件包及检查
安装:
[root@nfs01 ~]# yum install nfs-utils rpcbind -y
检查:
[root@nfs01 ~]# rpm -qa nfs-utils rpcbind
rpcbind-0.2.0-13.el6_9.1.x86_64
nfs-utils-1.2.3-75.el6_9.x86_64
注意:在安装完该软件包后会自动创建nfsnobody用户
[root@nfs01 ~]# id nfsnobody
uid=65534(nfsnobody) gid=65534(nfsnobody) groups=65534(nfsnobody)
2.2.4 启动NFS相关的服务
2.2.4.1 启动rpcbind服务并进行检查
启动:
[root@nfs01 ~]# /etc/init.d/rpcbind start
Starting rpcbind: [ OK ]
检查:
[root@nfs01 ~]# /etc/init.d/rpcbind status
rpcbind (pid 2309) is running...
查看rpc的端口:
[root@nfs01 ~]# netstat -tnulp|grep rpc 端口为111
tcp 0 0 0.0.0.0:111 0.0.0.0: LISTEN 2309/rpcbind
tcp 0 0 0.0.0.0:35957 0.0.0.0: LISTEN 1221/rpc.statd
tcp 0 0 :::14282 ::: LISTEN 1221/rpc.statd
tcp 0 0 :::111 ::: LISTEN 2309/rpcbind
udp 0 0 0.0.0.0:49347 0.0.0.0: 1221/rpc.statd
udp 0 0 127.0.0.1:973 0.0.0.0: 1221/rpc.statd
udp 0 0 0.0.0.0:111 0.0.0.0: 2309/rpcbind
udp 0 0 0.0.0.0:788 0.0.0.0: 2309/rpcbind
udp 0 0 :::111 ::: 2309/rpcbind
udp 0 0 :::10354 ::: 1221/rpc.statd
udp 0 0 :::788 :::* 2309/rpcbind
查看端口映射情况:
[root@nfs01 ~]# rpcinfo -p localhost
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
注意:在未启动nfs服务时,不能看到nfs端口的映射情况
2.2.4.2 启动nfs服务并进行检查
启动:
[root@nfs01 ~]# /etc/init.d/nfs start
Starting NFS services: [ OK ]
Starting NFS quotas: [ OK ]
Starting NFS mountd: [ OK ]
Starting NFS daemon: [ OK ]
Starting RPC idmapd: [ OK ]
检查:
[root@nfs01 ~]# /etc/init.d/nfs status
rpc.svcgssd is stopped
rpc.mountd (pid 2432) is running...
nfsd (pid 2448 2447 2446 2445 2444 2443 2442 2441) is running...
rpc.rquotad (pid 2427) is running...
查看端口映射情况:
[root@nfs01 ~]# rpcinfo -p localhost
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
100011 1 udp 875 rquotad
100011 2 udp 875 rquotad
100011 1 tcp 875 rquotad
100011 2 tcp 875 rquotad
100005 1 udp 28839 mountd
100005 1 tcp 34541 mountd
100005 2 udp 12297 mountd
100005 2 tcp 38042 mountd
100005 3 udp 54557 mountd
100005 3 tcp 11471 mountd
100003 2 tcp 2049 nfs
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 2 tcp 2049 nfs_acl
100227 3 tcp 2049 nfs_acl
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 2 udp 2049 nfs_acl
100227 3 udp 2049 nfs_acl
100021 1 udp 9683 nlockmgr
100021 3 udp 9683 nlockmgr
100021 4 udp 9683 nlockmgr
100021 1 tcp 4166 nlockmgr
100021 3 tcp 4166 nlockmgr
100021 4 tcp 4166 nlockmgr
注意:此时有了端口映射
【特别注意】必须先启动rpcbind服务之后,才能启动nfs服务
原因:nfs可以视为一个rpc程序,在启动任何一个rpc程序之前,需要做好端口和功能的映射工作,这个映射工作就是由rpcbind服务来完成的,因此在提供nfs服务之前,必须要先启动rpcbind服务
2.2.4.3 检查nfs和rpc进程
[root@nfs01 ~]# ps -ef |grep nfs
root 2900 2 0 19:05 ? 00:00:00 [nfsiod]
root 3133 2 0 19:40 ? 00:00:00 [nfsd4]
root 3134 2 0 19:40 ? 00:00:00 [nfsd4_callbacks]
root 3135 2 0 19:40 ? 00:00:00 [nfsd]
root 3136 2 0 19:40 ? 00:00:00 [nfsd]
root 3137 2 0 19:40 ? 00:00:00 [nfsd]
root 3138 2 0 19:40 ? 00:00:00 [nfsd]
root 3139 2 0 19:40 ? 00:00:00 [nfsd]
root 3140 2 0 19:40 ? 00:00:00 [nfsd]
root 3141 2 0 19:40 ? 00:00:00 [nfsd]
root 3142 2 0 19:40 ? 00:00:00 [nfsd]
root 3221 2130 0 19:41 pts/0 00:00:00 grep nfs
[root@nfs01 ~]# ps -ef |grep rpc
rpcuser 1221 1 0 10:37 ? 00:00:00 rpc.statd
root 1270 2 0 10:37 ? 00:00:00 [rpciod/0]
rpc 2309 1 0 14:27 ? 00:00:00 rpcbind
root 3121 1 0 19:40 ? 00:00:00 rpc.rquotad
root 3126 1 0 19:40 ? 00:00:00 rpc.mountd
root 3173 1 0 19:40 ? 00:00:00 rpc.idmapd
root 3223 2130 0 19:42 pts/0 00:00:00 grep rpc
2.2.5 将相关的服务添加到开机自启动中
【方法1】
将nfs服务加入并检查:
[root@nfs01 ~]# chkconfig nfs on
[root@nfs01 ~]# chkconfig --list nfs
nfs 0:off 1:off 2:on 3:on 4:on 5:on 6:off
将rpcbind服务加入并检查:
[root@nfs01 ~]# chkconfig rpcbind on
[root@nfs01 ~]# chkconfig --list rpcbind
rpcbind 0:off 1:off 2:on 3:on 4:on 5:on 6:off
【方法2】
加入:
[root@nfs01 ~]# echo "/etc/init.d/rpcbind start" >>/etc/rc.local
[root@nfs01 ~]# echo "/etc/init.d/nfs start" >>/etc/rc.local
查看:
[root@nfs01 ~]# tail -2 /etc/rc.local
/etc/init.d/rpcbind start
/etc/init.d/nfs start
【注意】
在实际的生产环境中用方法2而不用方法1,因为可以方便运维人员的管理
2.2.6 配置nfs服务的配置文件/etc/exports
默认情况下该配置文件是空的:
[root@nfs01 ~]# ll -h /etc/exports
-rw-r--r--. 1 root root 0 Jan 12 2010 /etc/exports
编辑该配置文件:
[root@nfs01 ~]# vim /etc/exports
查看:
[root@nfs01 ~]# cat /etc/exports
#share /data by oldboy for bingbing at 2018-3-12
/data 172.16.1.0/24(rw,sync)
【注意】
该配置文件默认是存在,只不过是空文件而已,在172.16.1.0/24(rw,sync)中24和(之间不能有空格
查看NFS服务器配置的参数(包含默认的参数)的文件/var/lib/nfs/etab
2.2.6.1 nfs配置文件的格式
NFS共享的目录 NFS客户端地址(参1,参2,……) NFS客户端地址2(参1,参2,……)或者
NFS共享的目录 NFS客户端地址(参1,参2,……)
上述各列参数的含义:
NFS共享的目录:为NFS服务端要共享的实际目录,要用绝对路径如(/data)。注意共享目录的本地权限,如果需要读写共享,一定要让本地目录可以被NFS客户端的用户(nfsnobody)读写。/etc/exports配置文件格式书写详细如下表
常用格式说明 | 实例 |
---|---|
配置案例1 | /data 172.16.1.0/24(rw,sync) 允许客户端读写,并且数据同步写到服务器的磁盘里 |
配置案例2 | /data 172.16.1.0/24(rw,sync,all_squash,anonuid=888,anongid=888) 允许客户端读写,并且数据同步写到服务器的磁盘里,并且指定客户端的uid和gid,早期生产环境中的一种配置,适合多客户端共享一个NFS单目录,如果所有服务器的nfsnodoby账户的UID相同,则本案例就没什么意义了 |
配置案例3 | /data 172.16.1.0/24(ro) 只读共享,用途:例如在生产环境中开发人员有查看服务器日志的需求,但是又不希望给开发服务器的权限,那么就可以给开发提供从某个测试服务器NFS客户端上查看某个生产服务器日志目录(NFS共享目录)的权限,但是,这不是唯一的方法喲 |
NFS 客户端地址:为NFS服务端授权的可访问共享目录的NFS客户端地址,可以为单独的IP地址或主机名、域名等,也可以为整个网段的地址,还可以用”*”来匹配所有的客户端服务器,这里所谓的客户端一般为前端的业务服务器,例如web服务。详细说明如下表
客户端地址 | 具体地址 | 说明 |
---|---|---|
授权单一客户端访问NFS | 172.16.1.41 | 一般情况下,生产环境中此配置不多 |
授权整个网段访问NFS | 172.16.1.0/24 | 指定网段为生产环境中最常见的配置,配置简单、维护方便 |
授权整个网段可访问NFS | 172.0.0.* | 指定网段的另外写法(不推荐使用) |
授权某个域名客户端访问 | nfs.lzhnb.com | 生产环境中一般不使用 |
授权整个域名客户端访问 | *.lzhnb.com | 生产环境中一般不使用 |
NFS配置参数权限,具体如下表
参数名称 | 参数用途 |
---|---|
rw(熟记) | 表示可读写权限 |
sync(熟记) | 请求或写入数据时,数据同步写入到NFS Server的硬盘后才返回,优点:数据安全不会丢,缺点:性能比不启用该参数要差 |
async(熟记) | 写入数据时会先写到内存缓冲区,直到硬盘有空档才会在写入磁盘,这样可以提升写入效率。风险是若服务器宕机或不正常关机,会损失缓冲区中未写入硬盘的数据(解决办法:服务器主板电池或UPS不间断电源) |
all_squash(熟记) | 不管访问NFS Server共享目录的用户身份如何,它的权限都将被压缩为匿名用户,同时它的UID和GID都会变成nfsnobody账号身份,在早期多个NFS客户端同时读写NFS Server数据时,这个参数很有用,在生产环境中配置NFS的重要技巧:1)确保所有客户端服务器对NFS共享目录具备相同的用户访问权限,all_squash把所有客户端都压缩成匿名用户(UID相同),就是anonuid,anongid指定的UID和GID相同,2)所有的客户端和服务器端都需要有一个相同的UID和GID的用户,nfsnodoby(UID必须相同) |
anonuid(熟记) | 参数以anon*开头即值anonymous匿名用户,这个用户的UID设置值通常为nfsnobody的UID值,当然我们也可以自行设置这个UID值。但是,UID必须存在于/etc/passwd中。在多个NFS Clients时,如多台web server共享一个NFS目录时,通过这个参数可以使得不同的NFS Clients写入的数据对所有NFS Clients保持同样的用户权限,即为配置的匿名UID对应用户权限,这个参数很有用。一般默认就好 |
anongid(熟记) | 同anonuid,区别是把uid(用户id)换成gid(组id) |
ro | 表示只读权限 |
2.2.7 创建共享目录
[root@nfs01 ~]# mkdir /data -p
[root@nfs01 ~]# ll -d /data/
drwxr-xr-x. 2 root root 4096 Nov 19 10:45 /data/
2.2.8 更改共享目录的权限
[root@nfs01 ~]# chown -R nfsnodoby.nfsnodoby /data
[root@nfs01 ~]# ll -d /data
drwxr-xr-x 2 nfsnobody nfsnobody 4096 Mar 12 19:27 /data
2.2.9 重新加载NFS服务
[root@nfs01 ~]# /etc/init.d/nfs reload
【注意】
/etc/init.d/nfs reload<==>fexportfs -rv
修改完/etc/exports配置后,需要重新加载NFS服务
用yum/rpm包安装的软件,用service和/etc/init.d/服务名启动是一样的
2.2.10 检查有权限挂载的服务器是否能够挂载
【方法1】利用showmount来进行检查
[root@nfs01 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
或者
[root@nfs01 ~]# showmount -e localhost
Export list for localhost:
/data 172.16.1.0/24
【注意】
出现上面信息是,说明服务器可以挂载
测试的IP地址为NFS服务器的IP地址
【方法2】可以在把NFS服务器当做客户端来进行挂载测试
[root@nfs01 ~]# mount -t nfs 172.16.1.31:/data /mnt 挂载
[root@nfs01 ~]# df -h 查看
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 8.8G 1.5G 6.9G 18% /
tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 190M 35M 146M 19% /boot
172.16.1.31:/data 8.8G 1.5G 6.9G 18% /mnt
[root@nfs01 ~]# umount /mnt 测试完后取消挂载
[root@nfs01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 8.8G 1.5G 6.9G 18% /
tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 190M 35M 146M 19% /boot
2.3 NFS客户端的配置
2.3.1 检查操作系统的环境
[root@ client1 ~]# cat /etc/redhat-release
CentOS release 6.9 (Final)
[root@ client1 ~]# uname -r
2.6.32-696.el6.x86_64
[root@ client1 ~]# uname -m
x86_64
2.3.2 安装客户端软件rpcbind和nfs-utils
安装:
[root@client1 ~]# yum install nfs-utils rpcbind -y
检查:
[root@ client1 ~]# rpm -qa nfs-utils rpcbind
rpcbind-0.2.0-13.el6_9.1.x86_64
nfs-utils-1.2.3-75.el6_9.x86_64
【注意】
安装nfs-utils软件的目的是为了使用showmount等功能,所以客户端最好也装上,但是不启动NFS服务
2.3.3 启动RPC服务并进行查看
启动:
[root@client1 ~]# /etc/init.d/rpcbind start
Starting rpcbind: [ OK ]
检查:
[root@ client1 ~]# /etc/init.d/rpcbind status
rpcbind (pid 2370) is running...
2.3.4 检查能否访问服务端
【方法1】
[root@ client1 ~]# showmount -e 172.16.1.31 此ip地址为服务器端的ip地址
Export list for 172.16.1.31:
/data 172.16.1.0/24
出现上面的情况说明可以访问服务端
【方法2】
[root@ client1 ~]# telnet 172.16.1.31 111 111为rpc服务的端口
Trying 172.16.1.31...
Connected to 172.16.1.31.
Escape character is '^]'.
出现上面的情况说明可以访问服务端
2.3.5 挂载NFS共享目录
挂载:
[root@ client1 ~]# mount -t nfs 172.16.1.31:/data /mnt
查看:
[root@ client1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 8.8G 1.5G 6.9G 18% /
tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 190M 35M 146M 19% /boot
172.16.1.31:/data 8.8G 1.5G 6.9G 18% /mnt
查看:
[root@ client1 ~]# mount
/dev/sda3 on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
172.16.1.31:/data on /mnt type nfs (rw,vers=4,addr=172.16.1.31,clientaddr=172.16.1.8)
2.3.6 测试读写数据
2.3.6.1 在/mnt目录下创建测试文件
[root@ client1 ~]# cd /mnt/
[root@ client1 mnt]# touch test.txt
[root@ client1 mnt]# ls
test.txt
2.3.6.2 在NFS服务端/data目录下进行查看
[root@nfs01 ~]# cd /data
[root@nfs01 data]# ls
test.txt
至此NFS客户端挂载成功
2.3.7 将挂载命令加入开机自启动
[root@client1 ~]# echo "mount -t nfs 172.16.1.31:/data /mnt" >>/etc/rc.local
[root@client1 ~]# tail -1 /etc/rc.local
mount -t nfs 172.16.1.31:/data /mnt
第3章 NFS重点知识总结
3.1 NFS常见进程详解
3.1.1 查看NFS进程
[root@nfs01 ~]# ps -ef|grep -E "rpc|nfs"
rpcuser 1221 1 0 10:37 ? 00:00:00 rpc.statd 检查文件的一致性
root 1270 2 0 10:37 ? 00:00:00 [rpciod/0]
rpc 2309 1 0 14:27 ? 00:00:00 rpcbind
root 2900 2 0 19:05 ? 00:00:00 [nfsiod]
root 3121 1 0 19:40 ? 00:00:00 rpc.rquotad 磁盘配额进程
root 3126 1 0 19:40 ? 00:00:00 rpc.mountd 权限管理验证
root 3133 2 0 19:40 ? 00:00:00 [nfsd4]
root 3134 2 0 19:40 ? 00:00:00 [nfsd4_callbacks]
root 3135 2 0 19:40 ? 00:00:00 [nfsd] nfs主进程管理登入ID身份 认证等
root 3136 2 0 19:40 ? 00:00:00 [nfsd]
root 3137 2 0 19:40 ? 00:00:00 [nfsd]
root 3138 2 0 19:40 ? 00:00:00 [nfsd]
root 3139 2 0 19:40 ? 00:00:00 [nfsd]
root 3140 2 0 19:40 ? 00:00:00 [nfsd]
root 3141 2 0 19:40 ? 00:00:00 [nfsd]
root 3142 2 0 19:40 ? 00:00:00 [nfsd]
root 3173 1 0 19:40 ? 00:00:00 rpc.idmapd name mapping daemon
root 3271 2130 0 20:15 pts/0 00:00:00 grep -E rpc|nfs
3.1.2 NFS服务启动的进程说明
服务或进程名 | 用途说明 |
---|---|
nfsd(rpc.nfsd) | 主要功能是用来管理NFS客户端是否能够登入NFS服务端主机,其中还包括登入者的ID判别等 |
mountd(rpc.mountd) | 主要功能是管理NFS文件系统,特别注意的是:NFS本身设置的是网络共享权限,整个共享目录的权限还和目录自身的系统权限有关 |
rpc.lockd(非必要) | 可用来锁定文件,用于多客户端同时写入 |
rpc.statd(非必要) | 检查文件的一致性,与rpc.lockd有关 |
rpc.idmapd | 名字映射后台进程 |
3.3 NFS客户端挂载命令
挂载命令 | 挂载的格式类型 | NFS服务器提供的共享目录 | NFS客户端的挂载点 |
---|---|---|---|
mount | -t nfs | 172.16.1.31:/data | /mnt (该目录必须存在) |
3.4 多个NFS客户端访问服务器的读写文件时必须要有的权限
NFS服务器/etc/exports设置需要开放可写入的权限,即服务端的共享权限
NFS服务器实际要共享的NFS目录权限具有可写入w的权限,即服务端本地目录的安全权限
每台服务器都对应存在和NFS默认配置UID的相同UID的账户nfsnodoby(确保所有所有客户端的访问权限统一,否则每台机器都需要同时建立相同UID用户,并覆盖NFS的默认用户配置)
只有满足上述三个条件,多个NFS客户端才能具有查看、修改、删除其他任意NFS客户端上传文件的权限,这在大规模的集群环境中最为集群共享存储时尤为重要
第4章 错误重现及客户端排错思路
4.1 错误重现
4.1.1 服务端的防火墙未关闭
【错误实例】
[root@web01 ~]# showmount -e 172.16.1.31
clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)
并且再出现这种错误时,在客户端不能用df -h命令
【解决方法】
只需关掉NFS服务端的防火墙即可
[root@nfs01 ~]# /etc/init.d/iptables stop
iptables: Setting chains to policy ACCEPT: filter [ OK ]
iptables: Flushing firewall rules: [ OK ]
iptables: Unloading modules: [ OK ]
[root@nfs01 ~]# /etc/init.d/iptables status
iptables: Firewall is not running.
【测试】
在NFS客户端在进行测试
[root@client1 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
4.1.2 NFS服务端的共享目录权限不够
【错误实例】
在NFS客户端挂载目录下创建文件被拒绝出现下面的错误
[root@client1 ~]# cd /mnt/
[root@client1 mnt]# touch oldboy.txt
touch: cannot touch `oldboy.txt': Permission denied
【解决方法】
在客户端修改共享目录的权限
[root@nfs01 ~]# ll -d /data
drwxr-xr-x 2 root root 4096 Mar 13 20:07 /data
[root@nfs01 ~]# chown -R nfsnobody.nfsnobody /data
[root@nfs01 ~]# ll -d /data
drwxr-xr-x 2 nfsnobody nfsnobody 4096 Mar 13 20:07 /data
【测试】
在NFS客户端挂载目录下创建文件
[root@client1 ~]# cd /mnt/
[root@client1 mnt]# touch oldboy.txt
在NFS服务端共享目录下查看
[root@nfs01 ~]# cd /data
[root@nfs01 data]# ls
oldboy.txt test.txt
4.1.3 NFS服务端启动顺序有问题
【错误实例】
[root@client1 ~]# showmount -e 172.16.1.31
clnt_create: RPC: Program not registered
【解决方法】
在NFS端重新启动服务,先启动rpcbind服务,在启动nfs服务
[root@nfs01 ~]# /etc/init.d/rpcbind start
Starting rpcbind: [ OK ]
[root@nfs01 ~]# /etc/init.d/nfs start
Starting NFS services: [ OK ]
Starting NFS quotas: [ OK ]
Starting NFS mountd: [ OK ]
Starting NFS daemon: [ OK ]
Starting RPC idmapd: [ OK ]
【测试】
[root@client1 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
4.1.4 NFS服务端的nfs服务未开启
【错误实例】
[root@client1 ~]# showmount -e 172.16.1.31
clnt_create: RPC: Program not registered
【解决方法】
在NFS服务端开启nfs服务器
[root@nfs01 ~]# /etc/init.d/nfs start
Starting NFS services: [ OK ]
Starting NFS quotas: [ OK ]
Starting NFS mountd: [ OK ]
Starting NFS daemon: [ OK ]
Starting RPC idmapd: [ OK ]
【测试】
[root@client1 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
4.2 排错思路
4.2.1 首先确认NFS服务器端的服务或配置是否OK
[root@nfs01 ~]# showmount -e localhost
Export list for localhost:
/data 172.16.1.0/24
4.2.2 在NFS服务器端测试能否挂载
[root@nfs01 ~]# mount -t nfs 172.16.1.31:/data /mnt
[root@nfs01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 8.8G 1.5G 6.9G 18% /
tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 190M 35M 146M 19% /boot
172.16.1.31:/data 8.8G 1.5G 6.9G 18% /mnt
4.2.3 从客户端pingNFS服务端的ip
[root@client1 ~]# ping 172.16.1.31
PING 172.16.1.31 (172.16.1.31) 56(84) bytes of data.
64 bytes from 172.16.1.31: icmp_seq=1 ttl=64 time=2.39 ms
64 bytes from 172.16.1.31: icmp_seq=2 ttl=64 time=0.528 ms
这是通的情况
执行这步的主要目的是看物理链路是否通
4.2.4 从客户端telnet服务器端IP端口检查
[root@client1 ~]# telnet 172.16.1.31 111
Trying 172.16.1.31...
Connected to 172.16.1.31.
Escape character is '^]'
这是通的情况
执行这步的主要目的是用于测试NFS服务或RPC服务是否通
第5章 生产环境高级案例配置实战
5.1 NFS服务端的配置
5.1.1 建立用户组zuma,并指定GID为888,所有的客户端也执行同样的操作
[root@nfs01 ~]# groupadd zuma -g 888
5.1.2 建立用户zuma,指定UID为888,并加入zuma组,所有的客户端也执行同样的操作
[root@nfs01 ~]# useradd zuma -u zuma -g 888
[root@nfs01 ~]# id zuma 查看建立的用户及用户组
uid=888(zuma) gid=888(zuma) groups=888(zuma)
5.1.3 配置/etc/exports配置文件并检查
[root@nfs01 ~]# vim /etc/exports
[root@nfs01 ~]# cat /etc/exports
#share /data by oldboy for bingbing at 2018-3-12
/data 172.16.1.0/24(rw,sync)
#####
/data1 172.16.1.0/24(rw,sync,all_squash,anonuid=888,anongid=888)
5.1.4 创建共享目录并检查
[root@nfs01 ~]# mkdir -p /data1
[root@nfs01 ~]# ll -d /data1
drwxr-xr-x 2 root root 4096 Mar 12 20:00 /data1
5.1.5 给共享目录服务权限并检查
[root@nfs01 ~]# chown -R zuma.zuma /data1
[root@nfs01 ~]# ll -d /data1
drwxr-xr-x 2 zuma zuma 4096 Mar 12 20:00 /data1
5.1.6 重新加载NFS服务器
[root@nfs01 ~]# /etc/init.d/nfs reload
5.1.7确认NFS服务端的服务或配置是否OK
[root@nfs01 ~]# showmount -e localhost
Export list for localhost:
/data1 172.16.1.0/24
/data 172.16.1.0/24
至此NFS服务端配置完成
5.2 NFS客户端的配置
5.2.1 建立用户组zuma,并指定GID为888,同服务端的操作步骤
[root@client1 ~]# groupadd zuma -g 888
5.2.2 建立用户zuma,指定UID为888,并加入zuma组,同服务端的操作步骤
[root@client1 ~]# useradd zuma -u 888 -g zuma
[root@client1 ~]# id zuma 查看
uid=888(zuma) gid=888(zuma) groups=888(zuma)
5.2.3 创建挂载目录并检查
[root@client1 ~]# mkdir /test
[root@client1 ~]# ll -d /test
drwxr-xr-x 2 root root 4096 Mar 14 10:18 /test
5.2.3 检查是否启动rpcbind服务
[root@client1 ~]# /etc/init.d/rpcbind status
rpcbind (pid 1204) is running... 说明正在运行
5.2.4 测试NFS服务端是否可以挂载
[root@client1 ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data1 172.16.1.0/24
/data 172.16.1.0/24 说明可以挂载
5.2.5 挂载并进行查看
[root@client1 ~]# mount -t nfs 172.16.1.31:/data1 /test 挂载
[root@client1 ~]# df -h 查看
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 8.8G 1.5G 6.9G 18% /
tmpfs 491M 0 491M 0% /dev/shm
/dev/sda1 190M 35M 146M 19% /boot
172.16.1.31:/data 8.8G 1.5G 6.9G 18% /mnt
172.16.1.31:/data1 8.8G 1.5G 6.9G 18% /test
5.2.6 在挂载目录下创建测试文件
[root@client1 ~]# cd /test/
[root@client1 test]# touch test.txt
[root@client1 test]# ls
test.txt
5.2.7 在服务端共享目录下进行查看
[root@nfs01 ~]# cd /data1
[root@nfs01 data1]# ls
test.txt
至此指定NFS共享用户zuma共享/data1目录的配置完
Centos7安装配置NFS服务和挂载
现在有3台服务器 s1(主),s2(从), s3(从)需要实现文件实时同步,我们可以安装Nfs服务端和客户端来实现!
一、安装 NFS 服务器所需的软件包:
yum install -y nfs-utils
二、编辑exports文件,添加从机
vim /etc/exports
/home/nfs/ 192.168.248.0/24(rw,sync,fsid=0)
同192.168.248.0/24一个网络号的主机可以挂载NFS服务器上的/home/nfs/目录到自己的文件系统中
rw表示可读写;sync表示同步写,fsid=0表示将/data找个目录包装成根目录
三、启动nfs服务
先为rpcbind和nfs做开机启动:(必须先启动rpcbind服务)
systemctl enable rpcbind.service
systemctl enable nfs-server.service
然后分别启动rpcbind和nfs服务:
systemctl start rpcbind.service
systemctl start nfs-server.service
确认NFS服务器启动成功:
rpcinfo -p
检查 NFS 服务器是否挂载我们想共享的目录 /home/nfs/:
exportfs -r
#使配置生效
exportfs
#可以查看到已经ok
/home/nfs 192.168.248.0/24
四、在从机上安装NFS 客户端
首先是安裝nfs,同上,然后启动rpcbind服务
先为rpcbind做开机启动:
systemctl enable rpcbind.service
然后启动rpcbind服务:
systemctl start rpcbind.service
注意:客户端不需要启动nfs服务
检查 NFS 服务器端是否有目录共享:showmount -e nfs服务器的IP
showmount -e 192.168.248.208
Export list for 192.168.248.208:
/home/nfs 192.168.248.0/24
在从机上使用 mount 挂载服务器端的目录/home/nfs到客户端某个目录下:
cd /home && mkdir /nfs
mount -t nfs 192.168.248.208:/home/nfs /home/nfs
df -h 查看是否挂载成功。
http://blog.csdn.net/taiyang1987912/article/details/41696319
http://www.linuxidc.com/Linux/2015-05/117378.htm
[root@localhost ~]# showmount -e 172.19.162.102
clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host) 解决方法: [root@pro-www-m root]# rpcinfo -p 172.19.162.102
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
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 31206 nlockmgr
100021 3 udp 31206 nlockmgr
100021 4 udp 31206 nlockmgr
100021 1 tcp 31241 nlockmgr
100021 3 tcp 31241 nlockmgr
100021 4 tcp 31241 nlockmgr iptables -I INPUT -p tcp -s 172.19.162.100 --dport 111 -j ACCEPT iptables -I INPUT -p udp -s 172.19.162.100 --dport 111 -j ACCEPT iptables -I INPUT -p tcp -s 172.19.162.100 --dport 2049 -j ACCEPT iptables -I INPUT -p udp -s 172.19.162.100 --dport 2049 -j ACCEPT iptables -I INPUT -p tcp -s 172.19.162.100 --dport 20048 -j ACCEPT iptables -I INPUT -p udp -s 172.19.162.100 --dport 20048 -j ACCEPT iptables -I INPUT -p tcp -s 172.19.162.100 --dport 31206 -j ACCEPT iptables -I INPUT -p udp -s 172.19.162.100 --dport 31206 -j ACCEPT