0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何实现NFS服务搭建

马哥Linux运维 来源:马哥Linux运维 2024-12-10 10:10 次阅读

用于Linux之间进行文件共享则是用NFS服务(Network FileSystem)

目的在于让不同的机器,不同的操作系统可以彼此分享各自的文件数据。

NFS服务可以将远程Linux系统上的文件共享资源挂载到本地机器的目录上。

企业生产集群为什么需要共享存储

2f6baa02-b486-11ef-93f3-92fbcf53809c.png

这个共享存储对于中小企业,也就是使用服务器配置NFS网络文件共享系统实现。

328c1690-b486-11ef-93f3-92fbcf53809c.png

什么是共享存储

简单说就是将很多台服务器的数据,都可以保存在同一个存储服务器上。这样可以在服务器集群内,数据统一存储到一台机器上,以实现共享存储。

这样在基于负载均衡的web集群下,用户无论请求哪一台机器都可以获取到同样的数据。

什么是NFS

network file system 网络文件系统

NFS主要使用在局域网下,让不同的主机之间可以共享文件、或者目录数据

主要用于linux系统上实现文件共享的一种协议,其客户端主要是Linux

没有用户认证机制,且数据在网络上传送的时候是明文传送,一般只能在局域网中使用

支持多节点同时挂载及并发写入

32a23592-b486-11ef-93f3-92fbcf53809c.png

NFS架构图

NFS程序运行后,产生如下组件

RPC(Remote Procedure Call Protocol):远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,不需要了解底层网络技术的协议。-
rpcbind //负责NFS的数据传输,远程过程调用 tcp/udp协议 端口111
nfs-utils //控制共享哪些文件,权限管理

什么是RPC

RPC(Remote Procedure Call)远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。

远程过程调用,相对应的就是,本地过程调用。
rpc一般是开发中的网络编程知识

1.于超老师本地写好了一个代码文件,如hello-world.py ,本地运行该程序,这就是本地过程调用(执行程序,拿到结果)

2.远程过程调用
于超老师在将代码文件放在远程服务器上,在自己笔记本上,远程调用、执行该代码文件,执行结果会通过网络把数据发回来,这就是远程过程调用

32c7f66a-b486-11ef-93f3-92fbcf53809c.png

简单理解RPC与洗衣服
同样是洗衣服,一个本地洗,一个远程洗。

打个比方,你在家里,要洗衣服,你直接把衣服放到洗衣机,开启洗衣机开关,这就是本地过程调用。(本地过程调用)
远程调用就是,你不在家里,你打个电话回家里,跟妈说帮忙洗个衣服,这就是远程过程调用。
也就是你的一个计算任务,是远程的服务器在执行,执行完毕,告诉你结果而已。

NFS和RPC的关系

我们已知NFS是通过网络来进行数据传输(网络文件系统),因此NFS会使用一些port来传输数据。

关键点:
但是NFS在传输数据的时,使用的端口是随机选择(可以重启NFS服务查看端口)。

既然NFS是随机端口选择(好比银行的取钱窗口总发生变化,你知道几号窗口是取钱业务吗?)

那么NFS在传输数据的时候,怎么知道NFS服务器使用的端口是哪个呢?

答案就是NFS使用的RPC(Remote Procedure Call,就是远程过程调用)协议来实现的。

NFS工作原理(重要)

1.NFS服务端启动后、将自己的端口信息,注册到rpcbind服务中
2.NFS客户端通过TCP/IP的方式,连接到NFS服务端提供的rpcbind服务,并且从该服务中获取具体的端口信息
3.NFS客户端拿到具体端口信息后,将自己需要执行的函数,通过网络发给NFS服务端对应的端口
4.NFS服务端接收到请求后,通过rpc.nfsd进程判断该客户端是否有权限连接
5.NFS服务端的rpc.mount进程判断客户端是否有对应的操作权限
6.最终NFS服务端会将客户端请求的函数,识别为本地可以执行的命令,传递给内核、最终内核驱动硬件

结论、nfs的客户端、服务端之间的通信基于rpc协议,且必须运行rpcbind服务

rpcbind服务的作用

该服务是用于,nfs启动后,将端口号,注册到这个rpcbind服务中

图解NFS工作原理

32e098d2-b486-11ef-93f3-92fbcf53809c.png

NFS工作流程(原理)

在启动NFS服务端之前,必须先启动RPC服务,在centos7服务器下为rpcbind服务,否则NFSserver无法向RPC注册信息了。

另外如果RPC服务重启,原来注册的NFS服务端信息也就失效了,也必须重启服务,再次注册信息给RPC服务。

特别要注意的是,修改NFS配置文件后不需要重启NFS,只需要执行exportfs -rv 命令即可或是systemctl reload nfs

nfs工作流程图原理

32f65d48-b486-11ef-93f3-92fbcf53809c.png

当访问程序通过NFS客户端向NFS服务器端存储文件时,其数据请求流程如下:

1.用户访问网站程序,由程序在NFS客户端上发出存取文件的请求,此时NFS客户端(执行程序的机器)的RPC服务(rpcbind)就会通过网络向NFS服务器的RPC服务的111端口发出NFS文件存取功能的请求。

2.NFS服务器RPC找到对应注册的NFS端口,通知NFS客户端RPC服务

3.此时NFS客户端获取到正确的端口,并与NFS daemon联机存取数据

4.NFS客户端把数据存取成功后返回给前端程序,告知用户存取结果,完成一次存取请求。

这也就证明,必须先启动RPC服务,再启动NFS服务的步骤。

机器准备

nfs服务端 nfs-31

多个nfs客户端 web-7

最终完成效果
让web-7 可以读写 nfs共享的静态文件数据

NFS服务端部署

配置文件语法介绍

默认配置文件路径是/etc/exports

exports配置文件语法

NFS共享目录  NFS客户端地址(参数1、参数2...) 客户点地址2(参数1、参数2...)

例如
/        hostname1(rw)  hostname2(rw,no_root_squash)
/pub   *(rw)
/home/chao   123.206.16.61(ro)

参数解释
1.NFS共享目录:为NFS服务器要共享的实际目录,必须绝对路径,注意目录的本地权限,如果要读写共享,要让本地目录可以被NFS客户端的(nfsnobody)读写

2.NFS客户端地址,也就是NFS服务器端授权可以访问共享目录的客户端地址,详见下表

3.权限参数,对授权的NFS客户端访问权限设置,见下表

33105554-b486-11ef-93f3-92fbcf53809c.png

nfs客户端地址说明

331fcfb6-b486-11ef-93f3-92fbcf53809c.png

NFS配置文件参数解释

ro 只读
rw 读写
root_squash 当nfs客户端以root访问时,它的权限映射为NFS服务端的匿名用户,它的用户ID/GID会变成nfsnobody
no_root_squash 同上,但映射客户端的root为服务器的root,不安全,避免使用
all_squash 所有nfs客户端用户映射为匿名用户,生产常用参数,降低用户权限,增大安全性。
sync 数据同步写入到内存与硬盘,优点数据安全,缺点性能较差
async 数据写入到内存,再写入硬盘,效率高,但可能内存数据会丢


/etc/exports  man 5 exports

共享目录        共享选项
/nfs/share      *(ro,sync)

共享主机:
*   :代表所有主机
192.168.0.0/24:代表共享给某个网段
192.168.0.0/24(rw) 192.168.1.0/24(ro) :代表共享给不同网段
192.168.0.254:共享给某个IP
*.yuchaoit.cn:代表共享给某个域下的所有主机

共享选项:
ro:只读,不常用
rw:读写
sync:实时同步,直接写入磁盘
async:异步,先缓存在内存再同步磁盘
anonuid:设置访问nfs服务的用户的uid,uid需要在/etc/passwd中存在
anongid:设置访问nfs服务的用户的gid
root_squash :默认选项 root用户创建的文件的属主和属组都变成nfsnobody,其他人nfs-server端是它自己,client端是nobody。
no_root_squash:root用户创建的文件属主和属组还是root,其他人server端是它自己uid,client端是nobody。
all_squash:不管是root还是其他普通用户创建的文件的属主和属组都是nfsnobody

说明:
anonuid和anongid参数和all_squash一起使用。
all_squash表示不管是root还是其他普通用户从客户端所创建的文件在服务器端的拥有者和所属组都是nfsnobody;服务端为了对文件做相应管理,可以设置anonuid和anongid进而指定文件的拥有者和所属组

rpcbind服务管理

NFS服务都是基于RPC协议通信的默认端口是111,要确保系统运行了rpcbind服务

要注意的是rpcbind服务即使停止,111端口也不会挂掉,因为还有rpcbind.socket服务

意思是,启动rpc服务由2个结合运行
rpcbind.service
rpcbind.socket

[root@chaogelinux ~]# systemctl status rpcbind
● rpcbind.socket - RPCbind Server Activation Socket
   Loaded: loaded (/usr/lib/systemd/system/rpcbind.socket; enabled; vendor preset: enabled)
   Active: active (running) since 二 2020-03-10 1012 CST; 4h 35min ago
   Listen: /var/run/rpcbind.sock (Stream)
           0.0.0.0:111 (Stream)
           0.0.0.0:111 (Datagram)

3月 10 1012 chaogelinux systemd[1]: Listening on RPCbind Server Activation Socket.


# 启动rpcbind服务
systemctl restart rpcbind

#启动
systemctl restart nfs-server

NFS服务端部署实践(重要)

1.准备好nfs服务端机器

2.安装nfs工具包
yum install nfs-utils rpcbind -y


3.修改配置文件,填写为你需要的共享参数即可
先学学该软件的配置文件语法,每一个软件的配置文件语法,可能都不相同

[root@nfs-31 ~]#cat /etc/exports

需要你填入如下配置,定义共享文件,以及限定访问的ip主机,以及共享的参数,权限设置

4. 设置一个共享 /nfs-data文件夹,运行172.16.1.0局域网内的用户可以访问,权限是只读

mkdir  /nfs-data

vim /etc/exports
这里需要添加参数,让挂载后的客户端,身份改为匿名用户,降低权限,以及设置对应的读写权限

/nfs-data  172.16.1.0/24(rw,sync,)



5.注意要先启动rpcbind服务
确保如下2个进程都运行,rpc服务才正常,如果想停止rpc服务,也是关闭这俩进程

rpcbind.service
rpcbind.socket


systemctl start rpcbind.service
systemctl start rpcbind.socket

[root@nfs-31 ~]#netstat -tunlp |grep rpc
[root@nfs-31 ~]#systemctl status rpcbind

[root@nfs-31 ~]#systemctl start rpcbind.service
[root@nfs-31 ~]#systemctl start rpcbind.socket



6.运行nfs服务 ,每次重启nfs,nfs端口号,不断变化中
systemctl start nfs


7.检查nfs共享的情况
[root@nfs-31 ~]#showmount -e 172.16.1.31
Export list for 172.16.1.31:
/nfs-data 172.16.1.0/24



8.修改服务端的nfs配置文件,允许读写操作
root_squash 这个参数,就是将客户端机器在nfs中创建的数据,用于改为nfsnobody

[root@nfs-31 ~]#cat /etc/exports
/nfs-data  172.16.1.0/24(rw,root_squash)


还需要修改该共享文件夹的权限
chown -R nfsnobody:nfsnobody  /nfs-data


9.设置nfs服务端开机自启、包括rpncbind服务
[root@nfs-31 ~]#systemctl is-enabled nfs    检查是否开机自启
disabled
[root@nfs-31 ~]#systemctl enable rpcbind nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.

10.nfs配置文件修改或,无需重启,使用重新加载,方式NFS端口号再次变化
方法1
systemctl reload  nfs

方法2,更新nfs的配置文件设置
[root@nfs-31 ~]#exportfs -r

NFS客户端部署实践(重要)

1.安装nfs工具包
[root@web-7 ~]#yum install nfs-utils -y

2.运行客户端的rpcbind程序
[root@web-7 ~]#systemctl start rpcbind
[root@web-7 ~]#netstat -tnlp|grep rpc
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      4412/rpcbind        
tcp6       0      0 :::111                  :::*                    LISTEN      4412/rpcbind 

3.远程查看nfs服务器信息
[root@web-7 ~]#showmount -e 172.16.1.31
Export list for 172.16.1.31:
/nfs-data 172.16.1.0/24

4.创建文件夹
[root@web-7 ~]#mkdir -p /test-nfs

5..挂载nfs,查看nfs
[root@web-7 ~]#mount -t nfs  172.16.1.31:/nfs-data  /test-nfs
[root@web-7 ~]#
[root@web-7 ~]#df -h

6.尝试读写数据
ls /test-nfs

touch /test-nfs/hello.log

NFS结合nginx实现共享存储

- 安装部署nfs服务端

- 生产环境下的参数rw,sync,all_squash,anonuid,anongid
rw,sync,


all_squash ,将web-7的任意用户root,bob01,,在该共享目录下的操作,全部改为nfsnobody以实现权限控制

web-7   /test-nfs   172.16.1.31:/nfs-data  

无论是root去读写 、/test-nfs
还是bob01读写 /test-nfs

创建的数据,都会被改为user,group都是 默认的nfsnobody

anonuid=id号

anongid=

集合这俩参数,就可以限制在 该nfs共享目录下的所有用户操作,统一被限制为了某个指定的用户

图解这个需求

332cd9e0-b486-11ef-93f3-92fbcf53809c.png

任务需求
1.nginx的启动用户必须是www,uid是 1500,不允许登录

useradd  www -u 1500 -M -s /sbin/nologin

1.0 安装nginx
yum install nginx -y

1.1 修改nginx配置文件,指定是www用户运行
vim /etc/nginx/nginx.conf
修改如下
user www;


1.2 启动nginx
systemctl start nginx 

1.3 检查nginx进程
[root@web-7 ~]#ps -ef|grep nginx
root       5038      1  0 12:07 ?        00:00:00 nginx: master process /usr/sbin/nginx
www        5040   5038  0 12:07 ?        00:00:00 nginx: worker process





2.nfs共享存储用户也是www,uid是 1500,不允许登录,允许读写

修改nfs配置文件如下,限定客户端在该目录中的操作,权限都被转化为www用户

限制nginx机器才能访问

[root@nfs-31 ~]#mkdir /nfs-nginx
[root@nfs-31 ~]#useradd  www -u 1500 -M -s /sbin/nologin

修改配置文件
[root@nfs-31 ~]#cat /etc/exports
/nfs-data *(rw,all_squash)


/nfs-nginx     172.16.1.7(rw,sync,all_squash,anonuid=1500,anongid=1500)

3.重新加载nfs(reload是针对已经有进程在运行了,重新读取配置文件)
你是新安装的机器nfs,还能reload吗?

systemctl reload nfs

4.修改共享目录的属主、属组为www
[root@nfs-31 /nfs-nginx]#chown -R www.www /nfs-nginx/
[root@nfs-31 /nfs-nginx]#ll -d /nfs-nginx/
drwxr-xr-x 2 www www 6 Apr 22 12:09 /nfs-nginx/






3.nginx网站可以正常读写共享存储资料
先挂载nfs
mount -t nfs 172.16.1.31:/nfs-nginx /usr/share/nginx/html/

[root@web-7 ~]#df -h |grep nginx
172.16.1.31:/nfs-nginx    17G  1.6G   16G  10% /usr/share/nginx/html


客户端生成网页,和图片等静态资源,查看是否写入到NFS服务端
[root@web-7 ~]#vim /usr/share/nginx/html/index.html


模拟用普通用户,到该nginx目录下,生成一个数据图片
[client01@web-7 /usr/share/nginx/html]$wget -O  /usr/share/nginx/html/liyunlong.jpg  https://inews.gtimg.com/newsapp_bt/0/8823765779/1000

4.修改nginx网页,加载该用户自己创建的图片信息吗
[client01@web-7 /usr/share/nginx/html]$cat index.html 

把我李云龙的意大利炮拿来




5.模拟用户访问该nginx网站
http://10.0.0.7/

NFS故障案例

1.nfs服务端崩溃
服务端关闭nfs

当nfs服务端崩溃后,客户端nfs会卡死
[root@nfs-31 /data3]#systemctl stop nfs

nfs客户端查看挂载情况

对该挂载目录的操作全部卡死
[root@web-7 /t3]#ls
^C
[root@web-7 /t3]#df -h
^C

也无法取消挂载
[root@web-7 ~]#umount /t3

^C

解决办法
1.修复nfs服务端

服务端
[root@nfs-31 /data3]#systemctl start nfs

客户端
[root@web-7 ~]#ls /t3
hehe  师傅你是干什么的.log  我的老天鹅啊.log  测试anonuid.log

2.强制卸载客户端的nfs挂载

[root@web-7 ~]#umount --help
 -f, --force             force unmount (in case of an unreachable NFS system)
 -l, --lazy              detach the filesystem now, and cleanup all later



取消客户端所有对该nfs服务端的挂载即可
[root@web-7 ~]#umount -lf /t3

[root@web-7 ~]#umount -lf /data

df命令恢复了

[root@web-7 ~]#df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   17G  1.6G   16G  10% /
devtmpfs                 980M     0  980M   0% /dev
tmpfs                    992M     0  992M   0% /dev/shm
tmpfs                    992M  9.6M  982M   1% /run
tmpfs                    992M     0  992M   0% /sys/fs/cgroup
/dev/sda1               1014M  130M  885M  13% /boot
tmpfs                    199M     0  199M   0% /run/user/0

2.nfs服务端崩溃导致重启服务器卡死

1.如果nfs客户端设置了/etc/fstab开机自启,重启服务器后会导致无法正确挂载nfs服务端,卡死无法启动,解决办法就是等待1分钟30秒左右会自动正确自动

2.进入单用户模式,紧急模式,修复/etc/fstab文件,重启即可

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    11303

    浏览量

    209456
  • 服务器
    +关注

    关注

    12

    文章

    9149

    浏览量

    85406
  • NFS
    NFS
    +关注

    关注

    1

    文章

    53

    浏览量

    26108

原文标题:打造高效共享存储:一步步实现 NFS 服务搭建

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Linux开发_CentOS7.4服务搭建NFS、NGINX服务器,安装ffmpeg、Qt环境

    在CentOS7.4服务器版本的环境下搭建NFS服务器、安装ffmpeg、安装nginx服务器、部署Qt编译环境。
    的头像 发表于 07-14 13:45 1612次阅读
    Linux开发_CentOS7.4<b class='flag-5'>服务</b>器<b class='flag-5'>搭建</b><b class='flag-5'>NFS</b>、NGINX<b class='flag-5'>服务</b>器,安装ffmpeg、Qt环境

    飞凌嵌入式ElfBoard ELF 1板卡-常见网络服务搭建NFS服务搭建

    即网络文件系统(Network File-System),可以通过网络让不同机器、不同系统之间可以实现文件共享。通过NFS,可以访问远程共享目录,就像访问本地磁盘一样。ubuntu下搭建nfs
    发表于 09-26 09:50

    嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-常见网络服务搭建NFS服务搭建

    即网络文件系统(Network File-System),可以通过网络让不同机器、不同系统之间可以实现文件共享。通过NFS,可以访问远程共享目录,就像访问本地磁盘一样。ubuntu下搭建nfs
    发表于 09-27 09:03

    【AWorks试用体验】+NFS服务搭建

    本帖最后由 youzizhile 于 2015-8-18 15:53 编辑 6.4 NFS服务搭建6.4.1 NFS能做什么?在嵌入式Linux开发中,需要在Linux主机为目
    发表于 08-18 15:51

    4412开发板学习笔记-NFS服务器的搭建

    的地方都要启动RPC服务,不论是NFS SERVER或者NFS CLIENT。这样SERVER和CLIENT才能通过RPC来实现PROGRAM PORT的对应。可以这么理解RPC和
    发表于 06-20 14:29

    树莓派搭建NFS服务

    useradd nfs创建一个不可登入和无密码的nfs用户和用户组。三、创建NFS服务共享目录我的共享目录是在var下面,目录名为nfs_
    发表于 10-24 15:54

    【orangepi zero试用体验】在windows下搭建NFS环境

    我不太喜欢vim下的程序设计,虽然有很多大牛说vim或者emacs多么多么好,多么多么牛,但是我还是更喜欢windows下的程序编辑器,界面友好,操作方便,所以我在Windows上搭建NFS服务
    发表于 12-26 19:30

    ubuntu下搭建NFS服务

    :192.168.2.51为NFS服务器主机IP#ls /mnt/说明:mount命令可以在另一个Linux系统执行。这样就可以实现ubuntu下搭建
    发表于 11-02 16:08

    在windows下也可以搭建nfs和tftp服务器为开发板提供服务

    Windows下TFTP的服务器软件有哪些?在windows下也可以搭建nfs和tftp服务器为开发板提供服务吗?
    发表于 12-27 06:40

    linux搭建NFS服务的方法

    上别处的文件就像在使用自己的计算机一样。NFS是基于UDP/IP协议的应用,其实现主要是采用远程过程调用RPC机制,RPC提供了一组与机器、操作系统以及低层传送协议无关的存取远程文件的操作。RPC采用
    发表于 01-20 08:11

    [RK3399] [Firefly-Ubuntu] 搭建NFS服务实现共享目录

    1、搭建NFS服务实现共享目录服务器端(PC 机)我的 PC 机使用的是 Ubuntu 20.04,其他 Linux 系统方法也是类似的!安装nfs
    发表于 04-12 18:07

    搭建NFS开发板部分

    搭建NFS
    发表于 04-13 08:47 0次下载

    嵌入式linux实现mount挂载nfs服务器拷贝文件

    nfs服务器一般在本地虚拟机ubuntu搭建nfs服务器就行,具体流程,可以查看我的博客ubuntu下n
    发表于 11-01 17:07 1次下载
    嵌入式linux<b class='flag-5'>实现</b>mount挂载<b class='flag-5'>nfs</b><b class='flag-5'>服务</b>器拷贝文件

    NFS服务搭建与配置步骤

    NFS就是Network File System的缩写,它最大的功能就是可以通过网络,让不同的机器、不同的操作系统可以共享彼此的文件。
    的头像 发表于 05-26 10:10 5480次阅读
    <b class='flag-5'>NFS</b><b class='flag-5'>服务</b>器<b class='flag-5'>搭建</b>与配置步骤

    瑞芯为RK3568开发板搭建NFS服务

    瑞芯为RK3568开发板搭建NFS服务
    的头像 发表于 05-24 14:10 1210次阅读
    瑞芯为RK3568开发板<b class='flag-5'>搭建</b><b class='flag-5'>NFS</b><b class='flag-5'>服务</b>器