开发区网站建设,太原网站建设联系方式,做一个小程序收费价目表,摄影课程自学网站写在前面 分享一些 nfs 搭建的笔记考试顺便整理内容涉及 nfs 服务端客户端的搭建配置理解不足小伙伴帮忙指正 对每个人而言#xff0c;真正的职责只有一个#xff1a;找到自我。然后在心中坚守其一生#xff0c;全心全意#xff0c;永不停息。所有其它的路都是不完整的真正的职责只有一个找到自我。然后在心中坚守其一生全心全意永不停息。所有其它的路都是不完整的是人的逃避方式是对大众理想的懦弱回归是随波逐流是对内心的恐惧 ——赫尔曼·黑塞《德米安》 NFS 是 Network File System 的缩写即 网络文件系统。最早由Sun公司开发用来在UNIXLinux系统间实现磁盘文件共享的一种方法。它的主要功能是通过网络让不同的主机系统之间可以共享文件或目录。发展迭代了多个版本
NFSv11984年最早的 NFS 版本由 Sun Microsystems 开发。它基于远程过程调用RPC和XDRExternal Data Representation协议使客户端能够通过网络挂载远程服务器上的共享目录。NFSv1 使用不透明句柄标识文件并使用无状态协议其中服务器不保持有关客户端状态的信息。
NFSv21989年NFSv2 在 NFSv1 的基础上进行了改进。它引入了更强大的操作如文件和目录的读写操作并提供了更可靠的错误处理和更高效的数据传输。NFSv2 仍然使用不透明句柄标识文件并保持无状态的特性。
NFSv31995年NFSv3 是一个重大的改进版本引入了许多新特性和改进。它支持透明的文件句柄提供更好的安全性、性能和可靠性。NFSv3 引入了基于文件路径的标识符filehandle来替代不透明句柄并支持文件锁定、符号链接、读写一致性和服务器端写缓存等功能。
NFSv42000年NFSv4 是目前最新和最全面的 NFS 版本。它经历了多个修订版本的迭代以提供更强大的功能和性能改进。NFSv4 引入了许多重要特性如全面的安全性包括 Kerberos 身份验证和加密传输、访问控制列表ACL、命名空间、客户端缓存控制等。它还引入了复杂的状态管理使服务器能够跟踪客户端的状态。
NFS客户端(一般为应用服务器例如web) 可以通过挂载 (mount) 的方式将NFS服务端共享的数据目录挂载到NFS客户端本地系统中(就是某一个挂载点下) 。从NFS客户端的机器本地看NFS服务端共享的目录就好像是客户自己的磁盘分区或者目录一样而实际上确是远端的NFS服务端的目录。
在企业集群架构的工作场景中NFS网络文件系统 一般被用来存储共享视频、图片、附件等静态资源文件。一般是把网站用户上传的文件都放在NFS共享里例如BBS产品的图片、附件、头像特别是中小网站公司应用频率更高。
NFS的功能所使用的端口并不是固定的而是在服务器启动时动态分配的,那么这样的话客户端如何获得服务器端的相关端口呢?
NFS使用了一个称为rpcbind(或portmap)的服务它充当了一个端口映射程序
当服务器端启动NFS服务时它会向 rpcbind服务注册其提供的NFS功能及其对应的端口号。客户端在需要连接到服务器端时首先会向rpcbind服务发送查询请求以获取服务器端所提供的NFS功能及其相应的端口号。
rpcbind 服务会返回服务器端注册的NFS功能及其端口号信息给客户端。客户端接收到这些信息后就可以使用相应的端口号与服务器端建立连接并进行NFS数据传输。
rpcbind服务通常会使用固定的端口号 111 提供服务因此客户端可以通过该固定端口号与服务器端进行通信获取NFS功能及其端口号信息。
部署NFS服务
红帽企业Linux 8,默认使用NFS版本4.2也可以使用NFSv4或NFSv3协议但不再支持NFSv2协议NFS版本4 (NFSv4) 仅使用TCP传输。
NFS服务由nfs-utils软件包提供RHEL8默认安装了该软件包。
安装 nfs-utils 软件包。软件包可能已安装好。
[rootservera ~]# yum -y install nfs-utils
Red Hat Enterprise Linux 8.1 BaseOS (dvd) 83 kB/s | 2.8 kB 00:00
Red Hat Enterprise Linux 8.1 AppStream (dvd) 484 kB/s | 3.2 kB 00:00
Package nfs-utils-1:2.3.3-26.el8.x86_64 is already installed.
Dependencies resolved.
Nothing to do.
Complete!配置开机自启动同时需要开放对应的防火墙服务
[rootservera ~]# systemctl enable --now nfs-server.service
Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service → /usr/lib/systemd/system/nfs-server.service.
[rootservera ~]# firewall-cmd --permanent --add-servicenfs
success
[rootservera ~]# firewall-cmd --reload
success
[rootservera ~]#通过 man -k 命令查帮助文档 nfs 的使用关键字 exports 来进行一些常用配置可以通过 man exports 查看具体的帮助信息
[rootservera ~]# man -k exports
exports (5) - NFS server export table
[rootservera ~]# man exports
[rootservera ~]# cat /etc/exports
[rootservera ~]# ls /etc/exports.d/
[rootservera ~]#一般配置文件的编写有两个位置一个是 /etc/exports 文件 另一个是 /etc/exports.d/ 目录下
创建 /nfsshare ⽬录并对其进⾏保护以便只有 student 用户具有写⼊权限。
其他的配置要求
student ⽤用户具有读/写访问权限并且所有其他用户仅具有读取访问权限导出 /nfsshare ⽬录以便只有servera.lab.example.com可以在读/写模式下挂载它。确保 lab.example.com DNS 域中的所有其他系统都可以在只读模式下挂载该共享导出。创建 /etc/exports.d/exercise.exports ⽂件。注意不要在服务器名称和选项之间添加空格((rw) 和 (ro))。
[rootservera ~]# mkdir /nfsshare
[rootservera ~]# chown student /nfsshare
[rootservera ~]# ls -ld /nfsshare
drwxr-xr-x. 2 student root 6 Aug 1 00:07 /nfsshare
[rootservera ~]# cat /etc/exports.d/shar.exports
/nfsshare serverb.lab.example.com(rw) *.lab.example.com(ro)修改完共享的配置之后需要重新 reload 配置文件
[rootservera ~]# systemctl reload nfs-server使⽤ exportfs 命令确认 NFS 服务器正在导出 /nfsshare ⽬录。
[rootservera ~]# exportfs
/nfsshare servera.lab.example.com
/nfsshare *.lab.example.com添加 -v 选项以显⽰导出选项的详细信息
[rootservera ~]# exportfs -v
/nfsshare servera.lab.example.com(sync,wdelay,hide,no_subtree_check,secsys,rw,secure,root_squash,no_all_squash)
/nfsshare *.lab.example.com(sync,wdelay,hide,no_subtree_check,secsys,ro,secure,root_squash,no_all_squash)
[rootservera ~]#sync表示同步写入NFS服务器会在数据写入到磁盘之前等待确认确保数据的持久性。这可以提供更高的数据一致性但可能会对性能产生一定影响。wdelay表示写入延迟NFS服务器可能会在写入数据时进行延迟以缓冲多个写入请求并进行批量处理。这可以提高写入性能但可能会增加数据的丢失风险。hide表示隐藏共享NFS服务器会隐藏共享的文件或目录使其对客户端不可见。这可以用于限制特定目录的访问权限。no_subtree_check表示禁用子树检查NFS服务器不会检查客户端是否具有访问整个共享树的权限。这可以提高性能但可能会降低安全性。secsys表示使用系统身份验证NFS服务器使用本地系统的身份验证机制进行客户端身份验证。rw表示读写权限客户端具有对NFS共享的读写权限。secure表示使用安全连接NFS服务器和客户端之间的通信将通过安全的加密连接进行。root_squash表示Root映射NFS服务器会将来自客户端的Root用户的访问权限限制为一个非特权用户以增加安全性。no_all_squash表示禁用全部映射NFS服务器会保留来自客户端的所有用户和组的身份而不进行任何映射。
查看服务状态
[rootservera ~]# systemctl status rpcbind.service客户端配置使用
创建 /share 挂载点,并且挂载 servera 根目录 到 /mnt 下面 创建 /share 挂载点。
[rootserverb ~]# mkdir /share
[rootserverb /]# mount servera:/ /mnt
[rootserverb /]# ls /mnt/
nfsshare确认连通性OK然后卸载之后重新挂载访问
[rootserverb /]# umount /mnt
[rootserverb /]# mount -t nfs servera:/nfsshare /share
[rootserverb share]# cd /share/;touch temp
touch: cannot touch temp: Permission denied创建文件失败提示没有权限这是因为我们在服务端只给了 student 的权限所以这里会这样而root 用户也没有权限是因为默认开启了 root_squash ,root 被映射为一个非特权用户
[rootserverb share]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 880M 0 880M 0% /dev
tmpfs 915M 0 915M 0% /dev/shm
tmpfs 915M 17M 899M 2% /run
tmpfs 915M 0 915M 0% /sys/fs/cgroup
/dev/vda1 10G 2.2G 7.9G 22% /
tmpfs 183M 0 183M 0% /run/user/1000
servera:/nfsshare 10G 2.3G 7.8G 23% /share
[rootserverb share]#
[rootserverb share]# su student
[studentserverb share]$ touch temp
[studentserverb share]$ ls
temp切换到 student 用户文件创建成功可以通过 mount 来查看映射信息
[studentserverb share]$
[studentserverb share]$ mount | grep sha
servera:/nfsshare on /share type nfs4 (rw,relatime,vers4.2,rsize262144,wsize262144,namlen255,hard,prototcp,timeo600,retrans2,secsys,clientaddr172.25.250.11,local_locknone,addr172.25.250.10)
[studentserverb share]$如果希望开机自动挂载编辑 /etc/fstab ⽂件再为 NFS 导出添加⼀⾏,配置完成需要使用 mount -a 来重新加载配置
servera.lab.example.com:/nfsshare /share nfs defaults 0 0挂载⽂件系统然后验证挂载是否成功
[rootserverb ~]# mount /share
[rootserverb share]# df /share/
Filesystem 1K-blocks Used Available Use% Mounted on
servera:/nfsshare 10474496 2319360 8155136 23% /share
确认 student 用户可以在⽬录中创建⽂件。
[rootserverb ~]# su - student -c echo Hello World /share/test.txt
[rootserverb ~]# ls /share
test.txt确认 serverb 上的 root 用户⽆法写⼊到导出。
[rootserverb ~]# echo Hello World /share/root_test.txt
-bash: /share/root_test.txt: Permission denied实战
在 serverd 上创建要使⽤ NFS 导出的⽬录 /srv/operators。它应归用户 root 和 operators 所有。
组 operators 应具有读/写访问权限并且所有其他用户都不应具有访问权限⽬录应具有 setgid 权限集因此在该⽬录中创建的⽂件将⾃动归该组所有
服务端配置
[rootserverd ~]# mkdir /srv/operators
[rootserverd ~]# chgrp operators /srv/operators
[rootserverd ~]# chmod 2770 /srv/operators
[rootserverd ~]# ls -ld /srv/operators
drwxrws---. 2 root operators 6 Jul 6 22:19 /srv/operators
[rootserverd ~]#2设置目录的setgid权限。这意味着在该目录下创建的文件将自动继承该目录的所属组7表示设置目录的所有者权限为 rwx读、写、执行。7表示设置目录的所属组权限为 rwx读、写、执行。0表示设置目录的其他用户权限为无权限即没有读、写、执行的权限。
在 serverd 上根据以下要求使⽤ NFS 导出 /srv/operators ⽬录
只有 servera.lab.example.com 可以访问该共享servera 具有对共享的读/写访问权限由于⽂件权限和root squash 设置servera 上的 root 用户不能读取或写⼊该共享
安装工具包配置编写导出文件客户端主机名为 servera访问权限为 rw.
[rootserverd ~]# yum install nfs-utils
[rootserverd exports.d]# cat share.exports
/srv/operators servera.lab.example.com(rw)
[rootserverd exports.d]#配置开启自启动
[rootserverd exports.d]# systemctl enable nfs-server.service --now
Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service → /usr/lib/systemd/system/nfs-server.service.
[rootserverd exports.d]# firewall-cmd --permanent --add-servicenfs
success
[rootserverd exports.d]# firewall-cmd --reload
success
[rootserverd exports.d]#检索配置情况
[rootserverd exports.d]# exportfs -v
/srv/operators servera.lab.example.com(sync,wdelay,hide,no_subtree_check,secsys,rw,secure,root_squash,no_all_squash)
[rootserverd exports.d]#[rootserverd exports.d]# logout
Connection to serverd closed.
[rootservera ~]# mkdir /operators_data
[rootservera ~]# vim /etc/fstabserverd:/srv/operators nfs defaults 0 0[rootservera ~]# mount /operators_data
[rootservera ~]# df -h /operators_data
Filesystem Size Used Avail Use% Mounted on
serverd.lab.example.com:/srv/operators 10G 2.2G 7.9G 22% /operators_data
[rootservera ~]#
[rootservera ~]# cd /operators_data/
-bash: cd: /operators_data/: Permission denied
[rootservera ~]# su - operator1
[operator1servera ~]$ cd /operators_data/
[operator1servera operators_data]$配置 NFS 服务(服务端报错排故)
在servera配置NFS服务要求如下
以只读的方式共享目录/public同时只能被example.com域中的系统访问以读写的方式共享目录/protected能被example.com域中的系统访问目录/protected应该包含名为project拥有人为student的子目录用户student能以读写方式访问/protected/project
servera 上面配置 nfs 导出。创建对应的目录同时修改 project 的所有人为 student
[rootservera]
#-p, --parents
mkdir -p /public /protected/project
chown student /protected/project查看帮助文档exports 配置文件编写
# mandb man -k nfs | grep 5
# man exports
# vim /etc/exports需要注意读写权限
/public *.example.com(ro)
/protected *.example.com(rw)配置服务开机自启动开启队对应的防火墙
# systemctl list-unit-files | grep nfs
# systemctl enable --now nfs-server# firewall-cmd --permanent --add-servicenfs
# firewall-cmd --reload到这一步服务端已经配置完成可以通过 exportfs -v 查看配置信息
客户端操作
[rootserverb]
showmount -e servera用于显示远程主机servera上共享的文件系统。
客户端报错
# showmount -e servera
clnt_create: RPC: Unable to receive报错信息提示我们没办法获取RPC 的响应前面我们讲过nfs 客户端和服务端建立连接使用 RPC 协议的 rpcbind 服务传递端口映射所以我们需要放行 rpcbind 服务
所以需要在 servera 上面 做简单配置开发对应的防火墙通过 rpcinfo 命令可以查看当前机器的 rpcbind 服务这里我们需要放行 111 端口
[rootservera]
# rpcTabTab
# rpcinfoprogram version netid address service owner100000 4 tcp6 ::.0.111 portmapper superuser100005 3 tcp6 ::.78.80 mountd superuser
...输出省略...grep port.*mapper /etc/services
sunrpc 111/tcp portmapper rpcbind # RPC 4.0 portmapper TCP
sunrpc 111/udp portmapper rpcbind # RPC 4.0 portmapper UDP当然也可以通过服务的方式,防火墙开放 rpc-bind 服务相关端口
# firewall-cmd --permanent --add-servicerpc-bind
# firewall-cmd --reload[rootserverb ~]
开放之后回到客户机任然提示报错
# showmount -e servera
rpc mount export: RPC: Unable to receive; errno No route to host这是因为我们同时需要开放 mountd 服务,回到服务端添加 mountd 防火墙规则
mountd 是 NFSNetwork File System服务器上的一个守护进程它在 NFS 的挂载过程中起着关键的作用
处理挂载请求当客户端尝试挂载 NFS 共享时它会向服务器上的 mountd 发送挂载请求。mountd 负责接收和处理这些请求验证客户端的权限并确保客户端有权访问所请求的共享目录。导出共享目录mountd 通过导出export共享目录的方式将其可用于其他主机挂载。在服务器上配置的共享目录需要在 mountd 的管理下以便客户端能够访问和挂载这些共享。管理挂载点mountd 跟踪服务器上已经挂载的共享并提供有关挂载点的信息。这包括已经挂载的共享目录路径、客户端的 IP 地址等。挂载选项处理mountd 处理挂载选项如权限控制、访问控制列表ACL、并发访问控制等。它根据客户端请求中的选项参数按照事先配置的规则进行处理以确保挂载操作按照预期进行。 [rootservera]
# firewall-cmd --permanent --add-servicemountd
# firewall-cmd --reload[rootserverb ~]
# showmount -e servera
Export list for servera:
/protected *.example.com
/public *.example.com挂载一个 NFS 共享
在serverb上挂载一个来自servera的NFS共享并符合下列要求
/public挂载在下面的目录上/mnt/nfsmount/protected挂载在下面的目录上/mnt/nfssecure用户student能够在/mnt/nfssecure/project上创建文件这些文件系统在系统启动时自动挂载
[rootserverb]
# showmount -e servera
Export list for servera:
/protected *.example.com
/public *.example.com# mkdir /mnt/nfs{mount,secure}# man fstab
# vim /etc/fstab在 fstab 中编写挂载配置这里需要注意读写权限要和上面的匹配
...输出省略...
servera:/public /mnt/nfsmount nfs ro 0 0
servera:/protected /mnt/nfssecure nfs rw 0 0刷新配置
# mount –a确认挂载信息做读写测试
# df -h | grep nfs
servera:/public 10G 2.1G 7.9G 22% /mnt/nfsmount
servera:/protected 10G 2.1G 7.9G 22% /mnt/nfssecure# ls /mnt/nfsmount
# su - student -c touch /mnt/nfssecure/project/s.txtNFS 调优
NFS服务器端配置调优
增加NFS服务器的线程数和并发连接数以处理更多的客户端请求。可以通过增大rpc.mountd和rpc.nfsd的线程数配置参数来实现。
# NFS Server Configuration
RPCNFSDCOUNT16 # 设置 rpc.nfsd 的线程数为 16
RPCMOUNTDOPTS-N 8 # 设置 rpc.mountd 的线程数为 8调整 NFS 服务器的读写缓存大小以适应不同的工作负载。可以通过调整 rsize 和 wsize 参数来设置读写缓存的大小。
# NFS Client Configuration
rsize8192 # 设置读取缓存大小为 8 KB
wsize8192 # 设置写入缓存大小为 8 KB
nfsiodthreads8 # 设置 nfsiod 线程数为 8
actimeo300 # 设置客户端缓存的有效期为 300 秒启用服务器端的写缓存以提高写入性能。可以通过设置async或sync参数来配置写入策略。配置服务器端的文件句柄缓存File Handle Cache以加速文件句柄的查找和访问。可以通过调整acdirmin和acdirmax参数来设置文件句柄缓存的大小。
# NFS Server Configuration
RPCNFSDCOUNT16 # 设置 rpc.nfsd 的线程数为 16
RPCMOUNTDOPTS-N 8 # 设置 rpc.mountd 的线程数为 8# 启用服务器端的写缓存
RPCNFSDARGS-N 16 -H 256 # 设置 rpc.nfsd 的线程数为 16并设置文件句柄缓存的大小为 256# 配置文件句柄缓存的大小
MOUNTD_NFS_ARGS-F -n 8 -N 16 -H 256 # 设置 rpc.mountd 的线程数为 8文件句柄缓存的大小为 256NFS客户端配置调优
调整NFS客户端的读写缓存大小以适应不同的工作负载。可以通过调整rsize和wsize参数来设置读写缓存的大小。增加NFS客户端的并发连接数以提高并发性能。可以通过增大nfsiod线程数配置参数来实现。启用客户端的读写缓存以减少与服务器的交互次数。可以通过设置actimeo参数来配置缓存的有效期。调整NFS客户端的超时设置以适应网络延迟和可靠性需求。可以通过调整timeo和retrans参数来设置超时和重传次数。
网络配置调优
使用高速网络接口卡NIC和千兆以太网Gigabit Ethernet或更高的网络带宽以提高NFS的传输性能。配置合适的网络拓扑和路由以减少网络延迟和瓶颈。可以使用专用网络或VLAN来隔离NFS流量。调整NFS版本和传输协议以适应网络环境。例如使用NFSv4和TCP协议可以提供更好的性能和可靠性。
安全性和身份验证调优
配置合适的身份验证和授权机制以确保只有合法用户能够访问NFS共享。可以使用Kerberos身份验证来提供更安全的访问控制。启用NFSv4的安全特性如访问控制列表ACL和加密传输以保护数据的安全性和完整性。
博文部分内容参考
© 文中涉及参考链接内容版权归原作者所有如有侵权请告知 RH358 授课课堂笔记 © 2018-2023 liruilongergmail.com, All rights reserved. 保持署名-非商用-相同方式共享(CC BY-NC-SA 4.0)