第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企业在企业中的应用场景
在企业集群架构的工作场景中,NFS网络文件系统一般被用来存储共享视频、图片、附件等静态资源文件,通常网站用户上传的文件都会放到NFS共享中,例如BBS产品的图片、附件、头像(网站BBS的程序不要放在NFS共享中),然后前端所有节点在访问这些静态资源时都会读取NFS存储上的资源。
NFS是当前互联网系统架构中最常用的数据存储服务之一,特别是中小型网站应用频率更高。
1.5 NFS工作流程图
1.6 NFS原理图
注意:NFS的rpc服务,在Centos5系列下名称为portmap,在Centos6/7系列下名称为rpcbind
第2章 NFS服务的搭建
操作系统 服务器角色 IP地址
CentOS 7 NFS服务端(nfs-server) 内网:192.168.128.20
CentOS 7 NFS客户端(nfs-client) 内网:192.168.128.30
2.1 部署服务器前的准备
2.2 NFS服务端的配置
2.2.1 检查操作系统的环境
[root@nfs01 ~]# cat /etc/redhat-release
CentOS Linux release 7.4.1708
2.2.2 关闭防火墙及SELINUX
systemctl stop firewalld
systemctl disable firewalld
2.2.3 关闭:SELINUX
vi /etc/selinux/config
修改SELINUX=disabled
3 下载软件包(配置完yun前提下)
3.1 检查是否安装服务包
rpm -qa nfs-utils rpcbind
3.2 下载软件包
yum install nfs-utils rpcbind -y
#注意:在安装完该软件包后会自动创建nfsnobody用户
[root@nfs01 ~]# id nfsnobody
uid=65534(nfsnobody) gid=65534(nfsnobody) groups=65534(nfsnobody)
3.3启动rpc服务
systemctl start rpcbind
systemctl enable rpcbind
systemctl status rpcbind
3.4查看rpc的端口:
[root@nfs01 ~]# netstat -tnulp|grep rpc 端口为111
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 703/rpcbind
tcp6 0 0 :::111 :::* LISTEN 703/rpcbind
udp 0 0 0.0.0.0:111 0.0.0.0:* 703/rpcbind
udp6 0 0 :::111 :::* 703/rpcbind
3.5查看端口映射情况:
[root@nfs01 ~]# rpcinfo -p localhost
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
3.6 启动nfs服务
systemctl start nfs
systemctl enable nfs
systemctl status nfs
3.7 查看端口映射情况:
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
注意
注意:此时有了端口映射
【特别注意】必须先启动rpcbind服务之后,才能启动nfs服务
原因:nfs可以视为一个rpc程序,在启动任何一个rpc程序之前,需要做好端口和功能的映射工作,这个映射工作就是由rpcbind服务来完成的,因此在提供nfs服务之前,必须要先启动rpcbind服务
4 .检查nfs和rpc进程
4.1 nfs
[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
4.2 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
4.3 编辑配置文件
vim /etc/exports
#添加一下内容
/data 192.168.128.0/24(rw,sync,no_root_squash,no_all_squash)
4.4使配置生效
exportfs -r
5. 配置文件详细
5.1 nfs配置文件的格式
1: NFS共享的目录 NFS客户端地址(参1,参2,……) NFS客户端地址2(参1,参2,……)
2: NFS共享的目录 NFS客户端地址(参1,参2,……)
5.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共享目录)的权限,但是,这不是唯一的方法喲
5.3 NFS 客户端地址:为NFS服务端授权的可访问共享目录的NFS客户端地址,可以为单独的IP地址或主机名、域名等,也可以为整个网段的地址,还可以用”*”来匹配所有的客户端服务器.
授权整个网段可访问 NFS 172.0.0.* 指定网段的另外写法(不推荐使用)
授权某个域名客户端访问 nfs.lzhnb.com 生产环境中一般不使用
授权整个域名客户端访问 *.lzhnb.com 生产环境中一般不使用
5.4 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 表示只读权限
6 . 创建共享盘
6.1 创建共享目录
[root@nfs01 ~]# mkdir /data -p
[root@nfs01 ~]# ll -d /data/
drwxr-xr-x. 2 root root 4096 Nov 19 10:45 /data/
7. 更改共享目录的权限
7.1 修改挂载点权限
chmod -R 755 /data
7.2 递归修改用户与组
chown -R nfsnobody:nfsnobody /data
# ll -d /data
drwxr-xr-x 2 nfsnobody nfsnobody 4096 Mar 12 19:27 /data
7.3 重新加载NFS服务
[root@nfs01 ~]# /etc/init.d/nfs reload
【注意】
/etc/init.d/nfs reload<==>fexportfs -rv
修改完/etc/exports配置后,需要重新加载NFS服务
用yum/rpm包安装的软件,用service和/etc/init.d/服务名启动是一样的
7.4 利用showmount来进行检查
[root@nfs01 ~]# showmount -e 192.168.128.20
Export list for 192.168.128.20:
/data 192.168.128.0/24
8. 客户端
8.1 配置完yum 关防火墙SELINUX
yum install nfs-utils rpcbind -y #安装服务
8.2 客户端挂载
mount -t nfs 192.168.128.20:/data /mnt
查看是否挂载完成
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 899M 0 899M 0% /dev
tmpfs 910M 0 910M 0% /dev/shm
tmpfs 910M 9.6M 901M 2% /run
tmpfs 910M 0 910M 0% /sys/fs/cgroup
/dev/mapper/centos-root 47G 1.6G 46G 4% /
/dev/sda1 1014M 183M 822M 19% /boot
tmpfs 182M 0 182M 0% /run
192.168.128.20/data 20G 40M 20G 1% /mnt
/dev/sr0 4.4G 4.4G 0 100% /mnt
9.创建共享目录配置 /etc/exports 共享文件 参数
mkdir /sharedata
配置内容 /sharedata/ * (rw,sync,no_hide,no_all_squash)
各部分说明 : 共享目录 被允许的客户端IP(* 表示任意IP都可以)
IP后括号里的设置表示对该共享文件的权限
ro 只读访问
rw 读写访问
sync 所有数据在请求时写入共享
hide 在NFS共享目录中不共享其子目录
no_hide 共享NFS目录的子目录
all_squash 共享文件的UID和GID映射匿名用户anonymous,适合公用目录。
no_all_squash 保留共享文件的UID和GID(默认)
root_squash root用户的所有请求映射成如anonymous用户一样的权限(默认)
no_root_squash root用户具有根目录的完全管理访问权限