NFS存储服务

4034 字
20 分钟
NFS存储服务

NFS存储服务#

[TOC]


🍰复习巩固

image-20260117142356802
image-20260117142356802

存储#

概述#

image-20260117181402385
image-20260117181402385

image-20260117181455325
image-20260117181455325

前面有负载均衡,随机访问web网站

把视频放在web01,那么下次可能访问到web02,或者web03

这就导致了所有的web服务器,对用户上传的数据不统一,随机存放在某个web服务器下

❤️那么如何解决这个问题呢?

image-20260119205050462
image-20260119205050462

  • 让所有web服务器,接一个上传的存储设备

    空间更多一点,磁盘性能更一点,可以是物理机也可以是云

  • 这个存储设备有一个共享目录,让我们这些web服务器挂载上去

  • 挂载后,此时web中的 /upload 和存储服务器的 /nfsdata 就连在一起了

    像在客户端和服务端之间建立了一根“虚拟的数据网线”,使得远程目录可以像本地目录一样使用。

image-20260117185729571
image-20260117185729571

  • 硬链接 不能跨文件系统
  • 一阶段挂载的磁盘都在本地,这次把 网络设备 172.16.1.31:/test 挂载本地 /code

分类#

image-20260117183346648
image-20260117183346648

  • 最重要的点就是 空间一定要够用
  • 以及 磁盘I/O读取速度 也要跟得上来

NFS存储#

NFS(Network File System)是Linux中一种 网络文件存储服务

  • 是一种 分布式文件系统协议

    允许客户端通过网络访问远程服务器上的文件,如同访问本地文件一样

  • 当数据量大了之后,NFS就跟不上了,可以考虑 分布式存储

分布式存储#

分布式存储 是一种将数据 分散存储 在多个独立节点(服务器/设备)上的技术体系

  • 其本质是通过 数据分片冗余机制 实现高可用性与扩展性

  • 优势:可以 承担更高的访问量 ,还有就是 数据更安全一点

    你就算丢一点数据,它还可以自己恢复

云产品#

  • 它的空间你可以理解为是无限的

  • 只要你的钱够,总能找到合适的存储

v3版本#

  • NFSv3 及更早版本中,仍然需要配合 rpcbind 服务使用

    不过,在 NFSv4 中,情况有所变化(下面我们主要理解 v4 版本的,不需要 rpc中间件 版本的)

😍但是呢,我们稍微的讲述一下 v3 老一点的版本​

image-20260120213127149
image-20260120213127149

image-20260120213450179
image-20260120213450179

  • 这个RPC服务只是起一个远程 调度 的作用

    相当于一个中介

    从Centos 6开始叫 rpcbind ,之前叫 portmapper

  • 启动顺序:1️⃣先把这个 中介 启动起来, 2️⃣接着就是 NFS服务端

    NFS上传自己的房源,把自己的 进程 , 端口 都告诉中介

    等到有人(客户端)连我NFS的时候,再告诉它

Terminal window
1.安装包的区别
# 支持v3版本的nfs服务端 及需要安装nfs,还需要安装rpcbind
yum install -y rpcbind nfs-utils # nfs服务端
# 客户端只需要安装nfs软件包,不需要启动,就能够识别nfs,并挂载到nfs服务端了
yum install -y nfs-utils
2.服务端的启动顺序
# 一定要先启动rpcbind,再启动nfs
[root@nfs ~]# systemctl start rpcbind
[root@nfs ~]# systemctl enable rpcbind
[root@nfs ~]# systemctl start nfs
[root@nfs ~]# systemctl enable nfs
3.rpcbind的常见操作
# 当我们顺序启动rpcbind和nfs后
"先启动rpc后启动NFS服务,启动完NFS后,他就会去向rpc汇报自己的信息"
# 就可以通过rpcbind -p查看nfs端口信息
"这个操作,rpcinfo -p 就相当于我们中介自己查询了一下各种房源,也就是各种服务,和端口号。rpc这个中介服务的端口号为111"
"我们中介rpc会收到了很多的服务和端口"

image-20260120220450242
image-20260120220450242

  • rpcinfo -p

image-20260120220542955
image-20260120220542955

这个命令主要用来检查,rpc 是否有 nfs服务 的信息

能检查出什么??

  • nfs服务是否启动,端口是否开启

  • 他们的 启动顺序 是否有误,如果顺序有误也是查不出它的端口信息

    还有就是 配置文件有问题,或者没生效 cat /var/lib/nfs/etab 进行查看

部署#

reload VS restart#

image-20260120220234126
image-20260120220234126

  • reload: 有一个前提,就是你服务是 运行 着呢,否则是没有办法执行这条命令的
  • 一行就是一个 共享目录

服务端:#

Terminal window
1.安装服务
[root@nfs ~]# yum -y install nfs-utils
# 再安装一次相当于更新!
2.配置服务
# 配置文件默认为空
[root@nfs ~]# cat /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash)
rw:可读可写
sync:固定参数,同时写入数据到内存和硬盘,防止数据丢失!
all_squash:匿名用户压缩,all_所有用户都进行压缩(默认压缩为nobody)
[root@nfs ~]#id nobody
uid=65534(nobody) gid=65534(nobody) groups=65534(nobody)
3.根据配置创建必要数据
[root@nfs ~]# mkdir /data
[root@nfs ~]# chown nobody.nobody /data
# 因为所有用户都压缩为nobody,所以需要修改我们这个目录的属主属组
[root@nfs ~]# ll -d /data
drwxr-xr-x 2 nobody nobody 6 Aug 6 10:08 /data
4.启动服务
[root@nfs ~]# systemctl start nfs
[root@nfs ~]# systemctl enable nfs
5.检测服务的配置文件是否正确
# 如果此文件有内容说明配置正确,如果为空配置不正确
# 也要检查和自己的/etc/exports里面的配置信息是否一致
[root@nfs ~]#cat /var/lib/nfs/etab
/data 172.16.1.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)

image-20260119210559510
image-20260119210559510

说明: /etc/exports (配置文件里面的) ——> /var/lib/nfs/etab (当前使用的nfs服务端的配置)

  • 两个文件等价,后面的 用来检测配置是否正确

❤️简要流程​

image-20251128103704897
image-20251128103704897

  • 左边web服务器

    web01 挂载到远程NFS服务器 它使用 root 身份创建了一个文件 如果也是用 root 身份写入到远程 NFS服务器, 就会很危险,所以必须进行用户压缩

  • all_squash 全部都降级,降级为我 NFS服务器 上的虚拟用户身份,默认身份为 nobody

    所以NFS服务器中创建的目录身份必须是nobody

  • 实际上是 封装解封装 的模式来进行的

客户端:#

  • 通俗易懂点:就是在哪里执行mount命令,那么他就是客户端
故障案例:#

image-20260119204413626
image-20260119204413626

  • 我们直接进行挂载看一下,报错了

image-20260119204452410
image-20260119204452410

  • 客户端 只需要安装nfs就够用了,也不用安装 rpc这个中间件

    rpcbind 它是跑在服务端的,并不用跑在客户端

image-20260119204745229
image-20260119204745229

Terminal window
1.安装服务
[root@nfs ~]# yum -y install nfs-utils
# 客户端也得安装服务
2.查看服务端共享的信息
[root@web01 ~]#showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
#共享目录 可以访问的网段
#一定要仔细检查他的目录和访问的网段,不要打错。
# 能找到,而且自己的IP允许访问,那么我们客户端就能进行挂载
3.挂载
[root@web01 ~]#mount -t nfs 172.16.1.31:/data /mnt
# 将nfs服务端的data目录挂载到客户端本地的/mnt目录,我们只要在mnt目录下增删改查就会同步到服务端
[root@web01 ~]#df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 459M 0 459M 0% /dev
tmpfs 475M 0 475M 0% /dev/shm
tmpfs 475M 6.8M 468M 2% /run
tmpfs 475M 0 475M 0% /sys/fs/cgroup
/dev/sda3 49G 3.8G 46G 8% /
/dev/sda1 195M 122M 74M 63% /boot
tmpfs 95M 0 95M 0% /run/user/0
172.16.1.31:/data 49G 3.8G 46G 8% /mnt
# 看最后一行,有就是挂载上了
4.永久挂载(根据需求进行开机自动挂载)
[root@web01 ~]# tail -1 /etc/fstab
172.16.1.31:/data /mnt nfs defaults 0 0
# 永久挂载后,后面需要优先启动服务端NFS
# web02挂载(前提是下载了nfs服务,不用启动)
[root@web02 ~]#showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
[root@web02 ~]#mount -t nfs 172.16.1.31:/data /mnt
[root@web02 ~]#df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 459M 0 459M 0% /dev
tmpfs 475M 0 475M 0% /dev/shm
tmpfs 475M 6.8M 468M 2% /run
tmpfs 475M 0 475M 0% /sys/fs/cgroup
/dev/sda3 49G 3.8G 45G 8% /
/dev/sda1 195M 122M 74M 63% /boot
tmpfs 95M 0 95M 0% /run/user/0
172.16.1.31:/data 49G 3.8G 46G 8% /mnt
# 成功挂载
6.验证
[root@web01 ~]#touch /mnt/web01.txt
# web01
[root@web02 ~]#touch /mnt/web02.txt
# web02
[root@web02 ~]#ll /mnt
total 0
-rw-r--r-- 1 nobody nobody 0 Jan 19 20:15 web01.txt
-rw-r--r-- 1 nobody nobody 0 Jan 19 20:15 web02.txt

❤️那么问题来了???

如果我们在 客户端 进行删除,那么 服务端 这些文件都会消失吗?

  • 当然会消失

  1. web01和web02挂载上后,相当于拿了根线把他们连在了一起 (web01:/mnt,web02:/mnt,和web03:/data)

  2. 对这个 客户端/mnt 的操作会同步到 服务端/data 目录下

image-20260119210103717
image-20260119210103717

  • 大家 客户端 进行 永久挂载 的时候,你的 NFS服务端 需要一直开着

  • 因为你如果不开的话,你的 web客户端 如果想要进行挂载的时候,会卡顿

  • 而且 NFS服务端 启动需要时间

❤️一个小故障​

Terminal window
[root@web02 ~]#showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
[root@web02 ~]#showmount -e 10.0.0.31
Export list for 10.0.0.31:
/data 172.16.1.0/24
# 我们客户端进行查看服务端共享信息的时候,两个IP地址都能够进行查看
# 但是挂载的时候只能挂载内网的IP地址,也就是172.16.1.0/24网段
[root@web02 ~]#mount -t nfs 10.0.0.31:/data /mnt
mount.nfs: access denied by server while mounting 10.0.0.31:/data
# 挂载10.0.0.31/24挂载不上,我们服务端nfs的配置信息他只允许172.16.1.0/24网段,这个限制的是客户端的IP地址
# 公司内网或许做了限制,只允许内网之间做访问吧!我只能这么解释了
# 想让10.0.0.31/24,也能访问,我们只需要修改一下nfs服务端的配置文件就可以了
[root@web02 ~]#mount -t nfs 172.16.1.31:/data /mnt
[root@web02 ~]#df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 49G 3.8G 46G 8% /
.............................................
172.16.1.31:/data 49G 3.8G 45G 8% /mnt
# 成功挂载!

image-20260119212420413
image-20260119212420413

  • /proc/mounts 当前系统 挂载情况的一个映射

  • grep '/mnt' /proc/mounts

    我们这里只是过滤了一下/mnt

一个小故障:

👑如果 NFS服务器 的网络突然 down 掉了

客户端的 df -h (磁盘信息)则 住了 🛠️不报错,不反应,不退出 但其他信息,或者页面能够正常显示


如果想要挂载一个目录,当你df -h看,并没有,但是呢,你mount挂载还挂不上

从而出现 灵异事件?

  • /proc/mounts (内存中的映射)这个目录的挂载信息更加权威一点

  • 可以过滤一下,是否挂载成功!

    又或者你删除的时候,来一波强制删除,unmount -lf

  • 删除了之后再挂载试试


  1. 我们客户端 住,先过滤 /proc/mounts 有则强制删除(取消挂载),**再检查 **启动 NFS服务
  2. 正常启动后,客户端重新挂载

❤️小总结

image-20251128105429100
image-20251128105429100

  • NFS 用来实现数据一致性

  • 服务端检测配置成功的命令

    cat /var/lib/nfs/etab

  • 客户端需要提前安装 nfs-utils ,查看服务端共享信息

    showmount -e 172.16.1.31

NFS参数#

image-20260120184227145
image-20260120184227145

  • 我们用 同步 多一点

image-20260120184327363
image-20260120184327363

**同步:**直接访问到网站的对应资源

**异步:**优先访问缓存

Terminal window
ro # 只读
rw: # 可读可写
sync: # 固定参数,同时写入数据到内存和硬盘,防止数据丢失!
all_squash:匿名用户压缩,all_所有用户都进行压缩(默认压缩为nobody)
anonuid=uid # 指定uid
anongid=gid # 指定gid
[root@nfs ~]#id nobody
uid=65534(nobody) gid=65534(nobody) groups=65534(nobody)
1.验证只读ro
# 修改配置文件为只读
[root@nfs ~]# cat /etc/exports
/data 172.16.1.0/24(ro,sync,all_squash)
# 重启服务生效
[root@nfs ~]# systemctl restart nfs
# 客户端测试
[root@web01 mnt]# echo aaa > web02.txt
-bash: web02.txt: Read-only file system
[root@web02 mnt]# echo aaa > web02.txt
-bash: web02.txt: Read-only file system

用户压缩#

image-20260120200218332
image-20260120200218332

  • 默认压缩为 nobody ,默认 uidgid65534

image-20260120200738105
image-20260120200738105

Terminal window
2.指定匿名用户 anonuid=666 anongid=666
# 修改配置文件指定匿名用户uid为666
[root@nfs ~]#cat /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash,anongid=666,anonuid=666)
# anonuid,annogid
# 创建uid和gid为666的www虚拟用户
[root@nfs ~]#groupadd -g 666 www
[root@nfs ~]#useradd -g 666 -u 666 -s /sbin/nologin -M www
# 记得要先创建组,再创建虚拟用户
[root@nfs ~]#cat /etc/passwd | tail -1
www❌666:666::/home/www:/sbin/nologin
[root@nfs ~]#id www
uid=666(www) gid=666(www) groups=666(www)
# 修改目录的属主属组为www
[root@nfs ~]#chown www.www /data
[root@nfs ~]#ll -d /data
drwxr-xr-x 2 www www 40 Jan 19 20:15 /data
#重启生效
[root@nfs ~]# systemctl restart nfs
# 检测配置文件是否正确
[root@nfs ~]#cat /var/lib/nfs/etab
/data 172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=666,anongid=666,sec=sys,rw,secure,root_squash,all_squash)
# 检查里面配置信息和自己的配置信息是否一致
#客户端测试(提起安装nfs-utils)
[root@web01 ~]#showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24
[root@web01 ~]#mount -t nfs 172.16.1.31:/data /mnt
[root@web01 ~]#df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 49G 3.7G 46G 8% /
.........
172.16.1.31:/data 49G 3.8G 45G 8% /mnt
# 这个就是挂载上了
[root@web01 ~]#ll /mnt
total 0
-rw-r--r-- 1 nobody nobody 0 Jan 19 20:15 web01.txt
-rw-r--r-- 1 nobody nobody 0 Jan 19 20:15 web02.txt
# 这里面是之前创建的文件
[root@web01 ~]#touch /mnt/hh.txt
[root@web01 ~]#ll /mnt
total 0
-rw-r--r-- 1 666 666 0 Jan 20 19:12 hh.txt
-rw-r--r-- 1 nobody nobody 0 Jan 19 20:15 web01.txt
-rw-r--r-- 1 nobody nobody 0 Jan 19 20:15 web02.txt
# 我们web01新建的hh.txt为什么没有用户名,只有uid和gid
# 切换nfs服务器中进行查看
[root@nfs ~]#ll /data
total 0
-rw-r--r-- 1 www www 0 Jan 20 19:12 hh.txt
-rw-r--r-- 1 nobody nobody 0 Jan 19 20:15 web01.txt
-rw-r--r-- 1 nobody nobody 0 Jan 19 20:15 web02.txt
# 但是nfs服务器中我们是可以查看到具体的用户的,这是为什么???
'我们web01客户端创建的文件,来到服务端后,被压缩为www用户'
'服务端创建了这个用户,而web01客户端并没有创建这个用户,所以我们web01客户端查看不到具体的用户,只有uid和gid'
[root@web01 ~]#id www
id: ‘www’: no such user
# web01,并没有这个用户
# 如果我们想要web01显示这个用户,那么进行创建这个用户就可以了
[root@web01 ~]#groupadd -g 666 www
[root@web01 ~]#useradd -g 666 -u 666 -s /sbin/nologin -M www
# 和服务端创建用户的过程一样
[root@web01 ~]#grep www /etc/passwd
www❌666:666::/home/www:/sbin/nologin
[root@web01 ~]#id www
uid=666(www) gid=666(www) groups=666(www)
# 关于www用户,两端都应该有
# nfs服务端一定不能删除,要一直保持着
[root@web01 ~]#ll /mnt
total 0
-rw-r--r-- 1 www www 0 Jan 20 19:12 hh.txt
-rw-r--r-- 1 nobody nobody 0 Jan 19 20:15 web01.txt
-rw-r--r-- 1 nobody nobody 0 Jan 19 20:15 web02.txt
# 当我们创建好用户后,再次查看/mnt下的hh.txt就显示www用户了

案例#

Terminal window
1.服务端共享两个目录
/data/a rw
/data/b rw
2.web01挂载上面共享目录
/data/a--->挂载到自己本地/oldboy/test01
/data/b--->挂载到自己本地/oldboy/test02
-----------------------------------------
# 我们使用www用户进行压缩(三端都要有www虚拟用户,自行创建)
# 修改配置文件
[root@nfs ~]#cat /etc/exports
/data/a 172.16.1.0/24(rw,sync,all_squash,anongid=666,anonuid=666)
/data/b 172.16.1.0/24(rw,sync,all_squash,anongid=666,anonuid=666)
# 创建对应的目录信息
[root@nfs ~]#mkdir -p /data/{a,b}
[root@nfs ~]#tree /data/
/data/
├── a
└── b
[root@nfs ~]#id www
uid=666(www) gid=666(www) groups=666(www)
[root@nfs ~]#ll -d /data
drwxr-xr-x 4 root root 24 Jan 20 20:47 /data
# 修改属主和属组
[root@nfs ~]#chown -R www.www /data
[root@nfs ~]#ll -d /data/{a,b}
drwxr-xr-x 2 www www 6 Jan 20 20:47 /data/a
drwxr-xr-x 2 www www 6 Jan 20 20:47 /data/b
# 现在里面的文件属主和属组都是www了
# 重启服务
[root@nfs ~]#systemctl restart nfs
# 查看更具体的配置信息
[root@nfs ~]#cat /var/lib/nfs/etab
/data/b 172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=666,anongid=666,sec=sys,rw,secure,root_squash,all_squash)
/data/a 172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=666,anongid=666,sec=sys,rw,secure,root_squash,all_squash)
----------------------#服务端配置完结
# 来到web01客户端
1)创建/oldboy/test01 /oldboy/test02
[root@web01 ~]#echo /oldboy/test{01,02}
/oldboy/test01 /oldboy/test02
[root@web01 ~]#mkdir -p /oldboy/test{01,02}
[root@web01 ~]#tree /oldboy/
/oldboy/
├── test01
└── test02
2)查看服务端共享的目录
[root@web01 ~]#showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data/b 172.16.1.0/24
/data/a 172.16.1.0/24
3)挂载使用
[root@web01 ~]#mount -t nfs 172.16.1.31:/data/a /oldboy/test01
[root@web01 ~]#mount -t nfs 172.16.1.31:/data/b /oldboy/test02
[root@web01 ~]#df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 49G 3.7G 46G 8% /
................
172.16.1.31:/data/a 49G 3.8G 45G 8% /oldboy/test01
172.16.1.31:/data/b 49G 3.8G 45G 8% /oldboy/test02
4)测试使用
[root@web01 ~]#touch /oldboy/test01/1.txt
[root@web01 ~]#touch /oldboy/test02/2.txt
[root@web01 ~]#tree /oldboy/
/oldboy/
├── test01
│   └── 1.txt
└── test02
└── 2.txt
# 这个是服务端
[root@nfs ~]#tree /data/
/data/
├── a
│   └── 1.txt
└── b
└── 2.txt
# 这个是nfs服务端
[root@nfs ~]#find /data -type f -name "*.txt"
/data/a/1.txt
/data/b/2.txt
[root@nfs ~]#find /data -type f -name "*.txt" | xargs ls -lh
-rw-r--r-- 1 www www 0 Jan 20 20:59 /data/a/1.txt
-rw-r--r-- 1 www www 0 Jan 20 20:59 /data/b/2.txt
------------------------------#web01完结
3.web02挂载上面共享目录
/data/a--->挂载到自己本地/oldboy/test01
/data/b---->挂载到自己本地/oldboy/test02
操作和WEB01相同.

优缺点与优化#

  1. NFS存储优点

    NFS文件系统简单易用、方便部署、数据可靠、服务稳定、满足中小企业需求

  2. NFS存储局限 1)存在 单点故障 , 如果构建高可用维护麻烦 web->nfs()->backup 2)NFS 数据明文 , 并不对数据做任何校验 3)客户端挂载NFS服务 没有密码验证 , 安全性一般( 内网使用 )

image-20260120201414963
image-20260120201414963

image-20260120201448273
image-20260120201448273

  • 让用户走的路越来越短,从而 用户访问网站的速度越来越快

  • 把用户的请求往前推,合理运用 CDN缓存

image-20260120201703364
image-20260120201703364

image-20260120201709112
image-20260120201709112

image-20260120201800622
image-20260120201800622

只能上传,无法执行,防止病毒脚本…

文章分享

如果这篇文章对你有帮助,欢迎分享给更多人!

NFS存储服务
https://www.kpyun.fun/posts/basics/extension/extension10/
作者
久棹
发布于
2025-10-02
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
久棹
只要胆子大,天天寒暑假!
公告
欢迎来到久棹的技术小站!本站专注 Linux 运维学习笔记分享,如有问题欢迎交流探讨 🎉
分类
标签
站点统计
文章
98
分类
11
标签
203
总字数
244,453
运行时长
0
最后活动
0 天前
站点信息
构建平台
Local
博客版本
Firefly v6.13.5
文章许可
CC BY-NC-SA 4.0

文章目录