存储服务-NFS
存储服务-NFS
1. 什么是NFS
NFS(Network File System)即网络文件系统,它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录。主要用于存储web服务器上用户上传的数据信息,图片、附件、头像、视频、音频等数据。
2. NFS文件系统存在意义
2.1 传统演变架构图
将共享目录挂载到各服务器上,实现数据共享,数据一致性。实现有不同方法,如nfs这种本地文件系统,还有mfs这种分布式文件系统。
2.2 NFS的本质
NFS客户端挂载目录上创建、删除、查看数据操作,等价于在服务端进行的创建、删除、查看数据操作。下图就是在 NFS服务器端设置好一个共享目录 /video后,其他有权限访问NFS服务器端的客户端都可以将这个共享目录 /video挂载到客户端本地的某个挂载点(其实就是一个目录,这个挂载点目录可以自己随意指定,不一定要与服务器端的目录一样)。客户端正确挂载完毕后,就可以通过NFS客户端的挂载点所在的目录查看到 NFS服务器端/video共享出来的目录下的所有数据。
在客户端上查看时 ,NFS服务器端的/video目录就相当于客户端本地的磁盘分区或目录,几乎感觉不到使用上的区别,根据NFS服务器端授予的NFS共享权限以及共享目录的本地系统权限,只要在指定的NFS客户端操作挂载远程/video的目录,就可以将数据轻松地存取到NFS服务器端上的/video目录中了。
3. NFS工作流程
3.1 RPC服务工作原理
因为NFS的各项功能都需要向RPC服务(rpcbind服务)注册,所以只有RPC服务才能获取到NFS服务的各项功能对应的端口号(port number)、PID、NFS在主机所监听的IP等信息,而NFS客户端也只能通过向RPC服务询问才能找到正确的端口。也就是说,NFS需要有RPC服务的协助才能成功对外提供服务。从上面的描述,我们不难推断,无论是NFS客户端还是NFS服务器端,当要使用NFS时,都需要首先启动RPC服务,NFS服务必须在RPC服务启动之后启动,客户端无需启动NFS服务,但需要启动RPC服务。
下面是工作流程图已经步骤
-
启动RPC服务
-
NFS服务端向RPC注册端口
-
NFS客户端向RPC请求获取NFS所注册的端口
-
RPC进行响应
-
NFS客户端根据获取信息直接向NFS服务端进行请求挂载(mount)
3.2 NFS工作原理
- NFS客户端上发出存取NFS文件的请求,这时NFS客户端(即执行程序的服务器)的RPC服务(rpcbind服务)就会通过网络向NFS服务器端的RPC服务(rpcbind服务)的111端口发出NFS文件存取功能的询间请求。
- NFS服务器端的RPC服务(rpcbind服务)找到对应的已注册的NFS端口后,通知NFS客户端的RPC服务(rpcbind服务)。
- 此时NFS客户端获取到正确的端口,并与NFS daemon联机存取数据。
- NFS客户端数据存取成功。
Tips:配置文件的选项看后续
4. NFS快速实战指南
4.1 实验拓扑
4.2 NFS服务端配置
4.2.1 安装NFS、RPC服务
[root@nfs01 ~]# yum install -y nfs-utils rpcbind #如果rpc服务已有安装可以忽略rpc相关步骤
[root@nfs01 ~]# systemctl enable rpcbind
[root@nfs01 ~]# systemctl enable nfs
[root@nfs01 ~]# systemctl start rpcbind
[root@nfs01 ~]# systemctl start nfs
[root@nfs01 ~]# rpcinfo -p #通过此命令可查看是否有NFS向RPC相关注册信息
4.2.2 修改配置文件
[root@nfs01 ~]# vim /etc/exports
#共享/nfsdata/目录
/nfsdata 10.0.0.0/24(rw)
#10.0.0.0/24网段对nfs服务端的/nfsdata目录,拥有读写权限。
[root@nfs01 ~]# systemctl reload nfs
4.2.3 创建共享目录、修改所有者
[root@nfs01 ~]# mkdir -p /nfsdata
[root@nfs01 ~]# chown nfsnobody.nfsnobody /nfsdata
4.2.4 本地挂载测试
#显示NFS服务器可供NFS客户端连接的信息内容
[root@nfs01 ~]# showmount -e 10.0.0.31
Export list for 10.0.0.31:
/nfsdata 10.0.0.0/24
#创建挂载点
[root@nfs01 ~]# mkdir /test
#挂载nfs
[root@nfs01 ~]# mount -t nfs 10.0.0.31:/nfsdata /test/
#查看挂载是否成功
[root@nfs01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 470M 0 470M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 8.4M 478M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/mapper/centos-root 50G 4.8G 46G 10% /
/dev/mapper/centos-home 142G 33M 142G 1% /home
/dev/sda1 1014M 185M 830M 19% /boot
tmpfs 98M 12K 98M 1% /run/user/42
tmpfs 98M 0 98M 0% /run/user/0
10.0.0.31:/nfsdata 50G 4.8G 46G 10% /test #挂载成功
#测试向/test写入文件,在/data查看
[root@nfs01 ~]# echo test_nfs > /test/nfs.txt
[root@nfs01 ~]# ll /test/
total 4
-rw-r--r-- 1 nfsnobody nfsnobody 9 Feb 12 22:19 nfs.txt
[root@nfs01 ~]# cat /test/nfs.txt
test_nfs
Tips:配置过程中推荐使用优雅重启,reload!
4.3 NFS客户端配置
4.3.1 安装NFS服务
#在主机上安装,web01、web02一样步骤
[root@web01 ~]# yum install -y nfs-utils
4.3.2 挂载NFS目录
[root@web01 ~]# mount -t nfs 10.0.0.31:/nfsdata /upload
4.3.3 查看挂载情况
[root@web01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 470M 0 470M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 8.6M 478M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/mapper/centos-root 50G 4.8G 46G 10% /
/dev/sda1 1014M 185M 830M 19% /boot
/dev/mapper/centos-home 142G 33M 142G 1% /home
tmpfs 98M 24K 98M 1% /run/user/0
10.0.0.31:/nfsdata 50G 4.8G 46G 10% /upload
4.3.4 NFS客户端测试
#web01
[root@web01 ~]# echo web01 > /upload/web01.txt
#web02
[root@web02 ~]# echo web02 > /upload/web02.txt
#NFS服务端查看
[root@nfs01 ~]# ll /nfsdata/
total 12
-rw-r--r-- 1 nfsnobody nfsnobody 9 Feb 12 22:19 nfs.txt
-rw-r--r-- 1 nfsnobody nfsnobody 6 Feb 12 22:34 web01.txt
-rw-r--r-- 1 nfsnobody nfsnobody 6 Feb 12 22:34 web02.txt
[root@nfs01 ~]# cat /nfsdata/web0*.txt
web01
web02
5.NFS服务端详解
5.1 配置文件格式
[root@nfs01 ~]# cat /etc/exports
#指定共享目录 指定可以访问nfs的ip、网段、域名 nfs服务端详细配置选项
/nfsdata 10.0.0.0/24 (rw)
#NFS的日志文件,记录了NFS共享出来的目录的完整权限设置
[root@nfs01 ~]# cat /var/lib/nfs/etab
/nfsdata 10.0.0.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,no_all_squash)
Tips:避免共享不同层次的目录,如果共享了某个目录有权限,该目录的子目录没有权限。那还是按照上一级共享的目录权限来。
5.2 配置文件选项
NFS服务端配置文件 | |
---|---|
rw | 可以读写 |
ro | 只读read only |
anonuid | anonuid指定匿名用户的uid |
anongid | anongid指定匿名用户的gid |
root_squash | 默认的NFS服务端选项:只对root进行压缩,压缩为匿名用户。 |
no_root_squash | 默认的NFS服务端选项:其他用户不压缩,保持原有用户。 |
all_squash | 所有用户到了NFS服务端都被压缩为指定虚拟用户。 |
sync | 同步:用户上传到nfs的数据,实时写入到磁盘中。 |
async | 异步:用户上传到nfs的数据,过一段时间写入到磁盘中。 |
5.3 用户压缩
NFS服务端的用户压缩映射:客户端通过各种用户访问NFS服务端,到了NFS服务端用户被转换为nfsnobody或指定用户。
5.3.1 压缩映射指定用户
无论是root还是普通用户,都映射为www这个用户
#服务端操作
[root@nfs01 ~]# useradd -u 9999 -s /sbin/nologin -M www
[root@nfs01 ~]# mkdir -p /nfsdata
[root@nfs01 ~]# chown www.www /nfsdata
#配置文件内容如下
[root@nfs01 ~]# cat /etc/exports
/nfsdata 10.0.0.0/24(rw,all_squash,anonuid=9999,anongid=9999)
[root@nfs01 ~]# cat /var/lib/nfs/etab
/nfsdata 10.0.0.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=9999,anongid=9999,sec=sys,rw,secure,root_squash,all_squash)
#重新reload一下
[root@nfs01 ~]# systemctl reload nfs
#客户端操作
[root@web01 ~]# useradd -u 9999 -s /sbin/nologin -M www
[root@web01 ~]# mkdir -p /data
[root@web01 ~]# mount -t nfs 10.0.0.31:/nfsdata /data
[root@web01 ~]# df -h /data/
Filesystem Size Used Avail Use% Mounted on
10.0.0.31:/nfsdata 50G 4.8G 46G 10% /data
测试
#客户端用不同账户创建两个文件
[root@web01 /]# echo web01 > /data/web01.txt
[root@web01 /]# su yinjay
[yinjay@web01 /]$ echo yinjay > /data/yinjay.txt
#服务端查看文件
[root@nfs01 ~]# ll /nfsdata/
total 8
-rw-r--r-- 1 www www 6 Feb 13 14:53 web01.txt
-rw-rw-r-- 1 www www 7 Feb 13 14:53 yinjay.txt
5.3.2 压缩映射nfsnobody
#服务端操作
[root@nfs01 ~]# mkdir -p /nfsdata
[root@nfs01 ~]# chown nfsnobody.nfsnobody /nfsdata
#配置文件内容如下
[root@nfs01 ~]# cat /etc/exports
/nfsdata 10.0.0.0/24(rw,all_squash)
[root@nfs01 ~]# cat /var/lib/nfs/etab
/nfsdata 10.0.0.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,all_squash)
#重新reload一下
[root@nfs01 ~]# systemctl reload nfs
#客户端操作
[root@web01 ~]# mkdir -p /data
[root@web01 ~]# mount -t nfs 10.0.0.31:/nfsdata /data
[root@web01 ~]# df -h /data/
Filesystem Size Used Avail Use% Mounted on
10.0.0.31:/nfsdata 50G 4.8G 46G 10% /data
测试
#客户端用不同账户创建两个文件
[root@web01 ~]# echo web01 > /data/web01.txt
[root@web01 ~]# su yinjay
[yinjay@web01 ~]$ echo test > /data/test.txt
#服务端查看文件
[root@nfs01 ~]# ll /nfsdata/
total 8
-rw-rw-r-- 1 nfsnobody nfsnobody 5 Feb 13 15:05 test.txt
-rw-r--r-- 1 nfsnobody nfsnobody 6 Feb 13 15:05 web01.txt