nfs介绍与配置

NFS


1. nfs简介

nfs特点

  • NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源
  • 在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样
  • nfs适用于Linux与Unix之间实现文件共享,不能实现Linux与Windows间的文件共享功能
  • nfs是运行在应用层的协议,其监听于2049/tcp和2049/udp套接字上
  • nfs服务只能基于IP进行认证

nfs的应用场景

nfs有很多实际应用场景,以下是一些常用的场景:

  • 多个机器共享一台CDROM或其他设备。这对于在多台机器中安装软件来说更加便宜与方便
  • 在大型网络中,配置一台中心NFS服务器用来放置所有用户的home目录可能会带来便利。这些目录能被输出到网络以便用户不管在哪台工作站上登录,总能得到相同的home目录
  • 不同客户端可在NFS上观看影视文件,节省本地空间
  • 在客户端完成的工作数据,可以备份保存到NFS服务器上用户自己的路径下

nfs的体系组成

nfs体系至少有两个主要部分:

  • 一台nfs服务器
  • 若干台客户机

客户机通过TCP/IP网络远程访问存放在NFS服务器上的数据
在NFS服务器正式启用前,需要根据实际环境和需求,配置一些NFS参数

2. nfs工作机制

nfs是基于rpc来实现网络文件系统共享的。

RPC

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

RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络通信模型中,RPC跨越了传输层和应用层。

RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。

img

rpc工作机制如上图所示,下面来描述一下它:

  • 客户端程序发起一个RPC系统调用基于TCP协议发送给另一台主机(服务端)
  • 服务端监听在某个套接字上,当收到客户端的系统调用请求以后,将收到的请求和其所传递的参数通过本地的系统调用执行一遍,并将结果返回给本地的服务进程
  • 服务端的服务进程收到返回的执行结果后将其封装成响应报文,再通过rpc协议返回给客户端
  • 客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行

nfs工作机制

NFS服务器端运行着四个进程:nfsdmountdidmapdportmapperidmapd  //实现用户帐号的集中映射,把所有的帐号都映射为NFSNOBODY,但是在访问时却能以本地用户的身份去访问mountd  //用于验证客户端是否在允许访问此NFS文件系统的客户端列表中,在则允许访问(发放一个令牌,持令牌去找nfsd),否则拒绝访问//mountd的服务端口是随机的,由rpc服务(portmapper)提供随机端口号nfsd    //nfs的守护进程,监听在2049/tcp和2049/udp端口上//不负责文件存储(由NFS服务器本地内核负责调度存储),用于理解客户端发起的rpc请求,并将其转交给本地内核,而后存储在指定的文件系统上portmapper  //NFS服务器的rpc服务,其监听于111/TCP和111/UDP套接字上,用于管理远程过程调用(RPC)

下面通过一个例子来说明NFS的简单工作流程:

需求:查看file文件的信息,此file存储在远程NFS服务端主机上(挂载在本地目录/shared/nfs中)

img

  • 客户端发起查看file信息的指令(ls file)给内核,内核通过NFS模块得知此文件并不是本地文件系统中的文件,而是在远程NFS主机上的一个文件
  • 客户端主机的内核通过RPC协议把查看file信息的指令(系统调用)封装成rpc请求通过TCP的111端口发送给NFS服务端主机的portmapper
  • NFS服务端主机的portmapper(RPC服务进程)告诉客户端说NFS服务端的mountd服务在某某端口上,你去找它验证

因为mountd在提供服务时必须要向portmapper注册一个端口号,所以portmapper是知道其工作于哪个端口的

  • 客户端得知服务端的mountd进程端口号后,通过已知的服务端mountd端口号请求验证
  • mountd收到验证请求后验证发起请求的客户端是否在允许访问此NFS文件系统的客户端列表中,在则允许访问(发放一个令牌,持令牌去找nfsd),否则拒绝访问
  • 验证通过后客户端持mountd发放的令牌去找服务端的nfsd进程,请求查看某文件
  • 服务端的nfsd进程发起本地系统调用,向内核请求查看客户端要查看的文件的信息
  • 服务端的内核执行nfsd请求的系统调用,并将结果返回给nfsd服务
  • nfsd进程收到内核返回的结果后将其封装成rpc请求报文并通过tcp/ip协议返回给客户端

3. exports文件的格式

nfs的主配置文件是/etc/exports,在此文件中,可以定义NFS系统的输出目录(即共享目录)、访问权限和允许访问的主机等参数。该文件默认为空,没有配置输出任何共享目录,这是基于安全性的考虑,如此即使系统启动了NFS服务也不会输出任何共享资源。

exports文件中每一行提供了一个共享目录的设置,其命令格式为:

<输出目录> [客户端1(选项1,选项2,...)] [客户端2(选项1,选项2,...)]

其中,除输出目录是必选参数外,其他参数均是可选项。另外,格式中的输出目录和客户端之间、客户端与客户端之间都使用空格分隔,但客户端与选项之间不能有空格。

客户端是指网络中可以访问这个NFS共享目录的计算机。客户端的指定非常灵活,可为单个主机的IP或域名,亦可为某个子网或域中的主机等。
客户端常用的指定方式:

客户端说明
192.168.159.130指定IP地址的主机
192.168.159.0/24(或192.168.159.*)指定子网中的所有主机
www.shuijiao.com指定域名的主机
*.shuijiao.com指定shuijiao.com域中的所有主机
*(或缺省)所有主机

选项用来设置共享目录的访问权限、用户映射等。exports文件中的选项比较多,一般可分为三类:

  • 访问权限选项(用于控制共享目录的访问权限)
  • 用户映射选项
    • 默认情况下,当客户端访问NFS服务器时,若远程访问的用户是root用户,则NFS服务器会将其映射成一个本地的匿名用户(该用户为nfsnobody),并将其所属的用户组也映射成匿名用户组(该用户组也为nfsnobody),如此有助于提高系统的安全性。
  • 其他选项

访问权限选项:

访问权限选项说明
ro设置输出目录只读
rw设置输出目录可读写

用户映射选项:

用户映射选项说明
all_squash将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody)
no_all_squash不将远程访问的所有普通用户及所属用户组都映射为匿名用户或用户组(默认设置)
root_squash将root用户及所属用户组都映射为匿名用户或用户组(默认设置)
no_root_squash不将root用户及所属用户组都映射为匿名用户或用户组
anonuid=xxx将远程访问的所有用户都映射为匿名用户,并指定该匿名用户为本地用户帐户(UID=xxx)
anongid=xxx将远程访问的所有用户组都映射为匿名用户组,并指定该匿名用户组为本地用户组(GID=xxx)

常用的其他选项:

其他选项说明
secure限制客户端只能从小于1024的TCP/IP端口连接NFS服务器(默认设置)
insecure允许客户端从大于1024的TCP/IP端口连接NFS服务器
sync将数据同步写入内存缓冲区或磁盘中,效率较低,但可保证数据一致性
async将数据先保存在内存缓冲区中,必要时才写入磁盘
wdelay检查是否有相关的写操作,如果有则这些写操作一起执行,可提高效率(默认设置)
no_wdelay若有写操作则立即执行,应与sync配置使用
subtree_check若输出目录是一个子目录,则NFS服务器将检查其父目录的权限(默认设置)
no_subtree_check即使输出目录是一个子目录,NFS服务亦不检查其父目录的权限,可提高效率
nohide若将一个目录挂载到另一个目录之上,则原来的目录通常就被隐藏起来或看起来像空的一样。要禁用这种行为,需启用hide选项

4. nfs管理

nfs安装:

准备两台虚拟机
服务的和客户端都需要关闭防火墙并且安装nfs-utils
服务端:
[root@localhost ~]# hostnamectl set-hostname server
[root@localhost ~]# bash
[root@server ~]# systemctl disable --now firewalld
Removed "/etc/systemd/system/multi-user.target.wants/firewalld.service".
Removed "/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service".
[root@server ~]# vi /etc/selinux/config 
[root@server ~]# setenforce 0
[root@server ~]# yum -y install nfs-utils客户端:
[root@localhost ~]# hostnamectl set-hostname client
[root@localhost ~]# bash
[root@client ~]# systemctl disable --now firewalld
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@client ~]# vi /etc/selinux/config 
[root@client ~]# setenforce 0
[root@client ~]# yum -y install nfs-utils服务端上应启动服务,客户端不需要启动
[root@server ~]# systemctl status nfs-server
○ nfs-server.service - NFS server and servicesLoaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; preset: disable>Active: inactive (dead)
[root@server ~]# systemctl enable --now nfs-server
Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service → /usr/lib/systemd/system/nfs-server.service.
[root@server ~]# systemctl status nfs-server
● nfs-server.service - NFS server and servicesLoaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; preset: disabled)Active: active (exited) since Tue 2023-12-12 15:04:09 CST; 15s agoProcess: 15135 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)Process: 15136 ExecStart=/usr/sbin/rpc.nfsd (code=exited, status=0/SUCCESS)Process: 15157 ExecStart=/bin/sh -c if systemctl -q is-active gssproxy; then systemctl>Main PID: 15157 (code=exited, status=0/SUCCESS)CPU: 23msDec 12 15:04:09 server systemd[1]: Starting NFS server and services...
Dec 12 15:04:09 server systemd[1]: Finished NFS server and services.

使用shoumount命令测试NFS服务器的输出目录状态:

语法:showmount [选项] [NFS服务器名称或地址]
常用的选项有:-a  //显示指定NFS服务器的所有客户端主机及其所连接的目录-d  //显示指定的NFS服务器中已被客户端连接的所有输出目录-e  //显示指定的NFS服务器上所有输出的共享目录[root@client ~]# yum provides showmount
查看我服务端上有没有可以挂载的资源
[root@client ~]# showmount -e 192.168.159.141
Export list for 192.168.159.141:
在客户端添加内容
[root@server ~]# cat /etc/exports
[root@server ~]# vi /etc/exports
[root@server ~]# cat /etc/exports
/data
配置文件发生了修改必须重启服务
[root@server ~]# systemctl restart nfs-server
再去服务端查看
[root@client ~]# showmount -e 192.168.159.141
Export list for 192.168.159.141:
/data *
在客户端创建目录
[root@server ~]# mkdir /data
在服务端挂载
[root@client ~]# mount -t nfs 192.168.159.141:/data /mnt
[root@client ~]# df -h
Filesystem             Size  Used Avail Use% Mounted on
devtmpfs               883M     0  883M   0% /dev
tmpfs                  901M     0  901M   0% /dev/shm
tmpfs                  901M   17M  884M   2% /run
tmpfs                  901M     0  901M   0% /sys/fs/cgroup
/dev/mapper/rhel-root   17G  1.5G   16G   9% /
/dev/sda1             1014M  179M  836M  18% /boot
tmpfs                  181M     0  181M   0% /run/user/0
192.168.159.141:/data   17G  1.3G   16G   8% /mnt
进入mnt目录创建文件发现没有权限
[root@client ~]# cd /mnt
[root@client mnt]# ls
[root@client mnt]# touch 123
touch: cannot touch '123': Read-only file system
再去客户端修改配置文件加上读写权限
[root@server ~]# cat /etc/exports
/data
[root@server ~]# vi /etc/exports
[root@server ~]# cat /etc/exports
/data 192.168.159.130(rw)
[root@server ~]# systemctl restart nfs-server
因为nobody没有读写权限所以要加上
[root@server ~]# setfacl -m u:nobody:rwx /data
再去服务端创建文件发现可以创建
[root@client mnt]# touch 123
[root@client mnt]# ll
total 0
-rw-r--r--. 1 nobody nobody 0 Dec 12 02:25 123
客户端上同样也可以看到
[root@server ~]# ll /data
total 0
-rw-r--r--. 1 nobody nobody 0 Dec 12 15:25 123

在服务端设置开机自动挂载nfs:编辑/etc/fstab文件,添加如下格式的内容

SERVER:/PATH/TO/EXPORTED_FS /mnt_point nfs defaults,_netdev 0 0
[root@client ~]# umount /mnt
[root@client ~]# df -h
Filesystem             Size  Used Avail Use% Mounted on
devtmpfs               883M     0  883M   0% /dev
tmpfs                  901M     0  901M   0% /dev/shm
tmpfs                  901M   17M  884M   2% /run
tmpfs                  901M     0  901M   0% /sys/fs/cgroup
/dev/mapper/rhel-root   17G  1.5G   16G   9% /
/dev/sda1             1014M  179M  836M  18% /boot
tmpfs                  181M     0  181M   0% /run/user/0
[root@client ~]# vi /etc/fstab
[root@client ~]# cat /etc/fstab #
# /etc/fstab
# Created by anaconda on Sun Aug  6 23:24:20 2023
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/rhel-root   /                       xfs     defaults        0 0
UUID=f1d4acd1-8138-4c3b-83bf-0b6f137bd39b /boot                   xfs     defaults        0 0
/dev/mapper/rhel-swap   swap                    swap    defaults        0 0
192.168.159.141:/data /nfs nfs defaults,_netdev 0 0

在客户端创建

[root@client ~]# cd /nfs/
[root@client nfs]# ls
123
[root@client nfs]# cat 123
[root@client nfs]# echo '666666' > 123
[root@client nfs]# cat 123
666666

发现在服务端可以查看到

[root@server ~]# cd /data/
[root@server data]# ls
123
[root@server data]# cat 123
666666

客户端挂载时可以使用的特殊选项:

  • rsize:其值是从服务器读取的字节数(缓冲)。默认为1024。若使用比较高的值,如8192,可以提高传输速度
  • wsize:其值是写入到服务器的字节数(缓冲)。默认为1024。若使用比较高的值,如8192,可以提高传输速度
exportfs        //维护exports文件导出的文件系统表的专用工具-a      //输出在/etc/exports文件中所设置的所有目录-r      //重新读取/etc/exports文件中的设置,并使其立即生效,无需重启服务-u      //停止输出某一目录-v      //在输出目录时将目录显示到屏幕上

检查输出目录所使用的选项:
在配置文件/etc/exports中,即使在命令行中只设置了一两个选项,但在真正输出目录时,实际上还带有很多默认的选项。通过查看/var/lib/nfs/etab文件,可以看到具体使用了何选项

[root@server data]# cat /var/lib/nfs/etab 
/data	192.168.159.130(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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/755686.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

camelot pdf提取表格实践(记录)

参考&#xff1a; 巧用Python的camelot库批量提取PDF发票信息 关于文本pdf的表格抽取 AttributeError: module ‘camelot‘ has no attribute ‘read_pdf‘及类似问题解决办法 camelot 参数 https://blog.csdn.net/INTSIG/article/details/123000010 报错解决&#xff1a; Mod…

美团大规模KV存储挑战与架构实践

KV 存储作为美团一项重要的在线存储服务&#xff0c;承载了在线服务每天万亿级的请求量&#xff0c;并且保持着 99.995% 的服务可用性。在 DataFunSummit 2023 数据基础架构峰会上&#xff0c;我们分享了《美团大规模 KV 存储挑战与架构实践》&#xff0c;本文为演讲内容的整理…

探讨NLP对行业大量数据信息抽取的技术实现

在本文中&#xff0c;为了实现高效的信息抽取&#xff0c;我们采用了一个自主研发的多模态AI的大模型NLP平台。 这个平台的使用过程分为以下几个步骤&#xff1a; 数据收集&#xff1a;我们收集了与项目相关的100条数据样本&#xff0c;这些样本涵盖了各种商品描述&#xff0c…

Go web 基础相关知识

Go web Web工作方式 浏览器本身是一个客户端&#xff0c;当你输入URL的时候&#xff0c;首先浏览器会去请求DNS服务器&#xff0c;通过DNS获取相应的域名对应的IP&#xff0c;然后通过IP地址找到IP对应的服务器后&#xff0c;要求建立TCP连接&#xff0c;等浏览器发送完HTTP …

软考 网工 每日学习打卡 2024/3/18

学习内容 第8章 网络安全 本章主要讲解网络安全方面的基础知识和应用技术。针对考试应该掌握诸如数据加密、报文认 证、数字签名等基本理论&#xff0c;在此基础上深入理解网络安全协议的工作原理&#xff0c;并能够针对具体的 网络系统设计和实现简单的安全解决方案。 本章共有…

【Apache ShenYu源码】看看贡献者如何实现支持提醒通知设计

相信大家碰到源码时经常无从下手&#x1f643;&#xff0c;不知道从哪开始阅读&#xff0c;面对大量代码晕头转向&#xff0c;索性就读不下去了&#xff0c;又浪费了一次提升自己的机会&#x1f62d;。 我认为有一种方法&#xff0c;可以解决大家的困扰&#xff01;那就是通过阅…

基于Spring Boot框架的学生作业管理系统

摘 要 快速发展的社会中&#xff0c;人们的生活水平都在提高&#xff0c;生活节奏也在逐渐加快。为了节省时间和提高工作效率&#xff0c;越来越多的人选择利用互联网进行线上打理各种事务&#xff0c;然后线上管理系统也就相继涌现。与此同时&#xff0c;人们开始接受方便的生…

从零开始学习在VUE3中使用canvas(二):fillStyle(填充样式)

一、fillStyle概念 在canvas中我们可以用fillStyle定义接下来的图像的样式&#xff0c;默认为黑色#000。 我们可以使用纯色、渐变、和纹理&#xff08;例如图片&#xff09;进行填充&#xff0c;来达到自己想要的效果。 二、代码 <template><div class"canva…

nginx 报Too many open files

nginx 异常报 Too many open files 上周时&#xff0c;nginx已经报 Too many open files 当时把 配置文件调整最大连接65535了&#xff0c;reload 重新加载nginx后不报错了。 cat /proc/14921/limits |grep "Max open file" * soft nofile 65535 * hard nof…

Softing TDX——设计模板

| 高质量的设计模板——减少开发诊断仪所需的工作量 现今&#xff0c;用户对诊断仪的界面和操作理念提出了更高的要求。一个直观的用户界面既能减少用户熟悉诊断仪的时间&#xff0c;又能减少在日常工作中进行诊断任务的时间。然而&#xff0c;创建一个精巧又独立于平台的诊断…

【黑马程序员】Python高阶

文章目录 闭包定义nonlocal关键字作用优缺点优点缺点 装饰器装饰器闭包写法 设计模式单例模式工厂模式优点代码示例 多线程基本概念threading模块 网络编程服务端开发socketsocket服务端编程 客户端开发 正则表达式正则的三个基础方法matchsearchfindAll 元字符匹配单字符匹配数…

代码随想录算法训练营第二十五天|● 216.组合总和III ● 17.电话号码的字母组合(JS写法)

216 组合总和Ⅲ 题目链接/文章讲解&#xff1a;https://programmercarl.com/0216.%E7%BB%84%E5%90%88%E6%80%BB%E5%92%8CIII.html 视频讲解&#xff1a;https://www.bilibili.com/video/BV1wg411873x 方法一&#xff1a;自己写的 自己写的&#xff0c;本题和77很像&#xf…

Redis数据结构对象之集合对象和有序集合对象

集合对象 集合对象的编码可以是intset或者hashtable. 概述 intset编码的集合对象使用整数集合作为底层实现&#xff0c;集合对象包含的所有元素都被保存在整数集合里面。 另一方面&#xff0c;hashtable编码的集合对象使用字典作为底层实现&#xff0c;字典的每个键都是一个…

web部署 四 限制

案例: 1/设置其下载速度限制:1000000010m&#xff0c;10000001m&#xff0c;2分别查看下载速率是否发生变化。 2/限制连接数&#xff0c;同时下载5个文件。查看第6个是否能正常访问。使用命令符:netstat-n&#xff0c;查看活动链接&#xff0c; 正常情况下我们的下载速度 我们…

遥感深度学习:CNN-LSTM模型用于NDVI的预测(Pytorch代码深度剖析)

代码上传至Github库&#xff1a;https://github.com/ChaoQiezi/CNN-LSTM-model-is-used-to-predict-NDVI 01 前言 这是一次完整的关于时空遥感影像预测相关的深度学习项目&#xff0c;后续有时间更新后续部分。 通过这次项目&#xff0c;你可以了解&#xff1a; pytroch的模…

石油炼化5G智能制造工厂数字孪生可视化平台,推进行业数字化转型

石油炼化5G智能制造工厂数字孪生可视化平台&#xff0c;推进行业数字化转型。在石油炼化行业&#xff0c;5G智能制造工厂数字孪生可视化平台的出现&#xff0c;为行业的数字化转型注入了新的活力。石油炼化行业作为传统工业的重要领域&#xff0c;面临着资源紧张、环境压力、安…

蓝桥杯练习题——健身大调查

在浏览器中预览 index.html 页面效果如下&#xff1a; 目标 完成 js/index.js 中的 formSubmit 函数&#xff0c;用户填写表单信息后&#xff0c;点击蓝色提交按钮&#xff0c;表单项隐藏&#xff0c;页面显示用户提交的表单信息&#xff08;在 id 为 result 的元素显示&#…

OxyPlot 导出图片

在 OxyPlot 官方文档 https://oxyplot.readthedocs.io/en/latest/export/index.html 中查看 这里用到的是导出到 PNG 文件的方法&#xff0c;不过用的 NuGet 包最新版&#xff08;2.1.0&#xff09;中&#xff0c;PngExporter 中并没有 Background 属性&#xff1a; 所以如果图…

【C语言】C语言内存函数

&#x1f451;个人主页&#xff1a;啊Q闻 &#x1f387;收录专栏&#xff1a;《C语言》 &#x1f389;道阻且长&#xff0c;行则将至 前言 这篇博客是关于C语言内存函数(memcpy,memmove,memset,memcmp)的使用以及部分的模拟实现 memcpy,memmove,memset,memc…

一文搞懂“ReentrantReadWriteLock——读写锁”

文章目录 初识读写锁ReentrantReadWriteLock类结构注意事项 ReentrantReadWriteLock源码分析读写状态的设计HoldCounter 计数器读锁的获取读锁的释放写锁的获取写锁的释放 锁降级 初识读写锁 Java中的锁——ReentrantLock和synchronized都是排它锁&#xff0c;意味着这些锁在同…