Loading

存储服务-NFS

存储服务-NFS

1. 什么是NFS

NFS(Network File System)即网络文件系统,它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录。主要用于存储web服务器上用户上传的数据信息,图片、附件、头像、视频、音频等数据。


2. NFS文件系统存在意义

2.1 传统演变架构图

将共享目录挂载到各服务器上,实现数据共享,数据一致性。实现有不同方法,如nfs这种本地文件系统,还有mfs这种分布式文件系统。

image-20230212182535419


2.2 NFS的本质

NFS客户端挂载目录上创建、删除、查看数据操作,等价于在服务端进行的创建、删除、查看数据操作。下图就是在 NFS服务器端设置好一个共享目录 /video后,其他有权限访问NFS服务器端的客户端都可以将这个共享目录 /video挂载到客户端本地的某个挂载点(其实就是一个目录,这个挂载点目录可以自己随意指定,不一定要与服务器端的目录一样)。客户端正确挂载完毕后,就可以通过NFS客户端的挂载点所在的目录查看到 NFS服务器端/video共享出来的目录下的所有数据。

在客户端上查看时 ,NFS服务器端的/video目录就相当于客户端本地的磁盘分区或目录,几乎感觉不到使用上的区别,根据NFS服务器端授予的NFS共享权限以及共享目录的本地系统权限,只要在指定的NFS客户端操作挂载远程/video的目录,就可以将数据轻松地存取到NFS服务器端上的/video目录中了。

image-20230212183236291


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服务。


下面是工作流程图已经步骤

image-20230212183810554

  1. 启动RPC服务

  2. NFS服务端向RPC注册端口

  3. NFS客户端向RPC请求获取NFS所注册的端口

  4. RPC进行响应

  5. NFS客户端根据获取信息直接向NFS服务端进行请求挂载(mount)


3.2 NFS工作原理

img

  1. NFS客户端上发出存取NFS文件的请求,这时NFS客户端(即执行程序的服务器)的RPC服务(rpcbind服务)就会通过网络向NFS服务器端的RPC服务(rpcbind服务)的111端口发出NFS文件存取功能的询间请求。
  2. NFS服务器端的RPC服务(rpcbind服务)找到对应的已注册的NFS端口后,通知NFS客户端的RPC服务(rpcbind服务)。
  3. 此时NFS客户端获取到正确的端口,并与NFS daemon联机存取数据。
  4. NFS客户端数据存取成功。

Tips:配置文件的选项看后续


4. NFS快速实战指南

4.1 实验拓扑

image-20230212220038081


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这个用户

image-20230213145945875

#服务端操作
[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

image-20230213150231420

#服务端操作
[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

posted @ 2023-08-29 22:24  YinJayChen  阅读(73)  评论(0编辑  收藏  举报